11

我无法使用

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

从我的 gwt jsni 函数内部。我试过这个

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

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

4

3 回答 3

13

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

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();
于 2013-04-16T07:05:23.773 回答
1

一个简单的方法是使用谦虚的 eval。

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

然后只需使用您的脚本

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

并且因为在您的 GWT 代码中被调用,您可以将其视为安全代码。

于 2015-03-13T20:26:31.603 回答
0

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

正确的语法是

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

假设您刚刚开始在GWT.

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

GWT查询

于 2013-04-16T06:33:26.240 回答