当我加载使用该脚本的某个组件时,我想要将一些JavaScript注入到DOM中。该组件存在于我的应用程序中的几个位置,因此用户在会话中多次加载该组件是合理的。有没有办法阻止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
答案 0 :(得分:2)
好吧,如果你没有这样的“重手”行,ScriptInjector
本身就需要。
其他选项 - 保留已加载的所有JS文件的列表 - 永远不会删除其<script>
标记。也绝不会意外地从不同的域,不同的协议,代码的另一部分中的不同版本加载相同的东西......
但是ScriptInjector
意味着足以从字符串或URL中注入任何脚本。如果你计划重复使用这样的工具,你可以自己包装。
另一个想法:将ScriptInjector
调用放在需要它的类中的类初始化程序块中 - 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);
}
}