如何使用GWT ScriptInjector只注入一次脚本?

时间:2017-08-31 20:02:24

标签: java gwt javascript-injection

当我加载使用该脚本的某个组件时,我想要将一些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

1 个答案:

答案 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);
  }
}