Java 从applet调用JS在Firefox&;Chrome,但不是Safari
我在一个applet中有以下代码来调用一些Javascript(这有点复杂,因为被调用的fn从由divId标识的DOM中获取一个对象并对其调用一个函数)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
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