当我加载使用该脚本的某个组件时,我想将一些 JavaScript 注入(inject)到 DOM 中。不过,该组件存在于我的应用程序中的几个位置,因此用户在 session 中多次加载该组件是合理的。有没有办法防止 ScriptInjector 多次加载同一个脚本?
重要的性能问题:如果我已经加载了脚本,在同一脚本上调用inject()是否会导致浏览器再次下载它,或者它是否意识到它已经拥有该脚本?
我知道我可以创建一些全局变量,例如 FANCY_JS_SCRIPT_LOADED = false;
,然后在回调的 onSuccess 中,调用类似 FANCY_JS_SCRIPT_LOADED = true;
但这似乎真的,真的……很严厉。
文档: http://www.gwtproject.org/javadoc/latest/com/google/gwt/core/client/ScriptInjector.html
最佳答案
好吧,如果你没有这样的“严厉”路线,ScriptInjector
本身需要。
其他选项 - 保留所有已加载的 JS 文件的列表 - 并且永远不会删除它们的 <script>
标签。也永远不要意外地从代码的另一部分中的不同域、不同协议(protocol)、不同版本加载相同的内容...
但是ScriptInjector
足以从字符串或 URL 注入(inject)任何脚本。如果您计划重复使用这样的工具,您可以自己包装它。
另一个想法:把 ScriptInjector
在需要它的类中的类初始值设定项 block 中调用 - GWT 将安全地对其进行编译,以便它仅运行一次,无论创建该类的多少个实例。不过,这将使设置回调变得困难,具体取决于您使用 JS 文件的方式。
在这种情况下,你确实想要一些自定义的东西 - 就像(在我还没有运行的几乎正确的伪代码中):
private static boolean fancyJsLoaded = false;
public static void loadFancyScript(Callback<Void, Exception> callback) {
if (fancyJsLoaded) {
callback.onSuccess();
} else {
fancyJsLoaded = true;
ScriptInjector.fromUrl("path/to/file.js").setCallback(callback);
}
}
关于java - 如何使用 GWT ScriptInjector 仅注入(inject)一次脚本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45989227/