Не могут ли Java-апплеты взаимодействовать с javascript в Firefox на Mac OS?
у меня есть Java-апплет, запущенный в браузере, который вызывает некоторые функции javascript и ожидает результата от этих функций. Это работает со следующими конфигурациями :
- Internet Explorer
- FireFox / Windows
- Safari / Mac
но он не работает с Firefox на MAC OS
источником проблемы, похоже, является победа.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.ленг.NullPointerException (exp.метод toString()) заявление). Функция testfunc javascript просто возвращает true.
Я пытался с win.позвоните и получите тот же результат.
мой тег апплета включает атрибуты 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 в somefunction, потому что jsfunc вызывает метод getMyValue () апплета. Если вы удалите все вызовы свойств апплета, вы будете в порядке.
Чтобы решить мою проблему, я решил дать все значения апплета, которые я needed в качестве параметров моей функции javascript, и теперь я хорош.
Это может быть не всегда так, если javascript изменяет состояние апплета ...Мне повезло :)
3 ответов
Она будет работать через доступ к одному из глобальных объектов на экране? Ergo,
В JavaScript:
window.testfunc = function() { //... }
В Апплет:
win.eval("window.testfunc()") // or maybe just win.eval("testfunc()")
это был бы мой эксперимент. Но я звонил в "окно".close () " на FF в Mac OS X, и это все еще работает.
Я не использовал api апплета некоторое время, но если я правильно помню, чтобы позволить апплету cann JS-код, вы должны включить атрибут mayscript в теге апплета или param mayscript в нотации тега объекта.
для связи другим способом JS для апплета вы также должны использовать атрибут или параметр scriptable, например:
<applet code="..." mayscript="true" />
это позволяет апплету использовать функции скрипта.
<applet code="..." scriptable="true" />
Если вы удалите все вызовы свойств апплета, вы классные.
Это может произойти и в других ситуациях. Я нашел эту страницу после поиска аналогичной проблемы, поэтому я решил добавить точку данных. Единственная разница в том, что я использовал win.call (), а не win.оценка.)(
У меня был вызов alert() В JavaScript, чтобы убедиться, что вызов прошел, и увидел, что, похоже, точно такая же блокировка на Firefox 3.0.9, OS X 10.5.6, Java 1.5.0_16. 100% повторяется с Firefox, никаких проблем на Safari (у меня нет Windows, установленной на этом поле).
когда я избавился от alert() и просто вернул значение, проблема ушла.
Sooooo... может быть, вызовы в JavaScript тайм-аут через некоторое время и просто бросают null?