12

我有一个在浏览器中运行的 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 改变了小程序的状态......我很幸运 :)

4

3 回答 3

4

我有一段时间没有使用applet api,但是如果我没记错的话,为了让Applet 能够处理JS 代码,你应该在你的applet 标记中启用属性mayscript 或在对象标记表示法中启用参数mayscript。

对于以其他方式 JS 与 Applet 的通信,您还应该使用可编写脚本的属性或参数,例如:

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

这允许您的小程序使用脚本函数。

<applet code="..." scriptable="true" />
于 2009-02-23T09:48:44.343 回答
3

它可以通过访问屏幕上的全局对象之一来工作吗?因此,

在 JavaScript 中:

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

在小程序中:

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

那将是我的实验。但是我一直在 Mac OS X 上的 FF 上调用“window.close()”,并且仍然有效。

于 2009-02-23T08:48:50.883 回答
0

如果您删除对小程序属性的所有调用,那您就很酷。

这也可能发生在其他情况下。我在谷歌搜索类似的问题后发现了这个页面,所以我想我会添加一个数据点。唯一的区别是我使用的是 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?

于 2009-04-26T06:15:05.900 回答