前言
zepto是一个轻量级的类jQuery的JavaScript库,适合在移动端页面开发使用。轻量又提供许多dom操作API。
前面我们讲解了zepto模块,现在来看看event模块。
event模块
整体结构:
先看下面代码1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>event</title>
</head>
<body>
<div class="a"></div>
</body>
</html>
<script src="../../src/zepto.js"></script>
<script src="../../src/event.js"></script>
<script>
var obj = {name: 'Zepto'},
handler = function(){ console.log("hello from + ", this.name) }
$(document).on('click', $.proxy(handler, obj))
</script>
<script>
$.Event('myevent')
$(document).on('myevent',".a", function(e, from, to){
console.log('change on %o with data %s, %s', e.target, from, to)
})
$(".a").trigger('myevent', ['one', 'two'])
</script>
上面的实例代码,基本将event模块上的主要方法和内容包含了
$.proxy(),$.Event(),on(),trigger()
这些方法。在zepto的官方文档中,其明确不推荐我们用bind等方法绑定事件,其实bind调用是on()方法,所以用on()绑定事件更好。
$.proxy()
1 | $.proxy v1.0+ |
接受一个函数,然后返回一个新函数,并且这个新函数始终保持了特定的上下文(context)语境,新函数中this指向context参数。另外一种形式,原始的function是从上下文(context)对象的特定属性读取。
源码:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18$.proxy = function(fn, context) {
var args = (2 in arguments) && slice.call(arguments, 2)
if (isFunction(fn)) {
var proxyFn = function(){ return fn.apply(context, args ? args.concat(slice.call(arguments)) : arguments) }
proxyFn._zid = zid(fn)
return proxyFn
} else if (isString(context)) {
if (args) {
args.unshift(fn[context], fn)
return $.proxy.apply(null, args)
} else {
return $.proxy(fn[context], fn)
}
} else {
throw new TypeError("expected function")
}
}
源码的实现其实很简单,主要用的apply强绑定this执行上下文。不加细说。
$.Event()
执行这么一段代码console.log($.Event('myevent') )
,这里返回一个Event对象。
1 | // Event对象 |
那么$.Event()代码是如何执行的
1 | $.Event = function(type, props) { |
细节说明
1 |
|
on()绑定事件
1 | /* |
- 输出其中关键变量 handler事件句柄对象和set数组
1 | // Handler对象 |
$.trigger()
1 | $.fn.trigger = function(event, args){ |
其思路为:
先判断是否支持原生接口dispatchEvent。
如果支持,直接调用。
1
2
3
4* EventTarget.dispatchEvent(event):向一个指定的EventTarget派发一个事件,以合适的顺序触发受影响的EventListeners
* event:要被派发的event事件;EventTarget是指被初始化的Event.target和决定触发event listeners。
* 当至少一个该事件的 event handler 调用了Event.preventDefault(),则返回值为false;否则返回true。
cancelled = !target.dispatchEvent(event)
如果不支持,则调用自己实现的函数triggerHandler()
$.off()
1 | // 主要函数remove(),主要api:removeEventListener() |
- remove()函数中,delete操作符删除句柄对象,并调用removeEventListener移除监听事件。