Internet explorer GWT-IE不下载UiBinder中包含的外部脚本
我的GWT应用程序中有一些外部Javascript文件,我只想在用户访问需要它们的部分时下载这些文件。我将JS文件包括在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
<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,还有一些方法,我在两种浏览器中都下载了文件。但无论我用哪种方式,我的小部件现在似乎都无法识别外部脚本(请参阅问题的更新)。