Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/469.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从applet调用JS在Firefox&;Chrome,但不是Safari_Java_Javascript_Google Chrome_Safari_Applet - Fatal编程技术网

Java 从applet调用JS在Firefox&;Chrome,但不是Safari

Java 从applet调用JS在Firefox&;Chrome,但不是Safari,java,javascript,google-chrome,safari,applet,Java,Javascript,Google Chrome,Safari,Applet,我在一个applet中有以下代码来调用一些Javascript(这有点复杂,因为被调用的fn从由divId标识的DOM中获取一个对象并对其调用一个函数) callJS函数是: window.callJS = function(divId, functionName, jsonArgString) { var args, obj; obj = $(divId).data('neatObject'); args = eval(jsonArgString); return obj[fu

我在一个applet中有以下代码来调用一些Javascript(这有点复杂,因为被调用的fn从由divId标识的DOM中获取一个对象并对其调用一个函数)

callJS
函数是:

window.callJS = function(divId, functionName, jsonArgString) {
  var args, obj;
  obj = $(divId).data('neatObject');
  args = eval(jsonArgString);
  return obj[functionName](args);
};
在Firefox/Chrome中,
divId
functionName
参数包含有效字符串,一切正常;在挂起指定DIV数据的对象上调用所需的函数

在Safari中,
divId
functionName
参数都报告为
JavaRuntimeObject
,值为
true

> divId
  JavaRuntimeObject
    true

提供了什么?

并非所有浏览器都完全支持LiveConnect。特别是,Safari在使用
call
时不会将Java字符串转换为prober JS等价物。在您的例子中,您可以在Applet端使用
eval
,而不是
call
,并将带有参数的JSON字符串对象放入其中。比如:

javascript.eval(回调+”({\“id\”:\“+id+”\”,\“

基本上,您需要了解LiveConnect的跨浏览器兼容子集。 我写了一篇博客文章,描述了子集:


它附带了一个在浏览器中运行的LiveConnect测试套件:

我在Safari中调用小程序的方法时遇到了类似的问题。它返回了一个JavaRuntimeObject,我在稍后使用它时导致了一个异常

正如@edoloughlin所指出的,我必须使用(applet.getMethod()+“”),然后计算正确的字符串


该注释为我节省了大量时间,因此我认为在此处添加该注释很有用,因为我无法在上面进行注释。

我还体验到,safari不像其他浏览器那样完美地支持javascript,它似乎在两个方面都有问题。从JS调用applet方法也会返回一个无用的JavaRuntimeObject,而不是我真正想要的return。这很奇怪。在最新版本的Safari中(OSX10.6.7上的5.0.5)如果可以将第一个参数转换为字符串,那么它似乎可以传递给其他JS函数。我在返回值方面也有一些运气——如果在字符串上下文中使用它们,它们就可以工作,但是除非你给它们指定一个空字符串,否则不能将它们作为参数传递给其他JS函数。例如,json_parse(applet.getSomeJSON()+“”)可以工作,但json_parse可以(applet.getSomeJSON())将失败。
> divId
  JavaRuntimeObject
    true