Действительно ли Апплеты Java неспособны общаться с JavaScript в рамках Firefox на Mac OS?

У меня есть апплет 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 ()) оператор). testfunc функция JavaScript просто возвращает true.

Я попробовал win.call и получил тот же результат.

Мой тег апплета включает mayscript и scriptable атрибуты.


Я нашел ответ благодаря Tristan. Тестирование его решения, я создал действительно простой тест, который мог работать и проложил себе путь для нахождения преступника. Я был уверен, что сделал свои тесты с пустым 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 будет пустым в somefunction, ПОСКОЛЬКУ jsfunc называет getMyValue () методом апплета. При удалении всех вызовов к свойствам апплета, Вы спокойны.
Для решения моей проблемы, я решил дать все значения апплета, в котором я нуждался как параметры моей функции JavaScript, и я хорош теперь.
Это не может всегда иметь место, если JavaScript изменяет состояние апплета... Я был удачлив:)

12
задан Sébastien Nussbaumer 24 February 2009 в 14:12
поделиться

3 ответа

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

В JavaScript:

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

В апплете:

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

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

3
ответ дан 2 December 2019 в 23:08
поделиться

Я не использовал API апплета в некоторое время, но если я вспоминаю правильно для разрешения Апплета cann JS код, который необходимо включить атрибуту mayscript в теге апплета или параметрическом усилителе mayscript в нотации тега object.

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

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

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

<applet code="..." scriptable="true" />
4
ответ дан 2 December 2019 в 23:08
поделиться

Если вы удалите все вызовы свойств апплета, вы круты.

Это может произойти и в других ситуациях. Я нашел эту страницу после поиска в Google похожей проблемы, поэтому решил добавить точку данных. Единственное отличие состоит в том, что я использовал 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 и просто выбрасывает ноль?

0
ответ дан 2 December 2019 в 23:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: