如何在firefox扩展中从注入的HTML按钮触发事件

How to trigger an event from injected HTML button in firefox extension?

本文关键字:HTML 按钮 事件 注入 firefox 扩展      更新时间:2023-09-26

我的最终目标是创建一个firefox扩展,在网站上插入一个HTML按钮,并在我的扩展中自定义代码模块中定义一个函数。

我试着实现Nickolay对这个问题的回答。当我点击我创建的按钮时,我在Firebug中得到以下错误:

"uncaught exception: [exception…]"组件返回的失败代码:0x80070057 (NS_ERROR_ILLEGAL_VALUE) [nsIDOMEventTarget. log]。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";
}

我该如何解决这个问题?我还应该提到,我对开发浏览器扩展是完全陌生的。

button.setAttribute('onclick', 'dispatchEvent(event)')不会做你认为它会做的事情-当按钮被点击时,它会获取click事件并试图调度它。但是,不允许第二次调度事件。你想要的是:

button.addEventListener("click", function() {
  button.dispatchEvent(event);
}, false);

这将创建一个函数闭包,它可以访问周围代码的变量-包括buttonevent。关于闭包的进一步阅读:http://www.javascriptkit.com/javatutors/closures.shtml

终于成功了。我不需要添加第二个监听器,它只需要一行:按钮。addEventListener("click", foo, false);

我以前尝试过foo()而不是只是foo,失败了,但现在工作得很好。