Не могут ли 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?