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

Internet explorer GWT-IE不下载UiBinder中包含的外部脚本,internet-explorer,gwt,uibinder,external-script,Internet Explorer,Gwt,Uibinder,External Script,我的GWT应用程序中有一些外部Javascript文件,我只想在用户访问需要它们的部分时下载这些文件。我将JS文件包括在UiBinder页面中,如下所示: <g:HTMLPanel> <script src="blah.js"/> </g:HTMLPanel> 文件不一定会在加载视图后立即下载,因此在加载视图时,我会检查是否存在异常,表明无法访问外部代码,然后重试,直到可以在没有异常的情况下创建视图为止 这在Firefox中有效,但在IE7/IE

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

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

文件不一定会在加载视图后立即下载,因此在加载视图时,我会检查是否存在异常,表明无法访问外部代码,然后重试,直到可以在没有异常的情况下创建视图为止

这在Firefox中有效,但在IE7/IE8中不起作用。我使用AJAX Edition跟踪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(); 
ScriptInjector.fromUrl(“../xxxx.js”).setCallback(
新回调函数({
失败时公共无效(异常原因){
警告(“脚本加载失败”);
} 
成功时公开作废(作废结果){
警告(“脚本加载成功”);
MyWidget widget=新建MyWidget();
client.onSuccess(widget);//将小部件添加到视图中
} 
}).inject();

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

使用
innerHTML
插入的脚本元素(这是
HTMLPanel
使用的)没有被执行


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

您需要告诉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();
ScriptInjector.fromUrl(scriptUrl)
.setWindow(ScriptInjector.TOP_窗口)
.setCallback(新回调(){
@凌驾
成功时公开作废(作废结果){
//脚本加载正常
}
@凌驾
公共失效失效失效(异常原因){
//TODO脚本注入失败
}
}).inject();

看起来GWT正在完成它的工作并获得请求的脚本,但IE或您的服务器没有下载它。GWT没有任何功能来确保DOM被正确解释,因此我认为您必须在GWT之外寻找这个功能。所谓“外部”是指它们不在您的应用程序中托管吗?例如,像谷歌托管的jQuery?它托管在应用程序中,我的意思是我没有编写它,也没有维护它。ScriptInjector还不是一个选项,我们还没有达到2.4。这为我指明了一个有用的方向,我查找了一些关于innerHTML怪癖的信息,看起来可能有一两个我可以尝试的方法。我尝试了ScriptInjector,还有一些方法,我在两种浏览器中都下载了文件。但无论我用哪种方式,我的小部件现在似乎都无法识别外部脚本(请参阅问题的更新)。