Java Applet无法在Mac OS上的Firefox中与javascript通信吗?

时间:2009-02-20 16:27:01

标签: java javascript macos firefox applet

我有一个在浏览器中运行的java applet,它调用一些javascript函数并期望这些函数的结果。这适用于以下配置:

  • Internet Explorer
  • 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和可编写脚本的属性。


感谢特里斯坦,我找到了答案。测试他的解决方案我创建了一个非常简单的测试,可以工作并以我的方式找到罪魁祸首。我确信我用一个空的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的状态,那可能并非总是如此......我很幸运:)

3 个答案:

答案 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?