我的最终目标是创建一个firefox扩展,将HTML按钮插入到网站上,然后在我的扩展程序中触发自定义代码模块中定义的函数。
我试图实现Nickolay对此question的回答。当我点击我创建的按钮时,我在Firebug中收到以下错误:
“未捕获异常:[Exception ...”组件返回失败代码:0x80070057(NS_ERROR_ILLEGAL_VALUE)[nsIDOMEventTarget.dispatchEvent]“nsresult:”0x80070057(NS_ERROR_ILLEGAL_VALUE)“location:”JS frame ::“
我的代码:
onPageLoad: function(aEvent) {
Components.utils.import("chrome://my_ext/content/writeFile.jsm", my_ext);
//alert(foo()); - foo() is an function in the above code module I import
var doc = aEvent.originalTarget; // doc is document that triggered "onload" event
var event = doc.createEvent("Events");
event.initEvent("my-custom-event", true, true);
var fblike = doc.getElementById("LikePluginPagelet");
var button = doc.createElement("input");
button.setAttribute("type", "button");
button.setAttribute("value", "My Button");
button.setAttribute('onclick', 'dispatchEvent(event)');
fblike.appendChild(button, fblike);
var docx = event.originalTarget;
if(docx && docx.addEventListener)
docx.addEventListener("my-custom-event", function() {alert(foo()); }, false);
},
我的writeFile.jsm:
var EXPORTED_SYMBOLS = ["foo"];
function foo() {
return "foo test";
}
我对如何解决此问题有任何想法?我还要提一下,我是开发浏览器扩展的新手。
答案 0 :(得分:1)
button.setAttribute('onclick', 'dispatchEvent(event)')
将无法执行您认为会执行的操作 - 单击按钮时,它将执行click
事件并尝试调度它。但是,不允许第二次调度事件。你似乎想要的是:
button.addEventListener("click", function() {
button.dispatchEvent(event);
}, false);
这将创建一个函数闭包,可以访问周围代码的变量 - 包括button
和event
。关于闭包的进一步阅读:http://www.javascriptkit.com/javatutors/closures.shtml
答案 1 :(得分:0)
终于开始工作了。我不需要添加第二个侦听器,它只需要一行: button.addEventListener(“click”,foo,false);
我之前尝试过foo()而不仅仅是foo而且失败但现在工作得很好。