【问题标题】:Use jquery inside GWT jsni在 GWT jsni 中使用 jquery
【发布时间】:2013-04-16 06:22:26
【问题描述】:

我无法使用

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

来自我的 gwt jsni 函数。我试过这个

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

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

【问题讨论】:

  • 你的 jsni 方法的全部代码是什么(返回类型、参数等)?你在 index.html 中加载 jquery.js 吗?执行代码时是否出现错误?

标签: jquery gwt jsni gwtquery


【解决方案1】:

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

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();

【讨论】:

  • JS 只有一种数字类型,所以从 jsni 返回数字的自然方法是使用双精度数,否则 gwt 必须处理强制转换(当然您可以更改方法签名并返回int 并让 gwt 进行强制转换)。 Gquery 返回一个 int,因为它是 getOffsetTop() 在 GWT 中返回的,我们委托它来计算元素的顶部
  • 这是$entry 块上的语法错误吗?你似乎没有关闭函数包装。
【解决方案2】:

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

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

那就用你的脚本

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

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

【讨论】:

  • 这种方法的一个缺点是您在发送给 eval 的字符串的内容中没有得到任何 IDE 分析。这样一来,如果您在某处出现拼写错误,或者正在调用未定义的属性,则要到运行时才能知道。
【解决方案3】:

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

正确的语法是

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

假设您刚刚开始在 GWT 中使用 jquery。

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

GWTQuery

【讨论】:

  • 感谢您的信息。我正在尝试像这样从 jsni 函数返回值。但我无法得到它。 codepublic static native int getIFrameTop(String profileId)/*-{ $wnd.$(function() { return $wnd.$("#"+profileId).offset().top }); }-*/;code
  • 用你的完整代码更新问题,你确定你的控制进入了 JNSI 内部吗??通过在第一行添加警报来检查
  • @Baddshah 错误:GWTQuery 不是 jquery 的包装器,gwtquery 是一个完全用 gwt 编写的库。您已将它链接到 gwt-jquery,它应该是基于其页面信息的包装器,因为他们不发布他们的代码(除非您手动解压缩 jar)
  • @Baddshah:除了引发错误之外,您的 jsni 代码什么都不做。 jquery 中的offset().top 是一个属性,所以我猜用户想要获取这个值,基于传递的profileId。看我的回答。
  • @Manolo Haaaah...先生,我想为自己放错链接而自责。它的 Gquery 不是 Gwt jquery。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多