GWT - IE不下载UiBinder中包含的外部脚本

时间:2011-11-09 20:14:21

标签: internet-explorer gwt uibinder external-script

我的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 is undefined'异常,表明无法找到外部脚本中的引用。我不尝试加载我的小部件,直到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。

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分: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();