Javascript 如何将一个事件侦听器附加到多个对象?

Javascript 如何将一个事件侦听器附加到多个对象?,javascript,events,listener,Javascript,Events,Listener,我正在将jQuery选择器缓存到对象上: var a = {x:1}; var b = {y:2}; a.$btn = $('<div/>').addClass('button').appendTo('body').find('.button'); b.$btn = $('<div/>').addClass('button').appendTo('body').find('.button'); $('.button').on('click', function(e){

我正在将jQuery选择器缓存到对象上:

var a = {x:1};
var b = {y:2};

a.$btn = $('<div/>').addClass('button').appendTo('body').find('.button');
b.$btn = $('<div/>').addClass('button').appendTo('body').find('.button');

$('.button').on('click', function(e){ doSomething(e); });

编辑2:

如果您的所有其他对象都有父元素,则可以通过以下方式执行此操作:

$('#parent').on('click', '.elemClass1 .elemClass2 .elemClass3',function(e){ doSomething(e); });

如果它不起作用,请尝试用逗号分隔。elemClass1、.elemClass2、.elemClass3’您可以为每个创建的按钮分配一个处理程序,或者按照@user2182349的说明使用

然而,事件委派并不能解决单个处理程序的上下文问题。我看到两种解决办法

简单明了的解决方案:

切换层次:created按钮应具有对对象的引用。例如:

a.$btn = $('<div/>').addClass('button').appendTo('body').find('.button');
a.$btn.object = a;
$('.button').on('click', function(e){ doSomething.call(e.target.object, e); });
编辑:

关于更新OP中的JSFIDLE:

var a = b = Object.create(null);
a.x = 1;
b.y = 2;
只需创建1(一!)个对象和两个引用它的变量。因此,您将得到一个具有两个属性的对象:
x
y
。 看看更新的


希望这有助于

稍微困惑的人,做
事情。addEventListener(“whateverevent”,function(){a.x=4;b.x=100;})不工作?它们在功能范围内,因此可以正常工作?@Mike'Pomax'Kamermans-在您发表评论的同时添加了一个编辑,这可能有助于扩展我的初始问题。您希望如何更改
a.x
b.y
?我可以想象,单击
按钮的事件处理程序
类会起作用。还有一种方法可以告诉您正在单击哪个按钮(例如
id
)。您的问题不清楚到底是什么问题。单击
a.$btn
和单击
b.$btn
时是否要修改
a.x
;当一个事件触发时,我需要更改内存中的相关对象及其属性;取决于调用了哪个类?顺便说一句,您的代码需要“e.stopPropagation()”来停止对其他元素的调用。@Mollo。当父对象是DOM对象时,这将起作用。我们正在寻找一种方法来定位一个不是DOM元素的父对象嗯,我没有读到你不能将DOM对象作为父对象。。。现在有点困难了。我被一个$btn.object=a弄糊涂了,这不是自我参照吗?它将是var a={};a、 x=1;a、 $btn=$('')。这称为循环引用,而不是自引用
a->btn->a
。是的,但我不知道为什么您需要在业务对象中引用button。我只需要创建一个按钮并插入对BO的引用<代码>$btn.object=a
。我不知道你的整个过程,不管你以后是否需要一个对button的引用,这就是为什么我保持原样的原因。因此,循环refI总是先将其作为对象(当您定义BO时),然后使用jQuery选择器对其进行扩充;你的回答完全改变了我的想法,我还有很多重构工作要做;(你能发布一个简单的jsFoDLE,所以我有一个坚实的基础来构建。谢谢你的帮助,Kirill,非常感谢你。一旦我做了一些测试,我会给你一个答案。你很好的把你的问题分解成一个简单的示例代码。所以这个问题并没有被AP的自定义逻辑所分散。p是您正在编写的。但是从一个示例代码来看,很难遵循足够的逻辑来构建一个对您有帮助的FIDLE。如果您发布一个FIDLE来演示您当前的问题,我将很乐意根据此线程进行更新。顺便问一句,您为什么害怕循环引用?您打算用JSON序列化您的对象吗?Prop值为DOM元素或$object的属性仍然会使其成为一个麻烦,因为它们不打算序列化,并且包含循环引用:)
var pool = [a, b];
function findObject(button){
    for (var obj in pool){
        if(obj.$btn === button){
            return obj;
        }
    }
    return null;
}
function handler(e){
    var obj = findObject(e.target);
    if(obj){
         doSomething.call(obj, e);
    }
}
var a = b = Object.create(null);
a.x = 1;
b.y = 2;