2009-02-20 7 views
12

Ho un'applet java in esecuzione in un browser che sta chiamando alcune funzioni javascript e mi aspetto un risultato da queste funzioni. Questo è il lavoro con le seguenti configurazioni:Le applet Java non sono in grado di comunicare con javascript in Firefox su Mac OS?

  • Internet Explorer
  • FireFox/Windows
  • Safari/Mac

ma non funziona con Firefox su MAC OS

La fonte di il problema sembra essere le chiamate win.eval che restituiscono sempre null. Ho provato questo con Firefox 3.0.6 su un Mac OS X 10.4.11

Un po 'di codice:

JSObject win = (JSObject) JSObject.getWindow(this); 
Object exp = win.eval("testfunc()"); 
System.out.println("exp = " + exp.toString()); 

Questo innesca un java.lang.NullPointerException (exp.toString)() dichiarazione) . La funzione javascript di testfunc restituisce true.

Ho provato con win.call e ottenuto lo stesso risultato.

Il mio tag applet include gli attributi mayscript e scriptable.


Ho trovato la risposta grazie a Tristan. Testando la sua soluzione ho creato un test davvero semplice che potrebbe funzionare e ha funzionato a modo mio per trovare il colpevole. Ero sicuro di aver fatto i miei test con un test vuoto vuoto() che è appena tornato vero, ma probabilmente non l'ho fatto perché in quel caso funziona. Il vero problema era che la funzione chiamava un metodo pubblico dell'applet. Liveconnect non sembra essere in grado di gestire quel caso in Firefox Mac.

Lasciate che vi faccia un esempio: class

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

E il codice javascript:

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

exp sarà nullo in someFunction PERCHÉ jsFunc chiama il getMyValue() metodo dell'applet. Se togli tutte le chiamate alle proprietà dell'applet sei fantastico.
Per risolvere il mio problema ho deciso di fornire tutti i valori dell'applet che ho trovato come parametri della mia funzione javascript e ora sono a posto.
Questo potrebbe non essere sempre il caso, se il javascript cambia lo stato dell'applet ... Sono stato fortunato :)

risposta

3

Funzionerebbe accedendo a uno degli oggetti globali sullo schermo? Ergo,

In JavaScript:

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

In Applet:

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

che sarebbe il mio esperimento. Ma ho chiamato "window.close()" su FF su Mac OS X, e funziona ancora.

+0

Chiamare la funzione non è un problema, ottenere il risultato è. Con le istruzioni di debug posso vedere chiaramente che la funzione viene eseguita, ma in qualche modo il valore di ritorno si perde e ottengo solo "null". –

4

Non ho usato l'applet in un po ', ma se ricordo correttamente per consentire ad un Applet di eseguire il codice JS, dovresti abilitare l'attributo mayscript nel tuo tag applet o un parametro mayscript nella notazione del tag dell'oggetto.

Per la comunicazione in altro modo JS per Applet si dovrebbe anche utilizzare l'attributo script o parametro, ad esempio:

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

Questo permette l'applet per utilizzare le funzioni di script.

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

Gli attributi mayscript e scriptable sono effettivamente necessari. Ma li includo già nel mio tag applet, altrimenti non funzionerebbe affatto con altri browser. –

0

Se si rimuove tutte le chiamate alle proprietà dell'applet stai fresco.

Questo può accadere anche in altre situazioni. Ho trovato questa pagina dopo aver cercato su Google un problema simile, quindi ho pensato di aggiungere un punto dati. L'unica differenza è che stavo usando win.call() piuttosto che win.eval().

Avevo una chiamata di avviso() in JavaScript per assicurarsi che la chiamata stesse arrivando, e ho visto quello che sembra essere esattamente lo stesso blocco su Firefox 3.0.9, OS X 10.5.6, Java 1.5.0_16. 100% ripetibile con Firefox, nessun problema su Safari (non ho Windows installato su questa scatola).

Quando ho eliminato l'avviso() e restituito semplicemente un valore, il problema è andato via.

Sooooo ... forse le chiamate in JavaScript scadono dopo un po 'e si limitano a lanciare null?