如何在不涉及任何DOM元素的情况下实现事件驱动的JavaScript?

如何在不涉及任何DOM元素的情况下实现事件驱动的JavaScript?,javascript,dom,events,dom-events,Javascript,Dom,Events,Dom Events,有没有办法在JavaScript中实现事件驱动编程,而不涉及任何DOM元素?例如,创建一个事件处理程序,该处理程序在每次对数组排序时执行。当然!你要找的关键词是“pubsub”。以下是一些众所周知的实现: 但你也可以自己做,就像这样: window.pubsub = (function () { var eventToListeners = {}; return { sub: function (event, callback) {

有没有办法在JavaScript中实现事件驱动编程,而不涉及任何DOM元素?例如,创建一个事件处理程序,该处理程序在每次对数组排序时执行。

当然!你要找的关键词是“pubsub”。以下是一些众所周知的实现:

但你也可以自己做,就像这样:

window.pubsub = (function () {
    var eventToListeners = {};

    return {
        sub: function (event, callback) {
            if (!eventToListeners.hasOwnProperty(event)) {
                eventToListeners[event] = [];
            }
            eventToListeners[event].push(callback);
        },
        pub: function (event, args) {
            if (eventToListeners.hasOwnProperty(event)) {
                for (var i = 0; i < eventToListeners[event].length; ++i) {
                   try {
                       eventToListeners[event][i].call(null, args);
                   } catch (e) {
                       if (console && console.error) {
                           console.error(e);
                       }
                   }
                }
            }
        }
    };
}());

// Sample usage:
pubsub.sub("arraySorted", function () {
    console.log("array was sorted");
});

var myArray = [2, 3, 1];

myArray.sort();
pubsub.pub("arraySorted");
window.pubsub=(函数(){
var eventToListeners={};
返回{
子:函数(事件、回调){
如果(!eventToListeners.hasOwnProperty(事件)){
eventToListeners[事件]=[];
}
eventToListeners[event].push(回调);
},
发布:函数(事件,参数){
if(eventToListeners.hasOwnProperty(事件)){
对于(var i=0;i
混合主干。将事件添加到对象中会得到这样的结果。(参见Backbone.js)

在新浏览器中,我们添加了直接构建EventTarget的功能:

const et = new EventTarget();

et.addEventListener("arraySorted", () => {
  console.log("array was sorted");
});

const myArray = [2, 3, 1];

myArray.sort();
et.dispatchEvent(new Event("arraySorted"));

有关更多示例以及浏览器兼容性表,请参见。在撰写本文时,它仅适用于Chrome(64+)和Firefox(59+),但随着时间的推移,支持将扩展到包括Safari和Edge。

请记住将呼叫包装在try-catch块中,以确保即使失败也能呼叫所有订阅者。@Magnar:感谢您的建议;实施!哇!!非常感谢你!!我以前从来都不知道这个酒吧/酒吧的事。这真的帮了我大忙!thx:)@Domenic谢谢你的回答,我认为这是迄今为止我找到的与酒吧/酒吧相关的最清晰、最简单的答案之一。