在GWT jsni中使用jquery

我无法使用

$("#"+profileId).offset().top 

从我的gwt jsni函数里面。 我试过这个

 $wnd.$("#"+profileId).offset().top 

但这也行不通。 我觉得我在这里缺少语法。 有人可以帮忙吗?

这个问题的三个解决方案:

1-你的Jsni代码看起来很好,除了你必须将它包含在相应的本机函数中并返回一个double(或任何其他数字类型,如果你想让gwt进行转换)。

  native double getTop(String profileId) /*-{ return $wnd.$("#" + profileId).offset().top; }-*/; 

如果你想通过UncaughExceptionHandler看到错误,你应该将你的代码包装在$entry块中

 native double getTop(String profileId) /*-{ return $entry(function(data) { return $wnd.$("#" + profileId).offset().top; }); }-*/; 

2-但是,我鼓励你使用gwt-query aka gQuery,而不是使用jQuery。 所以你不必在你的.html中加载jQuery,你不需要在你的应用程序中处理jsni。

使用gQquery,你有几乎相同的jQuery语法,但在java中,所以你有类型安全,重构,测试….但是,你将有许多实用程序(最简单的ajax,promises,selectors等)不在gwt核心。

gQuery是一个轻量级的库,在gwt中从头开始完全重写。 它不是jQuery库的包装器(就像在另一个答案中错误地说的那样),你不必在你的页面中包含jquery.js。

与任何其他gwt库一样,gwt编译器可以从gquery中删除任何你不使用的东西。 在您的方法中,您的应用程序必须加载所有jquery的东西。

所以在你的情况下,使用gquery在.java类中编写这段代码:

 import static com.google.gwt.query.client.GQuery.*; ... onModuleLoad() { int top = $("#"+profileId).offset().top; } 

3-最后,如果你知道它的id,你可以选择使用纯gwt代码来获取元素的偏移量:

 int top = DOM.getElementById(profileId).getOffsetTop(); 

一个简单的方法是谦虚的评估。

 public static native void eval(String toEval)/*-{ return $wnd.eval(toEval); }-*/; 

然后只需使用您的脚本

 eval("$('#'" + profileId + ").offset().top" ); 

因为在你的GWT代码中调用,你可以认为它是一个安全的代码。

我假设您在主页中添加了jquery库

正确的语法是

 private native int myJquery() /*-{ $wnd.$(function() { //may be you forgot this line return $wnd.$("#"+profileId).offset().top; }); }-*/; 

假设你刚开始在GWT使用jquery。

我强烈建议一个轻量级的第三方库

GWTQuery