我有一个在浏览器中运行的 java 小程序,它正在调用一些 javascript 函数并期待这些函数的结果。这适用于以下配置:
- IE浏览器
- 火狐/视窗
- 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 并得到了相同的结果。
我的小程序标签包括 mayscript 和 scriptable 属性。
感谢特里斯坦,我找到了答案。测试他的解决方案我创建了一个非常简单的测试,它可以工作并以我的方式找到罪魁祸首。我确信我用一个返回 true 的空 testfunc() 进行了测试,但我可能没有这样做,因为在这种情况下它确实有效。这里真正的问题是该函数调用了小程序的公共方法。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 将在 somefunction 中为空,因为 jsfunc 调用了小程序的 getMyValue() 方法。如果您删除对小程序属性的所有调用,那您就很酷。
为了解决我的问题,我决定将我需要的小程序的所有值作为我的 javascript 函数的参数,我现在很好。
情况可能并非总是如此,如果 javascript 改变了小程序的状态......我很幸运 :)