【发布时间】:2018-07-12 19:30:06
【问题描述】:
我有一个函数,简化如下:
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(),所以点击<a>,只要validateFunction()返回true,什么都不会发生。
【问题讨论】:
-
你应该提到你正在使用 jQuery。
-
-
每次调用
fooFunction()都会覆盖容器的foobarData数据。 -
顺便说一句,在您的代码中 $container 将是一个字符串,而不是一个 jQuery 对象。
标签: javascript jquery event-delegation