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

Javascript 如何从firefox扩展中的注入HTML按钮触发事件?,javascript,firefox,firefox-addon,mozilla,Javascript,Firefox,Firefox Addon,Mozilla,我的最终目标是创建一个firefox扩展,在站点上插入一个HTML按钮,并让它启动一个在扩展中的自定义代码模块中定义的函数 我试图实现Nickolay对此的回答。当我单击我创建的按钮时,尽管Firebug中出现以下错误: “未捕获异常:[异常…”组件返回的故障代码:0x80070057(NS错误非法值)[nsIDOMEventTarget.dispatchEvent]“nsresult:”0x80070057(NS错误非法值)”位置:“JS帧:” 我的代码: onPageLoad: functi

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

我试图实现Nickolay对此的回答。当我单击我创建的按钮时,尽管Firebug中出现以下错误:

“未捕获异常:[异常…”组件返回的故障代码:0x80070057(NS错误非法值)[nsIDOMEventTarget.dispatchEvent]“nsresult:”0x80070057(NS错误非法值)”位置:“JS帧:”

我的代码:

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);
},
My writeFile.jsm:

var EXPORTED_SYMBOLS = ["foo"];

function foo() {
    return "foo test";
}
你知道如何解决这个问题吗?我还应该提到,我对开发浏览器扩展完全是新手。

button.setAttribute('onclick','dispatchEvent(event'))
不会执行您认为它会执行的操作-单击按钮时,它会执行
单击
事件并尝试调度它。但是,不允许再次调度事件。您似乎想要的是:

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

这将创建一个函数闭包,可以访问周围代码的变量-包括
按钮
事件
。进一步阅读闭包:

最终使其工作。我不需要添加第二个侦听器,只需要一行: 按钮。addEventListener(“单击”,foo,false)


我以前尝试过foo()而不是foo,但失败了,但现在效果很好。

Hmm当我尝试实现这一点时,我得到了一个非常模糊的错误:“未捕获异常:[异常…”组件不可用“nsresult:”0x80040111(NS_error_not_available)“位置:”JS frame::chrome://mezz/content/overlay.js ::第43行“数据:否]“第43行引用了您建议的代码(“button.onclick=function()…”)。通过谷歌搜索这个错误,我看到了一些提示Firefox不兼容的页面,尽管还不确定。@user773953:哦,您正在将该按钮注入内容页面。是的,
onclick
将不可用,您应该改为使用
addEventListener
(这通常是个好主意)。我编辑了我的答案以反映这一点。我想我遗漏了一些东西。我现在没有收到任何错误,但按钮不起作用。当我单击它时,什么都没有发生。为了澄清,我的原始代码的最后三行仍然很好,对吗?从“var docx=event.original”开始。。。“.Update:玩了一些,现在我终于收到了事件…请参阅文章末尾的剩余问题。更改:1)将变量'event'更改为'mEvent'(可能与变量冲突)2)将“我的自定义事件”更改为“mClick”(“-”可能导致问题)3)取消了紧跟其后的新变量“docx”和“if”语句的声明。在上一个addEventListener中使用了“doc”而不是“docx”。剩余问题:alert(foo())语句仍然不起作用。出于测试目的,更改为alert(“测试”)这是可行的,但我又回到了原点,因为这以前是可行的。@user773953:老实说,一次回答几个不相关的问题并不有趣——特别是当大多数问题都没有明确说明的时候。你问你的事件调度有什么问题,我回答了这个问题。