通过ScriptInjector注入jQuery

时间:2013-11-23 15:55:16

标签: java jquery gwt

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

  

引起:com.google.gwt.core.client.JavaScriptException:   (TypeError):Object [object global]没有方法'$'at   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.dev.shell.ModuleSpace.invokeNativeVoid(ModuleSpace.java:289)     在   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<Void, Exception>() {
                @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();

可能是什么问题?

3 个答案:

答案 0 :(得分:4)

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

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

[EDITED]

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

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的目标是:

   - Use pure javascript files so as we can use IDEs for editing, formating etc,
     instead of dealing with code in comment blocks.
   - Facilitate writing and testing javascript in the browser before compiling it.
   - Include third-party javascript libraries without modification of the original source.
   - Not need of adding javascript tags in the html page or module file to include
     third-party javascript.
   - GWT compiler will get rid of any jsni fragment if the application does not use it.
   - Included javascript will take advantage of GWT jsni validators, obfuscators
     and optimizers.

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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