У меня есть java-апплет, работающий в браузере, который вызывает некоторые функции javascript и ожидает результата от этих функций. Это работает со следующими конфигурациями:
- Internet Explorer
- FireFox / Windows
- Safari / Mac
НО Это не работает с Firefox в MAC OS
Похоже, источником проблемы являются вызовы win.eval, которые всегда возвращают ноль.
Я проверял это с 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 меняет состояние апплета ... Мне повезло:)