У меня есть 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 изменяет состояние апплета... Мне повезло:)