【问题标题】:Calling JS from an applet works in Firefox & Chrome but not Safari从小程序调用 JS 在 Firefox 和 Chrome 中有效,但在 Safari 中无效
【发布时间】:2011-08-29 14:52:53
【问题描述】:

我在一个小程序中有以下代码来调用一些 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

什么给了?

【问题讨论】:

  • 我也遇到过 safari 对 javascript 的支持不如其他浏览器那么完美
  • 它似乎在两个方向上都坏了。从 JS 调用 applet 方法也会返回一个无用的 JavaRuntimeObject,而不是我真正想要返回的。

标签: java javascript google-chrome safari applet


【解决方案1】:

并非所有浏览器都完全支持 LiveConnect。特别是,Safari 在使用 call 时不会将 Java 字符串转换为等效的探测器 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

【讨论】:

  • 这很奇怪。在最新版本的 Safari(OS X 10.6.7 上的 5.0.5)中,如果可以将其转换为字符串,它似乎通过了第一个 arg ok!我对返回值也有一些运气——如果你在字符串上下文中使用它们,它们就可以工作,但你不能将它们作为 args 传递给其他 JS 函数,除非你将一个空字符串连接到它们。例如, json_parse(applet.getSomeJSON() + "") 会起作用,但 json_parse(applet.getSomeJSON()) 会失败。
【解决方案2】:

我在 Safari 中调用小程序上的方法时遇到了类似的问题。它返回了一个 JavaRuntimeObject,我后来在它是用户时引发了异常。

正如@edoloughlin 所指出的,我必须使用 (applet.getMethod() + "") 之后才评估正确的字符串。

该评论为我节省了大量时间,因此我认为在此处添加很有用,因为我无法在上面发表评论。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-08-04
    • 2021-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多