2013-04-16 4 views
10

Я не в состоянии использоватьИспользование JQuery в GWT JSNI

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

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

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

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

+0

Что такое весь код вашего метода jsni (тип возврата, параметры и т. Д.)? вы загружаете jquery.js в свой index.html? Вы получаете какую-либо ошибку, когда ваш код выполнен? – 2013-04-16 11:51:26

ответ

12

Три решения для этого вопроса:

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

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

Почему это «двойное» в методе JSNI и «int» в GQUERY и GWT ??? –

+0

Вариант 3 работает. Большое спасибо ... – javalearner

+0

У JS есть только один тип чисел, поэтому естественный способ вернуть число из jsni использует удвоение, иначе gwt должен иметь дело с кастингом (конечно, вы можете изменить подпись метода и вернуть int и оставить gwt делать кастинг). Gquery возвращает int, потому что это то, что 'getOffsetTop()' возвращается в GWT, и мы делегируем на нем вычисление элементов top –

0

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

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

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

И предполагает, что вы только начали использовать JQuery в GWT.

Я настоятельно предлагая легкий вес третьей стороной библиотеки

GWTQuery

+0

Спасибо за информацию. Я пытаюсь вернуть значение из функции jsni, как это. но я не могу его получить. 'Code'public статический родной INT getIFrameTop (String ProfileID)/* -... { \t \t $ WND $ (функция() { \t \t возвращение $ WND $ ("#" + ProfileID) .offset() верхняя \t \t}); \t} - * /; 'code' – javalearner

+0

обновите вопрос своим полным кодом, и вы уверены, что ваш контроль входит в JNSI? Проверьте, поставив предупреждение в первую строку –

+0

Ошибка @Baddshah: GWTQuery не оболочка jquery, gwtquery - это библиотека, полностью написанная в gwt. Вы связали его с gwt-jquery, который должен быть оберткой, основанной на информации о своей странице, потому что они не публикуют свой код (если только вы не расстегните банку вручную) –

1

Простой способ со скромной оценкой.

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

Тогда просто использовать сценарий

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

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

+0

Одна из недостатков этого подхода заключается в том, что вы не получаете никакого анализа IDE в содержимом строки, которую вы отправляете на eval. Таким образом, если у вас есть опечатка где-нибудь или вы вызываете неопределенное свойство, вы не будете знать до времени выполнения. – Ronald

+0

Вы правы, используется для использования с осторожностью. –