可编写脚本的NPAPI插件不适用于Firefox

|| 我正在开发可协同工作的FF扩展和插件。我的扩展程序将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     
已邀请:
如果您在FireFox 4中执行此操作,则很有可能使浏览器崩溃(错误已记录,但尚未修复)。在将对象标记注入DOM之前,先设置它的类型不是一个好主意。您在每种浏览器上都会得到不同的行为。等到将对象放入dom后再注入。 另一个可能的问题是,在将浏览器注入DOM之后,有时需要一段时间才能使插件可访问,因此,如果您使用setTimeout等待半秒钟,则它可能会在此时开始工作。     
我通过扩展调用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);
    

要回复问题请先登录注册