从applet调用JS可以在Firefox& Chrome但不是Safari

时间:2011-05-20 12:01:25

标签: java javascript google-chrome safari applet

我在applet中有以下代码来调用一些Javascript(它有点令人费解,因为被调用的fn从divId识别的DOM中获取一个对象并调用它上面的函数)。

@Override
public final void start() {
  System.err.println("start() method called");
  this.javascript = JSObject.getWindow(this);
  this.jsObjectDivId = getParameter("parent_div_id");
  this.initCallbackFnName = getParameter("init_callback");
  Object args[] = {this.jsObjectDivId, this.initCallbackFnName};
  System.out.print("Calling init_callback\n");
  this.javascript.call("callJS", args);
}

callJS功能是:

window.callJS = function(divId, functionName, jsonArgString) {
  var args, obj;
  obj = $(divId).data('neatObject');
  args = eval(jsonArgString);
  return obj[functionName](args);
};

在Firefox / Chrome中,divIdfunctionName参数包含有效的字符串,一切正常;在挂起指定DIV数据的对象上调用所需的函数。

在Safari中,divIdfunctionName参数都报告为JavaRuntimeObject,其值为true

> divId
  JavaRuntimeObject
    true

是什么给出了?

2 个答案:

答案 0 :(得分:4)

并非所有浏览器都完全支持LiveConnect。特别是,在使用call时,Safari不会将Java字符串转换为prober JS等效字符串。在您的情况下,您可以在Applet端使用eval而不是call,并使用参数放入JSON字符串对象。类似的东西:

javascript.eval(callback + "({\"id\":\"" + id + "\",\" ... })")

基本上,您需要了解可运行的跨浏览器兼容的LiveConnect子集。 我写过一篇描述子集的博客文章:http://blog.aarhusworks.com/applets-missing-information-about-liveconnect-and-deployment/

它附带一个在浏览器中运行的LiveConnect测试套件:http://www.jdams.org/live-connect-test

答案 1 :(得分:0)

我在Safari中调用applet上的方法时遇到了类似的问题。它返回了一个JavaRuntimeObject,当我以后用户时,它引起了异常。

正如@edoloughlin指出的那样,我必须使用(applet.getMethod()+“”),然后评估正确的字符串。

评论为我节省了很多时间,所以我认为在此处添加是有用的,因为我无法在上面发表评论。

相关问题