通过ScriptInjector注入jQuery

当试图通过ScriptInjector注入jQuery时,这是通过JSNI调用$wnd.$时抛出的错误:

引起:com.google.gwt.core.client.JavaScriptException:(TypeError):对象[object global]在com.google.gwt.dev.shell.BrowserChannelServer.invokeJavascript(BrowserChannelServer.java:248)中没有方法’$’ )com.google.gwt.dev.shell.ModuleSpaceOOPHM.doInvoke(ModuleSpaceOOPHM.java:136)com.google.gwt.dev.shell.ModuleSpace.invokeNative(ModuleSpace.java:561)com.google.gwt上的com.google.gwt.dev.shell.ModuleSpaceOOPHM.doInvoke(ModuleSpaceOOPHM.java:136)。 dev.shell.ModuleSpace.invokeNativeVoid(ModuleSpace.java:289)at com.google.gwt.dev.shell.JavaScriptHost.invokeNativeVoid(JavaScriptHost.java:107)

这是注入jQuery的代码:

 ScriptInjector.fromUrl("http://ajax.googleapis.com/ajax/libs/jquery/1.8.1/jquery.min.js") .setWindow(ScriptInjector.TOP_WINDOW).setCallback(new Callback() { @Override public void onSuccess(Void arg0) { GWT.log("Success to load jQuery library"); ScriptInjector.fromUrl("http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.23/jquery-ui.min.js").setWindow(ScriptInjector.TOP_WINDOW).inject(); } @Override public void onFailure(Exception arg0) { GWT.log("Failed to load jQuery library"); } }).inject(); 

可能是什么问题呢?

使用ScriptInjector.fromUrl()加载外部javascript文件是异步执行的,因此可能是在加载jQuery之前尝试调用$wnd.$ 。 延迟通话或使用onSuccess继续应用的工作流程。

顺便说一句,如果你有兴趣在你的应用程序中使用jquery-ui,你可以看看Gwtquery-ui插件,它自动加载javascript依赖项,它不是一个纯粹的gQuery插件,依赖于jQuery和jQuery- ui,但它与gwt和gQuery有很好的集成。

[EDITED]

我最近添加到gQuery(1.4.0-SNAPSHOT)的一个新function是用于将外部javascript包含为JSNI块的JsniBundle :

 public interface JQuery extends JsniBundle { @LibrarySource("http://ajax.googleapis.com/ajax/libs/jquery/1.8.1/jquery.min.js") // You can use javascript files placed in your source tree as well // @LibrarySource("jquery.js") public void load(); } // Generate the Bundle implementation JQuery jQuery = GWT.create(JQuery.class); // Load the third-party library jQuery.load(); 

使用JsniBundle的目标是:

    - 使用纯JavaScript文件,以便我们可以使用IDE进行编辑,格式化等,
     而不是处理注释块中的代码。
    - 在编译之前,便于在浏览器中编写和测试javascript。
    - 包括第三方JavaScript库而不修改原始源。
    - 不需要在html页面或模块文件中添加javascript标签来包含
     第三方javascript。
    - 如果应用程序不使用它,GWT编译器将删除任何jsni片段。
    - 包含的javascript将利用GWT jsnivalidation器,混淆器
     和优化者。

正确的语法是使用$ wnd.jQuery而不是$ wnd。$我认为它与gwt iframe中保留的$有关。

尝试在成功回调中加载jquery代码段代码,也就是说,当jquery lib结束加载时。