Использовать jquery внутри GWT jsni

Я не могу использовать

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

из моей функции gwt jsni. Я попробовал это

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

но это также не работает. Я чувствую, что здесь отсутствует синтаксис. Кто-нибудь может помочь

Ответ 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 Но вместо использования jQuery, я рекомендую вам использовать gwt-query aka gQuery. Поэтому вам не нужно загружать jQuery в ваш .html, и вам не нужно иметь дело с jsni в вашем приложении.

С gQquery у вас почти такой же синтаксис jQuery, но в java, поэтому у вас есть тип безопасного, рефакторинга, тестирования... Но также у вас будут десятки утилит (простейший ajax, promises, селектор и т.д.), которые не находятся в ядре 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 Наконец, у вас есть возможность использовать чистый код gwt для получения смещения элемента, если вы знаете его id:

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

Ответ 2

Легкий способ - с скромной оценкой.

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

Затем просто используйте script

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

И поскольку он вызван внутри вашего кода GWT, вы можете считать его своим кодом как безопасным.

Ответ 3

Я предполагаю, что вы добавили библиотеку jquery на странице хоста.

Правильный синтаксис

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

И если вы только начали использовать jquery в GWT.

Я настоятельно предлагаю небольшую стороннюю библиотеку

GWTQuery