Mam aplet java uruchomiony w przeglądarce, która wywołuje niektóre funkcje javascript i spodziewa się wyniku z tych funkcji. Jest to praca z następujących konfiguracji:Czy aplety Java nie mogą komunikować się z javascript w Firefoksie w systemie Mac OS?
- Internet Explorer
- FireFox/Windows
- Safari/Mac
ale to nie działa w Firefoksie na Mac OS
Źródłem problem wydaje się być wywołania win.eval, które zawsze zwracają wartość null. testowałem to z Firefox 3.0.6 na Mac OS X 10.4.11
Trochę kodu:
JSObject win = (JSObject) JSObject.getWindow(this);
Object exp = win.eval("testfunc()");
System.out.println("exp = " + exp.toString());
To wyzwala java.lang.NullPointerException (exp.toString()) oświadczenie) . Funkcja javascript testfunc po prostu zwraca wartość true.
Próbowałem z win.call i otrzymałem taki sam wynik.
Mój znacznik apletu zawiera atrybuty mayscript i scriptable.
Znalazłem odpowiedź dzięki Tristan. Testując jego rozwiązanie stworzyłem naprawdę prosty test, który mógł zadziałać i wypracował moją drogę do znalezienia sprawcy. Byłem pewien, że zrobiłem moje testy z pustym testfunc(), który właśnie zwrócił prawdę, ale prawdopodobnie nie, ponieważ w tym przypadku działa. Prawdziwy problem polegał na tym, że funkcja nazywała się publiczną metodą apletu. Liveconnect nie wydaje się być w stanie obsłużyć tego przypadku w Firefox Mac.
Podam przykład: Klasa
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());
}
}
a kod javascript:
function jsfunc() {
var myApplet = document.getElementById("applet_id");
return myApplet.getMyValue() + 5;
}
exp będzie null w someFunction PONIEWAŻ jsfunc wywołuje getMyValue() metoda apletu. Jeśli usuniesz wszystkie połączenia z właściwościami apletu, jesteś spokojny.
Aby rozwiązać mój problem, postanowiłem podać wszystkie wartości apletu, który uważałem za parametry funkcji javascript i jestem teraz dobry.
To może nie być tak zawsze, jeśli javascript zmienia stan apletu ... Miałem szczęście :)
Wywołanie funkcji nie jest problemem, uzyskanie wyniku z powrotem jest. Z instrukcjami debugowania jasno widzę, że funkcja jest wykonywana, ale w jakiś sposób wartość zwracana zostaje utracona, a ja dostaję tylko "null". –