2009-02-20 11 views
12

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 :)

Respuesta

3

¿Funcionaría al acceder a uno de los objetos globales en la pantalla? Ergo,

En JavaScript:

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

En Applet:

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

Ese sería mi experimento. Pero he estado llamando a "window.close()" en FF en Mac OS X, y eso todavía funciona.

+0

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". –

4

No he usado la applet desde hace un tiempo, pero si la recuerdo correctamente para permitir que un Applet pueda usar el código JS, debe habilitar el atributo mayscript en la etiqueta de applet o un param mayscript en la notación de etiqueta de objeto.

Para la comunicación de la otra manera JS para Applet también debería utilizar el atributo o parámetro de secuencias de comandos, por ejemplo:

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

Esto permite que el applet de utilizar funciones de script.

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

Los atributos mayscript y scriptable son necesarios. Pero ya los incluyo en mi etiqueta de applet, de lo contrario no funcionaría en absoluto con otros navegadores. –

0

Si elimina todas las llamadas a las propiedades del applet que está fresco.

Esto puede suceder en otras situaciones también. Encontré esta página después de buscar en Google un problema similar, así que pensé en agregar un punto de datos. La única diferencia es que estaba usando win.call() en lugar de win.eval().

Tuve una llamada de alerta() en JavaScript para asegurarme de que la llamada estaba siendo procesada, y vi lo que parece ser exactamente el mismo bloqueo en Firefox 3.0.9, OS X 10.5.6, Java 1.5.0_16. 100% repetible con Firefox, no hay problema en Safari (no tengo Windows instalado en esta caja).

Cuando me deshice de la alerta() y simplemente devolví un valor, el problema desapareció.

Sooooo ... ¿tal vez llama a JavaScript después de un tiempo y simplemente tira nulo?

Cuestiones relacionadas