我正在开发FF扩展和插件,它们协同工作。 My Extension将npapi插件注入html,并在事件发生后调用插件的某些方法。
以下是我用于注射的代码:
if (window.content.document.getElementById("rondyoHookMessageElement") == null) {
var element = window.content.document.createElement("object");
element.type = "application/x-hook-msg";
element.id = "rondyoHookMessageElement";
element.width = 0;
element.height = 0;
window.content.document.body.appendChild(element);
}
当我需要使用插件的方法时,我会执行以下操作:
var element = window.content.document.getElementById("rondyoHookMessageElement");
element.SomeFunc();
我确认找到了该元素,但记录element.SomeFunc
会返回undefined
。
如果我手动注入npapi插件:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
</head>
<body>
<object id="plugin" type="application/plugin-mime" width=200 height=200 border=5></object>
<script type="text/javascript">
var plugin = document.getElementById("plugin");
dump(plugin.SomeFunc + "\n");
</script>
</body>
</html>
返回function SomeFunc() { [native code] }
操作系统:Mac OS X 10.6.7
FF:3.6.13
答案 0 :(得分:1)
如果你在FireFox 4中这样做,你有可能崩溃浏览器(错误已被记录,但尚未修复)。在将对象标签注入DOM之前设置对象标签的类型并不是一个好主意;你会在每个浏览器上得到不同的行为。等到你把对象放入dom然后注入它。
另一个可能的问题是,在插件可以访问之前将浏览器注入DOM后,有时需要浏览器一段时间,所以如果使用setTimeout等待半秒左右,它可能会在那时开始工作。 / p>
答案 1 :(得分:1)
我通过扩展调用SomeFunc的脚本解决了这个问题:
if (window.content.document.getElementById("rondyoHookMessageElement") == null) {
var element = window.content.document.createElement("object");
element.type = "application/x-hook-msg";
element.id = "rondyoHookMessageElement";
element.width = 0;
element.height = 0;
window.content.document.body.appendChild(element);
var script = doc.createElement("script");
script.type = "text/javascript";
script.innerHTML = 'function f(doc, messageId, data) { document.getElementById("rondyoHookMessageElement").SomeFunc(doc, messageId, data); };';
doc.body.appendChild(script);
}
当我需要从扩展程序中调用此函数时:
window.content.document.defaultView.wrappedJSObject.f(null, mes, false);