javascript - 将事件监听器附加到 DOM,而不是污染全局命名空间

标签 javascript event-handling

过去 2 天我完全陷入这种特殊情况,阅读了 100 篇文章,但无能为力。

我的 html 页面有许多元素(或将这些元素视为小部件),并且页面上这些元素的数量是动态的。相同的元素也可以重复(多次)。所以为了方便我没有给他们任何ID。假设这些元素是

A1 A2 B1 B2 B3 。 。 .

现在页面上不断发生事件。我想要的是,每个元素都应该能够订阅多个事件,保留迄今为止发生的所有更改的日志,并根据该事件以特定的方式更改自身。

假设引发了一个事件 lionAttacked,并且 B3 已订阅该事件。现在,如果 B3 有某个 id,比如说 332124,那么我的代码将是

    document.addEventListener("lionAttacked", function(e){
            document.getElementById('332124').innerHTML = 
                document.getElementById('332124').innerHTML + "Lion attacked us;"; 
    });

但是由于没有 B3 的 id,所以理想情况下我想要的是如下内容

<div onload="
            document.addEventListener('lionAttacked', function(e){
            /*do whatever you want to do with your element when lion attacks*/
            this.innerHTML = this.innerHTML + 'Lion attacked us;';});

             document.addEventListener('wolfArrived', function(e){
            /*do whatever you want to do with your element when wolf arrives*/
            this.innerHTML = this.innerHTML + 'Wolf came to visit us;';});

            "> 
    my element 
</div>

对我来说,这将是一种更加封装的代码,即与元素相关的所有逻辑都驻留在其中。

非常感谢任何帮助!!

最佳答案

您可以使用包含所有事件订阅的对象。键是事件名称,值是所有已订阅元素的数组。

var subscriptions = {};

function subscribe(event, element) {
    if (!subscriptions[event]) {
        subscriptions[event] = [];
    }
    subscriptions[event].push(element);
}

然后事件监听器的代码将循环遍历数组中的所有元素。

document.addEventListener("lionAttacked", function(e) {
    if (subscriptions[event]) {
        subscriptions[event].forEach(function (el) {
            el.innerHTML += "Lion attacked us";
        });
    }
}

关于javascript - 将事件监听器附加到 DOM,而不是污染全局命名空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38916811/

相关文章:

javascript - 触发器和打开问题。事件不会触发 on 方法

javascript - 可调整大小的 jQuery UI 不适用于动态元素

javascript - 启动 Soundcloud 练习页面

objective-c - 听到keyUp事件了吗? : Overridden NSView method

javascript - 如何在计算调用函数的次数时调用函数内的闭包

javascript - 单击任何指定的单选按钮时取消选中所有单选按钮

node.js - 处理NodeJS错误事件?

.net - 记录事件的调用顺序

滚动已经开始后,Javascript在touchmove上停止滚动

javascript - 使用 Jquery 允许常规 JS 对象上的事件