我试图将一些 jquery 函数包装到 GWT,在 js 代码下运行,大小为 2。
var html="<div><p>paragraph</p><div>second</div></div>";
var size=$(html).get(0).children.length;
alert(size);
但在 GWT 代码下运行
select(html).get(0).getChildCount();
只需返回0,select
函数如下:
public class JQuery extends JavaScriptObject {
protected JQuery() {
}
public static final native JQuery select(String selector) /*-{
return $wnd.jQuery(selector);
}-*/;
public final native Element get(int index) /*-{
return this.get(index) || null;
}-*/;
}
我想知道为什么它只是从 JSNI 方法中丢失了子元素,以及这种包装的正确方法是什么,让它的行为与原生 jquery 完全相同?
谢谢。
- - - - - - -编辑 - - - - - - - - - - - - - - - - - - ----------------------
我在一个真正的 gwt 项目中测试了上面的 JSNI 代码,它工作正常,子元素从 js 返回到 java。但在 GwtTestCase 中存在问题。
public class JQueryTest extends GWTTestCase {
@Override
public String getModuleName() {
return "com.jsnitest.JsniTest";
}
public void testSelectHtml() {
ScriptInjector.fromUrl("http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js").setWindow(
ScriptInjector.TOP_WINDOW).setCallback(new Callback<Void, Exception>() {
@Override
public void onFailure(Exception reason) {
}
@Override
public void onSuccess(Void result) {
int childCount = select("<div><p>paragraph</p><div>second</div><ul></ul></div>").get(0).getChildCount();
//Fail! childCount=0
assertEquals(3, childCount);
}
}).inject();
}
}