2011-12-23 7 views
8

Non riesco a capire dal manuale: come effettivamente eseguire la funzione JS da Java?Come eseguire la funzione JavaScript da GWT Java con JSNI?

Ad esempio, hanno una funzione nella mia pagina html:

<script type="text/javascript" language="javascript"> 
    function foo() { 
     alert('Foo!'); 
    } 
</script> 

La seguente modulo presenta due pulsanti, solo secondo dei quali lavora:

public class Test_GoogleWeb_JSNI_01 implements EntryPoint { 

public void onModuleLoad() { 

    Button fooButton = new Button("Foo!"); 
    fooButton.addClickHandler(new ClickHandler(){ 
     public void onClick(ClickEvent event) { 
      fooRunner(); 
     }; 
    }); 


    HTML fooButtonNative = new HTML(); 
    fooButtonNative.setHTML("<input type='button' value='Foo Native' onclick='foo()'>"); 

    RootPanel rootPanel = RootPanel.get(); 
    rootPanel.add(fooButton); 
    rootPanel.add(fooButtonNative); 

} 

public static native void fooRunner() /*-{ 
    foo(); 
}-*/; 
} 

Si dice in manuale, che funzioni native implementate nel frame annidato, che spiega la situazione. Ma come eseguire le funzioni JS?

UPDATE 1 I seguenti lavori.

Java:

public static native void fooRunner() /*-{ 
    $doc.fooRunner(); 
}-*/; 

JS:

<script type="text/javascript" language="javascript"> 
    document.fooRunner = function foo() { 
     alert('Foo!'); 
    } 
</script> 

C'è un modo migliore?

risposta

4

Hai risposto tu stesso alla tua domanda. Non esiste un modo migliore per una ragione molto semplice: esistono diversi modi per distribuire l'app GWT, l'esecuzione in iframe è solo una delle opzioni. Ecco perché è necessario utilizzare $ wnd variabile per accedere alla funzione JS esterna, quindi nel caso in cui si cambi il linker, il codice ancora funzionerà perfettamente.

+0

puoi chiamare un metodo javascrypt che restituisce un oggetto? e usa quell'oggetto? –