Java-апплеты не могут общаться с javascript в Firefox на Mac OS? - PullRequest
12 голосов
/ 20 февраля 2009

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

Ответы [ 3 ]

4 голосов
/ 23 февраля 2009

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

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

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

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

<applet code="..." scriptable="true" />
3 голосов
/ 23 февраля 2009

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

В JavaScript:

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

В апплете:

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

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

0 голосов
/ 26 апреля 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...