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()
被调用了两次,因此第二次调用覆盖了第一次调用,我没有看到!这会解决它的!谢谢