mirror of https://github.com/layui/layui
优化 `util.on()` 方法,以实现委托元素的互不干扰
parent
8f782fb11e
commit
92c85805c2
|
@ -410,25 +410,36 @@ layui.define('jquery', function(exports){
|
||||||
|
|
||||||
var elem = options.elem = $(options.elem);
|
var elem = options.elem = $(options.elem);
|
||||||
var attrSelector = '['+ attr +']';
|
var attrSelector = '['+ attr +']';
|
||||||
var CALLBACK = 'UTIL_ON_CALLBACK';
|
var DATANAME = 'UTIL_ON_DATA'; // 缓存在委托元素上的 data-* 属性名
|
||||||
|
|
||||||
if (!elem[0]) return; // 若委托元素不存在
|
if (!elem[0]) return; // 若委托元素不存在
|
||||||
|
|
||||||
// 根据 attr 记录事件集合
|
// 初始化 data 默认值
|
||||||
events = util.on[attr] = $.extend(true, util.on[attr], events) || {};
|
if (!elem.data(DATANAME)) {
|
||||||
|
elem.data(DATANAME, {
|
||||||
|
events: {},
|
||||||
|
callbacks: {}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
// 清除事件委托
|
// 读取 data 缓存,以委托元素为存储单元
|
||||||
util.on[CALLBACK] = util.on[CALLBACK] || {};
|
var dataCache = elem.data(DATANAME);
|
||||||
elem.off(options.trigger, attrSelector, util.on[CALLBACK][attr]);
|
var callbacks = dataCache.callbacks;
|
||||||
|
|
||||||
|
// 根据 attr 记录事件集合
|
||||||
|
events = $.extend(true, dataCache.events, events) || {};
|
||||||
|
|
||||||
|
// 清除事件委托,避免重复绑定
|
||||||
|
elem.off(options.trigger, attrSelector, callbacks[attr]);
|
||||||
|
|
||||||
// 绑定事件委托
|
// 绑定事件委托
|
||||||
elem.on(
|
elem.on(
|
||||||
options.trigger,
|
options.trigger,
|
||||||
attrSelector,
|
attrSelector,
|
||||||
util.on[CALLBACK][attr] = function() {
|
callbacks[attr] = function(e) {
|
||||||
var othis = $(this);
|
var othis = $(this);
|
||||||
var key = othis.attr(attr);
|
var key = othis.attr(attr);
|
||||||
typeof events[key] === 'function' && events[key].call(this, othis);
|
typeof events[key] === 'function' && events[key].call(this, othis, e);
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue