Skip to content

Commit

Permalink
Added dom event management
Browse files Browse the repository at this point in the history
  • Loading branch information
otakustay committed Mar 29, 2013
1 parent 40a780a commit b1756fb
Showing 1 changed file with 126 additions and 0 deletions.
126 changes: 126 additions & 0 deletions src/controlHelper.js
Original file line number Diff line number Diff line change
Expand Up @@ -485,6 +485,132 @@ define(
return input;
};

var domEventsKey = '_esuiDOMEvent';

function triggerDOMEvent(e) {
var queue = this.domEvents[e.target[domEventsKey]][e.type];
for (var i = 0; i < queue.length; i++) {
queue[i].call(this, e);
}
}

/**
* 为控件管理的DOM元素添加DOM事件
*
* @param {Control} control 控件实例
* @param {HTMLElement} element 需要添加事件的DOM元素
* @param {string} type 事件的类型
* @param {function} handler 事件处理函数
*/
helper.addDOMEvent = function (control, element, type, handler) {
if (!control.domEvents) {
control.domEvents = {};
}

var guid = element[domEventsKey];
if (!guid) {
guid = element[domEventsKey] = getGUID();
}

var events = control.domEvents[guid];
if (!events) {
// `events`中的键都是事件的名称,仅`element`除外,
// 因为DOM上没有`element`这个事件,所以这里占用一下没关系
events = control.domEvents[guid] = { element: element };
}

var queue = events[type];
if (!queue) {
queue = events[type] = [];
queue.handler = lib.bind(triggerDOMEvent, control);
if (element.addEventListener) {
element.addEventListener(type, queue.handler, false);
}
else {
element.attachEvent('on' + type, queue.handler);
}
}

queue.push(handler);
};

/**
* 为控件管理的DOM元素添加DOM事件
*
* @param {Control} control 控件实例
* @param {HTMLElement} element 需要添加事件的DOM元素
* @param {string} type 事件的类型
* @param {function} handler 事件处理函数
*/
helper.removeDOMEvent = function (control, element, type, handler) {
if (!control.domEvents) {
return;
}

var guid = element[domEventsKey];
var events = control.domEvents[guid];

if (!events || !events[type]) {
return;
}

if (!handler) {
events[type] = [];
}
else {
var queue = events[type];
for (var i = 0; i < queue.length; i++) {
if (queue[i] === handler) {
queue.splice(i, 1);
// 可能有重复注册的,所以要继续循环
i--;
}
}
}
};

/**
* 清除控件管理的DOM元素上的事件
*
* @param {Control} control 控件实例
* @param {HTMLElement=} element 控件管理的DOM元素,
* 如果没有此参数则去除所有该控件管理的元素的DOM事件
*/
helper.clearDOMEvents = function (control, element) {
if (!control.domEvents) {
return;
}

if (!element) {
for (var guid in control.domEvents) {
if (control.domEvents.hasOwnProperty(guid)) {
var events = control.domEvents[guid];
helper.clearDOMEvents(control, events.element);
}
}
return;
}

var guid = element[domEventsKey];
var events = control.domEvents[guid];
// `events`中存放着各事件类型,只有`element`属性是一个DOM对象,
// 因此要删除`element`这个键,
// 以避免`for... in`的时候碰到一个不是数组类型的值
delete events.element;
for (var type in events) {
if (events.hasOwnProperty(type)) {
var handler = events[type].handler;
if (element.removeEventListener) {
element.removeEventListener(type, handler, false);
}
else {
element.detachEvent('on' + type, handler);
}
}
}
delete control.domEvents[guid];
}

return helper;
}
);

0 comments on commit b1756fb

Please sign in to comment.