Вызов внешнего JavaScript, расположенного внутри iframe, из кода Java с использованием jsni

#javascript #java #iframe #gwt #jsni

#javascript #java #iframe #gwt #jsni

Вопрос:

Я пытаюсь вызвать метод JavaScript из Java, используя следующий код

 native void notifyJs() /*-{
    $wnd.foo();
}-*/;
 

Метод JavaScript расположен внутри iframe и выглядит следующим образом

 function foo() {
    alert("Do something");
}
 

Но я получаю эту ошибку

 SEVERE: (TypeError) : $wnd.foo is not a functioncom.google.gwt.core.client.JavaScriptException: (TypeError) : $wnd.foo is not a function
 

Я читал, что я должен добавить MyScript раньше .nocache.js , но я не могу этого сделать в моем случае. Есть ли какое-либо другое решение?

Комментарии:

1. Опубликуйте пример кода, который я могу выполнить и воспроизвести проблему, невозможно найти проблему в этих 3-строчных разделах кода. Смотрите — sscce.org

Ответ №1:

Я решил проблему, заменив $wnd на $wnd.frames[0] . Поскольку функция foo находится внутри этого фрейма.

Комментарии:

1. Теперь вы должны принять свой ответ (вместо этого, если добавить «решаемый» в заголовок)

Ответ №2:

В сообщении об ошибке четко указано, в чем ваша проблема:
foo в области видимости отсутствует функция $wnd .

$wnd ссылается на родительский элемент iframe, в котором выполняется ваш код GWT, поэтому, если вы поместите свой foo метод внутри iframe, он не может быть найден.
Попробуйте поместить свой foo метод в свой *.html-файл, где .nocache.js вызывается.

Ссылаясь на вашу проблему, что вы добавляете свой javascript после .nocache.js :
у меня тоже была такая же проблема, и я исправил ее с помощью таймера, который ждет, пока загрузится Js.

 private native boolean isLoaded()/*-{
    if (typeof $wnd.foo != 'undefined') {
        return true;
    }
    return false;
}-*/;

private void tryNotifyJs() {
    if (isLoaded()) {
        notifyJs();
    } else {
        Scheduler.get().scheduleFixedDelay(new RepeatingCommand() {

            @Override
            public boolean execute() {
                tryNotifyJs();
                return false;
            }
        }, 100);
    }
}