Ответ 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();