【问题标题】:How to pass a Javascript object to a Java applet in Safari?如何将 Javascript 对象传递给 Safari 中的 Java 小程序?
【发布时间】:2010-02-11 19:13:50
【问题描述】:

我正在尝试从 Javascript 调用 Java 小程序,但是当我传递一个对象时,Java 小程序只接收到 null。这适用于 IE 和 Firefox,但不适用于 Safari 4(尝试过 OSX 和 Windows 版本,似乎都不起作用)。

我正在调用的 Java 小程序方法可能如下所示:

public void sampleFunction(JSObject someobject) throws Exception
{
   someobject.call("somemethod");
}

以及调用它的 HTML/Javascript:

<applet archive="Test.jar" code="Test.class" width="0" height="0" id="TestApplet" MAYSCRIPT></applet>
...
var testobject = { somemethod: function() {} };
document.TestApplet.sampleFunction(testobject);

NullPointerException 是 Safari 中的结果,因为 Java 小程序中的“someobject”参数为空。同样,这在 Windows、OSX 和 Linux 中的 Firefox 和 IE 中运行良好,但在 Safari 中,sampleFunction() 将传递一个空参数。

另外,相反的方向似乎也不起作用。如果我得到窗口对象并从 Java 调用 Javascript,我传递的任何对象都不起作用。例如,我可以传递一个字符串数组,在 Javascript 中我得到一个 [Ljava.lang.String 类型对象,但我无法访问其中的任何内容(长度未定义且数组运算符不起作用)。

是 Safari 刚刚坏了还是什么?有什么想法吗?

【问题讨论】:

  • 你在谷歌浏览器中试过这个吗?那也是使用WebKit,可能是webkit的问题。
  • 在 Windows 版 Chrome 中运行良好。不适用于适用于 Linux 或 OSX 的 Chrome。
  • 不知道这是否与它有关:您可以将“applet”标签换成“java.sun.com/j2se/1.4.2/docs/guide/plugin/developer_guide/…
  • 这不是我所看到的权限问题,而是完全不同的错误。使用对象标签没有区别。

标签: java javascript safari


【解决方案1】:

如果可以,我建议将对象序列化为 JSON 字符串。您可以从 json.org 获取 json2.js 并使用 json.stringify(obj) 将其发送到您的 Java 小程序。在 Java 端,您应该能够将 JSON 字符串反序列化为原生对象。这可能是最可靠的数据传输方法。这种方法的缺点是您可能需要一种方法来指定从 Java 端运行的回调方法。

【讨论】:

  • 是的,这正是我一直在做的。我有一种机制,回调可以得到一个唯一的名称,并且可以使用它们基于文本的名称来调用。话虽如此,由于一个浏览器损坏,这仍然是一种愚蠢的低效黑客攻击。
  • 每一段完成的 javascript 都至少包含一个“由于一个浏览器损坏而导致的愚蠢和低效的 hack”。除非你不关心那些仍在使用 IE6 的数百万用户......
  • 好吧,我们不应该必须关心 10 年前的浏览器。
  • @matthijs 不幸的是,“不应该”和“做”是不同的事情。而且,现在还不到 10 岁(直到 2011 年 8 月)。
猜你喜欢
  • 2018-01-08
  • 2014-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-20
  • 2023-03-06
  • 1970-01-01
  • 2012-11-05
相关资源
最近更新 更多