8

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?

0

1 Answer 1

4

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.

Sign up to request clarification or add additional context in comments.

1 Comment

can you call a javascrypt method that returns an object? and use that object?

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.