У меня есть java-апплет, работающий в браузере, который вызывает некоторые функции javascript и ожидает результата от этих функций. Это работает со следующими конфигурациями:
- Интернет-проводник
- Фаерфокс/Виндовс
- Сафари/Мак
НО он не работает с 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 и получил тот же результат.
Мой тег апплета включает в себя атрибуты 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 будет нулевым в какой-либо функции, ПОТОМУ ЧТО jsfunc вызывает метод getMyValue() апплета. Если вы уберете все обращения к свойствам апплета, все будет хорошо.
Чтобы решить мою проблему, я решил передать все значения апплета, которые мне были нужны, в качестве параметров моей функции javascript, и теперь у меня все хорошо.
Так может быть не всегда, если javascript меняет состояние апплета...мне повезло :)