我有一个在浏览器中运行的java applet,它调用一些javascript函数并期望从这些函数中得到结果.这适用于以下配置:
IE浏览器
FireFox/Windows
Safari/Mac
但它不适用于MAC OS上的Firefox
问题的根源似乎是始终返回null的win.eval调用.我在Mac OS X 10.4.11上使用Firefox 3.0.6进行了测试
一点代码:
JSObject win = (JSObject) JSObject.getWindow(this); Object exp = win.eval("testfunc()"); System.out.println("exp = " + exp.toString());
这会触发java.lang.NullPointerException(exp.toString())语句.testfunc javascript函数只返回true.
我尝试使用win.call并得到了相同的结果.
我的applet标记包含mayscript和scriptable属性.
我找到答案感谢特里斯坦.测试他的解决方案我创建了一个非常简单的测试,可以工作并以我的方式找到罪魁祸首.我确信我用一个空的testfunc()做了我的测试,它刚刚返回true,但我可能没有,因为在那种情况下它会起作用.这里真正的问题是该函数称为applet的公共方法.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()); } }
和javascript代码:
function jsfunc() { var myApplet = document.getElementById("applet_id"); return myApplet.getMyValue() + 5; }
在某些函数中,exp将为null BECAUSE jsfunc调用applet的getMyValue()方法.如果删除对applet属性的所有调用,那么你很酷.
为了解决我的问题,我决定给出我所需要的applet的所有值作为我的javascript函数的参数,我现在很好.
如果javascript改变了applet的状态,那可能并非总是如此......我很幸运:)