Java-апплеты не могут взаимодействовать с javascript в Firefox на Mac OS?

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


person Sébastien Nussbaumer    schedule 20.02.2009    source источник


Ответы (3)


Будет ли это работать через доступ к одному из глобальных объектов на экране? Следовательно,

В JavaScript:

window.testfunc = function() { //... }

В апплете:

win.eval("window.testfunc()") // or maybe just win.eval("testfunc()")

Это будет мой эксперимент. Но я вызывал «window.close()» в FF в Mac OS X, и это все еще работает.

person Tristan Juricek    schedule 23.02.2009
comment
Вызов функции не является проблемой, проблема заключается в возврате результата. С операторами отладки я ясно вижу, что функция выполняется, но каким-то образом возвращаемое значение теряется, и я получаю только нулевое значение. - person Sébastien Nussbaumer; 24.02.2009

Я давно не использовал API-интерфейс апплета, но, если я правильно помню, чтобы апплет мог выполнять JS-код, вы должны включить атрибут mayscript в теге апплета или параметр mayscript в нотации тега объекта.

Для обратной связи JS с апплетом вы также должны использовать атрибут или параметр scriptable, например:

<applet code="..." mayscript="true" />

Это позволяет вашему аплету использовать функции сценария.

<applet code="..." scriptable="true" />
person Paulo Lopes    schedule 23.02.2009
comment
Атрибуты mayscript и scriptable действительно необходимы. Но я уже включил их в свой тег апплета, иначе он вообще не работал бы с другими браузерами. - person Sébastien Nussbaumer; 24.02.2009

Если вы удалите все обращения к свойствам апплета, все будет хорошо.

Это может произойти и в других ситуациях. Я нашел эту страницу после того, как погуглил аналогичную проблему, поэтому решил добавить точку данных. Единственная разница в том, что я использовал win.call(), а не win.eval().

У меня был вызов alert() в JavaScript, чтобы убедиться, что вызов проходит, и я увидел точно такую ​​же блокировку в Firefox 3.0.9, OS X 10.5.6, Java 1.5.0_16. 100% повторение с Firefox, никаких проблем с Safari (у меня не установлена ​​Windows на этом компьютере).

Когда я избавился от alert() и просто вернул значение, проблема исчезла.

Оооооо... может через какое-то время вызовы в JavaScript отключатся и просто выкинут null?

person Community    schedule 26.04.2009