通过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结束加载时。