Javascript 同一容器上的事件委派问题
我有一个函数,简化如下:Javascript 同一容器上的事件委派问题,javascript,jquery,event-delegation,Javascript,Jquery,Event Delegation,我有一个函数,简化如下: var fooFunction = function($container, data) { $container.data('foobarData', data); $container.on('click', 'a', function(e) { var data = $(e.delegateTarget).data('foobarData'); var $target = $(e.currentTarget); if (type
var fooFunction = function($container, data) {
$container.data('foobarData', data);
$container.on('click', 'a', function(e) {
var data = $(e.delegateTarget).data('foobarData');
var $target = $(e.currentTarget);
if (typeof data.validateFunction === 'function' && !data.validateFunction(e)) {
return;
}
e.preventDefault();
e.stopPropagation();
// Do stuff
console.log(data.returnText);
});
};
fooFunction('.same-container', {
validateFunction: function(event) {
return $(e.currentTarget).closest('.type-companies').length ? true : false;
},
returnText: 'Hello Company!',
});
fooFunction('.same-container', {
validateFunction: function(event) {
return $(e.currentTarget).closest('.type-humans').length ? true : false;
},
returnText: 'Hello Human!',
})
我在同一容器(.same container
)上使用事件委派,并使用自定义的validateFunction()
来验证//Do stuff
中的代码是否应该运行
对于每个fooFunction()
初始化,我都有一些不同的逻辑,它们将在//Do stuff
上被调用。问题是这两个活动代表团之间存在冲突。似乎只调用了其中一个并覆盖了另一个
如何使多个事件委派具有通过自定义validateFunction定义应调用哪个委派的选项。我使用
preventDefault()+stopPropagation()
所以点击一个
,只要validateFunction()
返回true
就不会发生任何事情。问题是每次都在覆盖$(e.delegateTarget).data('foobarData')
相反,您可以将这些选项添加到数组中,并在数组中循环,直到找到匹配项
var fooffunction=function($container,data){
var oldData=$container.data('foobarData',data);
如果(oldData){//已委派,请添加新数据
oldData.push(数据);
$container.data('foobarData',oldData);
}否则{//第一次,创建初始数据和委托处理程序
$container.data('foobarData',[data]);
$container.on('click','a',函数(e){
var data=$(e.delegateTarget).data('foobarData');
var$target=$(e.currentTarget);
var index=data.find(data=>typeof data.validateFunction==='function'&&!data.validateFunction(e));
如果(索引>-1){
var foundData=数据[索引]
e、 预防默认值();
e、 停止传播();
//做事
console.log(foundData.returnText);
}
});
}
}
您应该提到您使用的是jQuery。@EduardoEscobar true我还想建议使用元素。addEventListener(…)
在我看到jQuery之前,每次调用fooFunction()时,在一个事件中有多个函数一直对我有效
它覆盖容器的foobarData
数据。顺便说一句,在代码$container中应该是字符串,而不是jQuery对象。感谢您的帮助!我的.data()
被调用了两次,因此第二次调用覆盖了第一次调用,我没有看到!这会解决它的!谢谢