2011-12-23 6 views
8

No se puede entender por el manual: ¿cómo realmente ejecutar la función JS desde Java?Cómo ejecutar la función de JavaScript desde GWT Java con JSNI?

Por ejemplo, tengo una función en mi página HTML:

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

El módulo siguiente muestra dos botones, sólo en segundo lugar de las que trabaja:

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(); 
}-*/; 
} 

Se dice en el manual, que funciones nativas implementadas dentro del marco anidado, que explica la situación. ¿Pero cómo ejecutar funciones JS entonces?

ACTUALIZACIÓN 1 El siguiente funciona.

Java:

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

JS:

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

¿Hay una mejor manera?

Respuesta

4

Respondió a su pregunta usted mismo. No hay mejor manera por una razón muy simple: hay varias formas de implementar la aplicación GWT, ejecutar iframe es solo una de las opciones. Entonces, es por eso que tiene que usar la variable $ wnd para acceder a la función JS externa, por lo que en caso de que cambie el enlazador, su código fijo funcionará bien.

+0

¿Puedes llamar a un método javascrypt que devuelve un objeto? y usar ese objeto? –

Cuestiones relacionadas