我有一个在浏览器中运行的java applet,它调用一些javascript函数并期望这些函数的结果。这适用于以下配置:
但它不适用于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和可编写脚本的属性。
感谢特里斯坦,我找到了答案。测试他的解决方案我创建了一个非常简单的测试,可以工作并以我的方式找到罪魁祸首。我确信我用一个空的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的状态,那可能并非总是如此......我很幸运:)
答案 0 :(得分:4)
我有一段时间没有使用applet api,但如果我没记错,为了让Applet能够使用JS代码,你应该在你的applet标签中启用属性mayscript,或者在对象标签符号中启用param mayscript。 / p>
对于JS到Applet的其他方式的通信,您还应该使用可编写脚本的属性或参数,例如:
<applet code="..." mayscript="true" />
这允许您的applet使用脚本函数。
<applet code="..." scriptable="true" />
答案 1 :(得分:3)
通过访问屏幕上的一个全局对象,它会起作用吗?人体工程学,
在JavaScript中:
window.testfunc = function() { //... }
在Applet中:
win.eval("window.testfunc()") // or maybe just win.eval("testfunc()")
那将是我的实验。但我一直在Mac OS X上的FF上调用“window.close()”,这仍然有效。
答案 2 :(得分:0)
如果删除对applet属性的所有调用,那就很酷了。
在其他情况下也可能发生这种情况。我在谷歌搜索一个类似的问题后发现这个页面,所以我想我会添加一个数据点。唯一的区别是我使用的是win.call()而不是win.eval()。
我在JavaScript中进行了一次alert()调用,以确保调用正在通过,并看到Firefox 3.0.9,OS X 10.5.6,Java 1.5.0_16上看起来完全相同的锁定。使用Firefox可以100%重复,在Safari上没问题(我没有在这个盒子上安装Windows)。
当我摆脱alert()并简单地返回一个值时,问题就消失了。
Sooooo ...可能会在一段时间后调用JavaScript超时并简单地抛出null?