2017-08-31 29 views
0

我有一些JavaScript,我想注入DOM,当我加载使用该脚本有一定分量。该组件在应用的过程中一些地方存在的,但这样是合理的用户到组件多次加载一个会话。有没有办法阻止ScriptInjector多次加载相同的脚本?如何使用GWT 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

回答

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