2009-02-20 9 views
12

У меня есть Java-апплет, запущенный в браузере, который вызывает некоторые функции javascript и ожидает результата от функций тезисов. Это работает со следующими конфигурациями:Являются ли Java-апплеты неспособными связываться с javascript в Firefox на Mac OS?

  • 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()); 
    } 
} 

И в яваскрипта код:

function jsfunc() { 
    var myApplet = document.getElementById("applet_id"); 
    return myApplet.getMyValue() + 5; 
} 

ехр будет нулевым в SomeFunction ПОТОМУ jsfunc называет getMyValue() метод апплета. Если вы удалите все вызовы свойств апплета, вы круты.
Чтобы решить мою проблему, я решил дать все значения апплета, которые я использовал в качестве параметров моей функции javascript, и теперь я в порядке.
Это может быть не всегда, если javascript изменяет состояние апплета ... Мне повезло :)

ответ

3

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

В JavaScript:

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

В апплета:

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

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

+0

Вызов функции не является проблемой, получая результат обратно. С операциями отладки я могу ясно видеть, что функция выполняется, но как-то возвращаемое значение теряется, и я получаю только «нуль». –

4

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

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

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

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

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

Обязательные атрибуты mayscript и scriptable. Но я уже включил их в свой тег апплета, иначе это не сработало бы вообще с другими браузерами. –

0

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

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