Подтвердить что ты не робот

Являются ли Java-апплеты неспособными общаться с javascript в Firefox на Mac OS?

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

4b9b3361

Ответ 1

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

В JavaScript:

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

В Applet:

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

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

Ответ 2

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

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

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

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

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

Ответ 3

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

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

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

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

Sooooo... может быть, вызовет время ожидания JavaScript через некоторое время и просто бросит нуль?