Java 通过ScriptInjector注入jQuery

Java 通过ScriptInjector注入jQuery,java,jquery,gwt,Java,Jquery,Gwt,当尝试通过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.

当尝试通过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.invokenactive(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();
ScriptInjector.fromUrl(“http://ajax.googleapis.com/ajax/libs/jquery/1.8.1/jquery.min.js")
.setWindow(ScriptInjector.TOP_窗口).setCallback(新回调(){
@凌驾
成功时公开作废(作废arg0){
log(“加载jQuery库成功”);
ScriptInjector.fromUrl(“http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.23/jquery-ui.min.js).setWindow(ScriptInjector.TOP_WINDOW.injector();
}
@凌驾
公共void onFailure(异常arg0){
log(“未能加载jQuery库”);
}
}).inject();

可能是什么问题?

尝试在成功回调中加载jquery代码片段,即当jquery库结束加载时

尝试在成功回调中加载jquery代码片段,即jquery库结束加载时

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

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

[已编辑]

我最近在gQuery(1.4.0-SNAPSHOT)中添加了一个新功能,用于将外部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. -使用纯javascript文件,以便我们可以使用IDE进行编辑、格式化等, 而不是在注释块中处理代码。 -在编译javascript之前,方便在浏览器中编写和测试javascript。 -包括第三方javascript库,而不修改原始源代码。 -不需要在html页面或模块文件中添加javascript标记来包括 第三方javascript。 -如果应用程序不使用任何jsni片段,GWT编译器将删除它。 -包含的javascript将利用GWT jsni验证器和模糊器 和优化器。
使用
ScriptInjector.fromUrl()
加载外部javascript文件是异步执行的,因此您可能试图在加载jQuery之前调用
$wnd.$
。延迟通话或使用
onSuccess
继续应用程序的工作流程

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

[已编辑]

我最近在gQuery(1.4.0-SNAPSHOT)中添加了一个新功能,用于将外部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. -使用纯javascript文件,以便我们可以使用IDE进行编辑、格式化等, 而不是在注释块中处理代码。 -在编译javascript之前,方便在浏览器中编写和测试javascript。 -包括第三方javascript库,而不修改原始源代码。 -不需要在html页面或模块文件中添加javascript标记来包括 第三方javascript。 -如果应用程序不使用任何jsni片段,GWT编译器将删除它。 -包含的javascript将利用GWT jsni验证器和模糊器 和优化器。
正确的语法是使用$wnd.jQuery而不是$wnd.$
我认为这与在gwt iframe中保留$有关。

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

您好,我使用GwtQuery;-)但是对于一些特定的基于jquery的JS库,我需要包括这一点。如果您使用gQuery,您可能会对
JsniBundle
感兴趣。看看我编辑过的评论。如何使用JsniBundle注入位于/clien/resources/js/some.js中的js?它在编译时会出现在类的文件夹中,因此您必须使用
。/
,直到您获得带有js的文件夹。Hi Manolo I use GwtQuery;-)但是对于一些特定的基于jquery的JS库,我需要包括这一点。如果您使用gQuery,您可能会对
JsniBundle
感兴趣。看看我编辑过的评论。如何使用JsniBundle注入位于/clien/resources/js/some.js中的js?它在编译时会出现在类的文件夹中,因此您必须使用
。/
,直到获得包含js的文件夹。$wnd。$在将jQuery插入HTML而不是通过ScriptInjector@xybrek,我同意,但是问题特别提到了ScriptInjector,所以如果我使用ScriptInjector,那么我应该使用$wnd.jQuery吗+由于setWindow(WINDOW)的原因,ScriptInjector在$wnd上下文中注入jQuery,除此之外,它还可以作为$wnd使用