Tengo un applet java que se ejecuta en un navegador que llama a algunas funciones de javascript y espera un resultado de estas funciones. Esto está trabajando con las siguientes configuraciones:¿Los Applets de Java no se pueden comunicar con JavaScript dentro de Firefox en Mac OS?
- Internet Explorer
- FireFox/Windows
- Safari/Mac
pero no funciona con Firefox en Mac OS
La fuente de el problema parece ser las llamadas win.eval que siempre devuelven nulo. He probado esto con Firefox 3.0.6 en Mac OS X 10.4.11
un poco de código:
JSObject win = (JSObject) JSObject.getWindow(this);
Object exp = win.eval("testfunc()");
System.out.println("exp = " + exp.toString());
Esto desencadena una java.lang.NullPointerException (exp.toString)() declaración) . La función javascript testfunc simplemente devuelve verdadero.
Lo intenté con win.call y obtuve el mismo resultado.
Mi etiqueta de applet incluye los atributos mayscript y scriptable.
Encontré la respuesta gracias a Tristan. Probando su solución, creé una prueba realmente simple que podría funcionar y funcionó para encontrar al culpable. Estaba seguro de que hice mis pruebas con un testfunc vacío() que acaba de volverse verdadero, pero probablemente no lo hice porque en ese caso SI FUNCIONA. El verdadero problema aquí era que la función llamaba a un método público del applet. Liveconnect no parece ser capaz de manejar ese caso en Firefox Mac.
Déjeme darle un ejemplo: la clase
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());
}
}
Y el código javascript:
function jsfunc() {
var myApplet = document.getElementById("applet_id");
return myApplet.getMyValue() + 5;
}
exp será nulo en algunaFuncion PORQUE jsFunc llama a la getMyValue() método del applet. Si elimina todas las llamadas a las propiedades del applet, está genial.
Para resolver mi problema, decidí dar todos los valores del applet que necesitaba como parámetros de mi función javascript y ahora estoy bien.
Eso puede no ser el caso siempre, si el javascript cambia el estado del applet ... Tuve suerte :)
Llamar a la función no es el problema, recuperar el resultado es. Con las declaraciones de depuración puedo ver claramente que la función se ejecuta, pero de alguna manera el valor de retorno se pierde y solo obtengo "nulo". –