Event 模块
Event 用法:
1.直接使用
var $ = KISSY.all;
$('body').on('click', function(ev){
console.log(ev)
});
2.普通对象的自定义事件
var a = {}, S = KISSY;
S.mix(a, S.Event.Target);
a.on('my_event', function(ev){
console.log(ev)
});
a.fire('my_event', {"data1": 1, "data2": 2});
未列出的Event API与KISSY保持用法一致
API |
KISSY |
KISSY-MINI |
Event.Object |
YES |
NO |
Event.Target.publish |
YES |
NO |
Event.Target.addTarget |
YES |
NO |
Event.Target.removeTarget |
YES |
NO |
mouseenter |
YES |
NO |
mouseleave |
YES |
NO |
mousewheel |
YES |
NO |
gestures |
YES |
Import touch.js* |
|
|
|
与 zeptojs 对比,有以下差异:
- 去除对鼠标兼容事件的支持,包括 mouseenter/mouseleave;
- 提供对普通对象的自定义事件支持,需提前混入 S.Event.Target
与 KISSY 对比,有以下差异:
- 仅支持链式调用,不支持 Event.on 语法;
- 自定义事件不支持冒泡等属性和方法;
- 回调返回的 event 对象是兼容处理后的原生事件对象,不再提供 ev.originalEvent
- delegate方法绑定的事件触发机制和on绑定的事件触发机制不一致(比如 delegate 绑定的事件冒泡被阻止后,在delegate中可能不生效)
触控事件需额外引入 touch.js;1.0 版本之后内置 touch 模块
需要注意
KISSY MINI 极大的简化了事件机制,特别是on
方法和delegate
方法二者公用同一个attach
方法,而且在底层addEventListener
事件时的DOM节点均以delegate的最外层节点为挂载对象,所以事件的触发机制在on和delegate事件中不以有序的冒泡顺序执行,有些小众场景可能会带来bug,可以参照测试用例。但考虑到无线场景的简单和单一,所以此处并未做深入 hack。这也减少代码复杂度,进一步控制住了体积。
(function(S){
S.Event || (S.Event = {});
var $ = S.all,
Node = S.node,
_eid = 1,
isFunction = function(obj){
return typeof obj == 'function';
},
mix = function(target, source) {
for (var key in source) {
target[key] = source[key];
}
},
each = function(obj, iterator, context) {
Object.keys(obj).map(function(name){
iterator.call(context, obj[name], name, obj);
});
},
slice = [].slice,
handlers = [],
focusinSupported = 'onfocusin' in window,
focusEvent = {
focus: 'focusin',
blur: 'focusout'
},
specialEvents = {
"click": "MouseEvent"
},
eventMethods = {
preventDefault: 'isDefaultPrevented',
stopImmediatePropagation: 'isImmediatePropagationStopped',
stopPropagation: 'isPropagationStopped'
},
stoppedDOMNode = [],
originalEventTimeStamp;
function returnBool(trueOrFalse) {
return function(){ return trueOrFalse; };
}