0

我的 GWT 应用程序中有一些外部 Javascript 文件,我只想在用户访问需要它们的部分时下载这些文件。我将 JS 文件包含在 UiBinder 页面中,如下所示:

<g:HTMLPanel>
    <script src="blah.js"/>
</g:HTMLPanel>

加载视图后不一定会立即下载文件,因此当我加载视图时,我会检查是否存在异常,指示无法访问外部代码并重试,直到可以创建视图而不会出现异常。

这适用于 Firefox,但不适用于 IE7/IE8。我使用 AJAX 版来跟踪 IE 中发生的事情,并请求了该文件,但它没有下载任何内容,大小为 0。Web 服务器访问日志没有显示该文件被请求。

知道发生了什么吗?

还是有更好的方法来做到这一点?到目前为止,我所做的调查并没有表明 GWT 有一种方便的方法来做到这一点。

更新:

虽然我们还没有使用 2.4,但为了尝试,我复制了 ScriptInjector 所需的源文件,并尝试按照 Thomas 的建议使用它。JS 文件在两个浏览器中都正确下载,但我收到“$wnd.xxxx 未定义”异常,表明无法找到外部脚本中的引用。在 onSuccess() 调用从脚本注入返回之前,我不会尝试加载我的小部件 - 所以我的代码看起来像这样:

ScriptInjector.fromUrl("../xxxx.js").setCallback( 
      new Callback<Void, Exception>() { 
         public void onFailure(Exception reason) { 
           Window.alert("Script load failed."); 
         } 
         public void onSuccess(Void result) { 
           Window.alert("Script load success."); 
           MyWidget widget = new MyWidget(); 
           client.onSuccess(widget); // adds the widget to the view 
         } 
      }).inject(); 

我也没有看到在 Firebug 中添加到 DOM 的 JS 文件引用,但我想知道这是否是因为它们被添加到页面的 GWT 部分的 DOM,而不是实际的 index.jsp。

4

2 回答 2

1

innerHTML使用(这是使用)插入的脚本元素HTMLPanel不会被执行。

您必须使用ScriptInjector动态将脚本注入您的页面。

于 2011-11-10T11:49:32.553 回答
1

您需要告诉 ScriptInjector 将脚本添加到顶层窗口。

ScriptInjector.fromUrl(scriptUrl)
    .setWindow(ScriptInjector.TOP_WINDOW)
    .setCallback(new Callback<Void, Exception>() {
        @Override
        public void onSuccess(Void result) {
            //script loaded OK
        }

        @Override
        public void onFailure(Exception reason) {
            //TODO script injection failed
        }
    }).inject();
于 2011-12-27T08:45:18.313 回答