#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);
}
}