这个问题的三个解决方案:
1- 您的 Jsni 代码看起来不错,只是您必须将它包含在相应的本机函数中并返回一个双精度数(或任何其他数字类型,如果您希望 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、promise、选择器等),它们是不在 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();