2013-04-16 9 views
10

io non sono in grado di utilizzareutilizzare jQuery all'interno GWT JSNI

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

da dentro la mia funzione di GWT JSNI. Ho provato questo

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

ma anche questo non funziona. Sento che mi manca la sintassi qui. Qualcuno potrebbe aiutare

+0

qual è l'intero codice del metodo jsni (tipo di ritorno, parametri ecc.)? stai caricando jquery.js nel tuo index.html? Ricevi qualche errore quando il tuo codice viene eseguito? –

risposta

12

tre soluzioni per questa domanda:

1- Il codice JSNI guarda bene, tranne che bisogna racchiuderlo tra il corrispondente funzione nativa e restituisce un doppio (o qualsiasi altro tipo di numero se vuoi che gwt effettui il casting).

native double getTop(String profileId) /*-{ 
    return $wnd.$("#" + profileId).offset().top; 
}-*/; 

Se si voleva vedere gli errori attraverso il vostro UncaughExceptionHandler si dovrebbe avvolgere il codice in un blocco $entry

native double getTop(String profileId) /*-{ 
    return $entry(function(data) { 
    return $wnd.$("#" + profileId).offset().top; 
    }); 
}-*/; 

2- Ma, invece di usare jQuery, vi incoraggio a utilizzare gwt-query aka gQuery. Quindi non devi caricare jQuery nel tuo .html e non hai bisogno di gestire jsni nella tua app.

Con gQquery hai quasi la stessa sintassi jQuery ma in java, quindi hai digitato sicuro, refactoring, test .... Ma inoltre, avrai dozzine di utilità (ajax, promesse, selettori, ecc. non sono nel nucleo del gwt.

gQuery è una libreria leggera, completamente riscritta da zero in gwt. NON è un wrapper della libreria jQuery (come è erroneamente detto nell'altra risposta), non devi includere jquery.js nelle tue pagine.

Come con qualsiasi altra libreria gwt, il compilatore gwt eliminerebbe tutto ciò che non si usa da gquery. Nel tuo approccio, la tua app deve caricare tutte le cose jquery.

Quindi nel tuo caso, e l'utilizzo di gquery scrivere questo codice nelle classi .java:

import static com.google.gwt.query.client.GQuery.*; 
... onModuleLoad() { 
    int top = $("#"+profileId).offset().top; 
} 

3- Infine, si ha la possibilità di utilizzare il codice GWT puro per ottenere l'offset di un elemento, se si conosce il suo ID:

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

Perché è "doppio" nel metodo JSNI e "int" in GQUERY e GWT ??? –

+0

L'opzione 3 funziona ... Grazie mille ... – javalearner

+0

JS ha solo un tipo per i numeri, quindi il modo naturale per restituire un numero da un jsni è il doppio, altrimenti gwt deve occuparsi del casting (ovviamente puoi cambia la firma del metodo e restituisci un int e lascia che gwt faccia il casting). Gquery restituisce un int perché è ciò che 'getOffsetTop()' restituisce in GWT e noi deleghiamo su di esso il calcolo degli elementi 'top –

0

Suppongo che tu abbia aggiunto la libreria jquery nella tua pagina host.

La sintassi corretta è

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

e supponendo che hai appena iniziato a utilizzare jQuery in GWT.

Sono fortemente suggerendo una libreria leggera terzi

GWTQuery

+0

Grazie per le informazioni. Sto cercando di restituire il valore dalla funzione jsni come questo. ma non sono in grado di ottenerlo. 'Code'public static native int getIFrameTop (String ProfileId)/* -... { \t \t $ WND $ (function() { \t \t ritorno $ WND $ ("#" + ProfileId) .Offset() in alto \t \t}); \t} - * /; 'codice' – javalearner

+0

aggiorna la domanda con il tuo codice completo e sei sicuro che il tuo controllo entrando in JNSI? Verifica con mettendo un avviso in prima linea –

+0

@Baddshah errore: GWTQuery non è un wrapper di jquery, gwtquery è una libreria interamente scritta in gwt. Lo hai collegato a gwt-jquery che dovrebbe essere un wrapper basato sulle informazioni della pagina, perché non pubblicano il loro codice (a meno di non decomprimere il vaso a mano) –

1

un modo semplice è con un umile eval.

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

poi basta usare lo script

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

E perché si chiama all'interno del vostro codice di GWT si può considerare il codice come una cassetta di sicurezza.

+0

Uno svantaggio di questo approccio è che non si ottiene alcuna analisi IDE all'interno del contenuto della stringa che si sta inviando a eval. In questo modo, se hai un errore di battitura da qualche parte, o stai chiamando una proprietà non definita, non lo saprai fino al runtime. – Ronald

+0

Hai ragione, va usato con cautela. –