Javascript 如何在所有窗口上侦听自定义事件,冒泡问题?

Javascript 如何在所有窗口上侦听自定义事件,冒泡问题?,javascript,firefox-addon,listener,dom-events,event-bubbling,Javascript,Firefox Addon,Listener,Dom Events,Event Bubbling,我正在尝试侦听自定义事件“peakAhBoo”,因此我将事件侦听器添加到gBrowser中,如果不存在gBrowser,则将其添加到aDOMWindow() 代码段: loadIntoWindow: function (aDOMWindow, aXULWindow) { if (!aDOMWindow) { return; } if (aDOMWindow.gBrowser) { aDOMWindow.gBrowser.addEventListener('peakAh

我正在尝试侦听自定义事件“peakAhBoo”,因此我将事件侦听器添加到
gBrowser
中,如果不存在
gBrowser
,则将其添加到
aDOMWindow
()

代码段:

loadIntoWindow: function (aDOMWindow, aXULWindow) {
  if (!aDOMWindow) {
    return;
  }
  if (aDOMWindow.gBrowser) {
    aDOMWindow.gBrowser.addEventListener('peakAhBoo', respondToCustomEvent_peakAhBoo, true);
  } else {
    aDOMWindow.addEventListener('peakAhBoo', respondToCustomEvent_peakAhBoo, true);
  }
},
发送事件的代码:

var myEvent = new CustomEvent('peakAhBoo', {
    'detail': {
        'hazcheeseburger': true
    }
});
var myEvent = window.document.createEvent('CustomEvent');
var myEventDetail = {hello:'world'};
myEvent.initCustomEvent('peakAhBoo', true, true, myEventDetail);
window.dispatchEvent(myEvent);

但是,如果我打开scratchpad并从环境内容运行此创建/分派事件代码,它不会冒泡到
gBrowser
。如果我在浏览器环境中运行它,它将永远不会出现在窗口中。

好的,现在我明白你的意思了,但是根据MDN,你需要使用这个:

document.addEventListener("MyExtensionEvent", function(e) { myExtension.myListener(e); }, false, true);
// The last value is a Mozilla-specific value to indicate untrusted content is allowed to trigger the event
资料来源:

我测试了它,它工作了

网页:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title></title>
</head>
<body>

    <div id="main-content"><button onclick="trigger()">Trigger custom event</button></div>

    <script type="text/javascript">

        function trigger(){
            var myEvent = new CustomEvent('peakAhBoo', {
                'detail': {
                    'hazcheeseburger': true
                }
            });
            var myEvent = window.document.createEvent('CustomEvent');
            var myEventDetail = {hello:'world'};
            myEvent.initCustomEvent('peakAhBoo', true, true, myEventDetail);
            window.dispatchEvent(myEvent);
            console.log(myEvent)
        }

    </script>
</body>
</html>

哦,我的天哪,太壮观了!!第四次争论是鬼鬼祟祟的!!请注意其他人。注意1在removeEventListener上没有第四个参数,所以只需像正常情况一样删除它。注2:如果将第4个参数设置为TRUE,那么如果从浏览器上下文发送事件,它将不会触发,因此必须添加第二个addEventListener,第4个参数设置为FALSE,但我不知道这两个事件侦听器是否可以共存?我想最后一个加上去的会覆盖第一个,你怎么看@M.J.Saedy?我不认为我们应该这么做;-)啊,你的意思是从私人和非私人两方面来听这个事件?他们只想让我们听一个或另一个,这样就不会混音了?
function respondToCustomEvent_peakAhBoo(e){
    console.log('g: '+e.target);
}

gBrowser.addEventListener("peakAhBoo", respondToCustomEvent_peakAhBoo, false, true);