Являются ли Java-апплеты неспособными общаться с javascript в Firefox на Mac OS?
У меня есть Java-апплет, запущенный в браузере, который вызывает некоторые функции javascript и ожидает результата от функций тезисов. Это работает со следующими конфигурациями:
- Internet Explorer
- FireFox/Windows
- Safari/Mac
НО Это не работает с Firefox в MAC OS
Источником проблемы являются вызовы win.eval, которые всегда возвращают null.
Я протестировал это с помощью Firefox 3.0.6 на Mac OS X 10.4.11
Немного кода:
JSObject win = (JSObject) JSObject.getWindow(this);
Object exp = win.eval("testfunc()");
System.out.println("exp = " + exp.toString());
Это вызывает оператор java.lang.NullPointerException(exp.toString())).
Функция javascript testfunc возвращает true.
Я попытался с win.call и получил тот же результат.
Мой тег applet включает атрибуты mayscript и scriptable.
Я нашел ответ благодаря Тристану. Испытывая его решение, я создал действительно простой тест, который мог бы работать и работал мой путь, чтобы найти виновника. Я был уверен, что сделал свои тесты с пустым testfunc(), который только что вернул true, но я, вероятно, не сделал этого, потому что в этом случае он работает.
Реальная проблема здесь заключалась в том, что функция называется общедоступным методом апплета. Liveconnect, похоже, не в состоянии справиться с этим делом в Firefox Mac.
Позвольте мне привести пример:
Класс Java:
public class MyApplet extends Applet {
public int getMyValue() {
return 5;
}
public void somefunction() {
JSObject win = (JSObject) JSObject.getWindow(this);
Object exp = win.eval("jsfunc()");
System.out.println("exp = " + exp.toString());
}
}
И код javascript:
function jsfunc() {
var myApplet = document.getElementById("applet_id");
return myApplet.getMyValue() + 5;
}
exp будет null в некоторой функции BECAUSE jsfunc вызывает метод getMyValue() апплета. Если вы удалите все обращения к свойствам апплета, вы круто.
Чтобы решить мою проблему, я решил дать все значения апплета, которые я использовал в качестве параметров моей функции javascript, и теперь я в порядке.
Это может быть не всегда, если javascript изменяет состояние апплета... Мне повезло:)
Ответы
Ответ 1
Будет ли он работать через доступ к одному из глобальных объектов на экране? Следовательно,
В JavaScript:
window.testfunc = function() { //... }
В Applet:
win.eval("window.testfunc()") // or maybe just win.eval("testfunc()")
Это будет мой эксперимент. Но я вызывал "window.close()" в FF на Mac OS X, и это все еще работает.
Ответ 2
Я не использовал апплет api через некоторое время, но если я правильно помню, чтобы Apple JS-код мог использовать JS-код, вы должны включить атрибут mayscript в теге апплета или файл-максрипт в ноте тега объекта.
Для связи другим способом JS с Applet вы также должны использовать атрибут или параметр скрипта, например:
<applet code="..." mayscript="true" />
Это позволяет апплетам использовать функции script.
<applet code="..." scriptable="true" />
Ответ 3
Если вы удалите все обращения к свойствам апплета, вы круто.
Это может произойти и в других ситуациях. Я нашел эту страницу после того, как Google похож на проблему, поэтому я решил добавить datapoint. Единственное различие заключается в том, что я использовал win.call(), а не win.eval().
У меня был звонок alert() в JavaScript, чтобы убедиться, что звонок прошел, и увидел, что похоже на то же самое блокирование на Firefox 3.0.9, OS X 10.5.6, Java 1.5.0_16. 100% повторяемость с Firefox, никаких проблем с Safari (у меня нет установленной Windows в этом поле).
Когда я избавился от предупреждения() и просто вернул значение, проблема исчезла.
Sooooo... может быть, вызовет время ожидания JavaScript через некоторое время и просто бросит нуль?