java - 如何使用 GWT ScriptInjector 仅注入(inject)一次脚本?

标签 java gwt javascript-injection

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

相关文章:

javascript - 为什么 HTML 数据列表的选项标签不起作用

java - Java 中的后自增 (i++) 和预自增 (++i) 运算符如何工作?

java - 根据 GXT 中另一个下拉列表的选择填充下拉列表

python - 调试睡衣python代码

javascript - 注入(inject) Javascript 函数的正确语法

javascript - execCommand ('copy' ) 无法以编程方式工作,仅当通过 DevTools 控制台执行时

java - Logger 只打印日志消息,不打印异常

java - 来自 OAuth 的回调不调用 onResume()

Java do-while 循环打印菜单 3 次而不是一次

css - GWT:具有固定列大小的 Flextable