How to run JavaScript function from GWT Java with JSNI?

14,900

You answered your question yourself. There is no better way for a very simple reason: there are multiple ways to deploy GWT app, running in iframe is only one of the options. So that's why you have to use $wnd variable to access external JS function, so in case if you switch the linker , your still code will work just fine.

Share:
14,900
Dims
Author by

Dims

Software developer & Machine Learning engineer C/C++/Java/C#/Python/Mathematica/MATLAB/Kotlin/R/PHP/JavaScript/SQL/HTML/ LinkedIn: http://www.linkedin.com/in/dimskraft Telegram: https://t.me/dims12 I prefer fishing rod over fish.

Updated on June 26, 2022

Comments

  • Dims
    Dims almost 2 years

    Can't understand from the manual: how actually to run JS function from Java?

    For example, I have a function in my html page:

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

    The following module shows two buttons, only second of which works:

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

    It is said in manual, that native functions implemented within nested frame, which explains the situation. But how to run JS functions then?

    UPDATE 1 The following works.

    Java:

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

    JS:

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

    Is there a better way?

  • chelo_c
    chelo_c over 8 years
    can you call a javascrypt method that returns an object? and use that object?