我的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。
答案 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();