首页 > 代码库 > javascript事件之:jQuery事件中Data数据结构

javascript事件之:jQuery事件中Data数据结构

  之前我们模拟过jQuery的自定义事件,数据是直接绑定在元素上面。但我们知道,那样容易引起内存泄露。我们看看jQuery是如何做到的。

  其实,jQuery的事件是基于Data开发的,其核心的三个方法add(), remove()和trigger()都是和Data对象在打交道。让我们来剖析jQeury事件的核心:Data数据结构。

  首先在jQuery源码中把其console出来。

  1 jQuery.event = {  2   3 global: {},  4   5 add: function( elem, types, handler, data, selector ) {  6     console.log(elemData)  7 },  8 ...
 1 var $clickTrigger = $("#clickTrigger"); 2 //var $doTrigger = $("#doTrigger"); 3 $clickTrigger.on("click", function(a){ 4     console.log(1) 5 }) 6 $clickTrigger.on("click", function(b){ 7     console.log(2) 8 }) 9 $clickTrigger.on("mouseover", function(c){10     console.log(3)11 })

html代码

<input id="clickTrigger" type="button" value="http://www.mamicode.com/click事件" />

这个时候我们可以看到的结构是:

 1 var elemData =http://www.mamicode.com/ { 2     events: { 3         click:[//还有一个delegateCount属性 4             { 5                 data: undefined,//传递的参数 6                 guid: 1,//当前事件唯一标识,根据绑定顺序分配 7                 handler: function(a){},//绑定的是普通函数 8                 namespace: "",//命名空间 9                 needsContext: undefined,//委托,伪类的写法10                 origType: "click",//原始的事件类型,如mouseenter11                 selector: undefined,//放的是委托元素12                 type: "click"//现在的事件类型,如mouseover13             },14             {15                 data: undefined,16                 guid: 2,17                 handler: function(b){},18                 namespace: "",19                 needsContext: undefined,20                 origType: "click",21                 selector: undefined,22                 type: "click"23             }24         ],25         mouseover:[//还有一个delegateCount属性26             {27                 data: undefined,28                 grid: 3,29                 handler: function(c){},30                 namespace: "",31                 needsContext: undefined,32                 origiType: "mouseover",33                 selector: undefined,34                 type: "mouseover"35             }36         37         ]        38     },39     handle: function(e){}//绑定事件的真正函数40 }

这个就是jQuery事件对象Data的结构:

events对象:绑定函数类型的集合,每个事件对应一个数组(可能绑定多次) 

handler方法:指的是绑定事件的真正函数

我们对红色部分解释一下

data:传递的参数

如:

var $clickTrigger = $("#clickTrigger");$clickTrigger.on("click", 100, function(a){    console.log(a.data)})

这个时候,我们看到的data是:data: 100

guid: 唯一的标识符

handler:绑定事件的普通函数

namespace:类型外的二次标志

如:

var $clickTrigger = $("#clickTrigger");$clickTrigger.on("click.bbb", function(a){    console.log(1)})

得出:namespace:bbb

应用:比如说我们给document绑定了很多事件,但是我只想取消绑定其中一个函数

var $clickTrigger = $("#clickTrigger");$clickTrigger.on("click.bbb", function(a){    console.log(1)})$clickTrigger.on("click.aaa", function(a){    console.log(2)})$clickTrigger.off("click.aaa")

点击只会输出“1”

needsContext:默认是undefined,有委托并且委托的元素不是伪类的时候为false,有委托并且委托的元素是伪类的时候为true

var $clickTrigger = $("#clickTrigger");$clickTrigger.on("click","i", function(a){console.log(1)})

这个时候needsContext:false

var $clickTrigger = $("#clickTrigger");$clickTrigger.on("click","i:first", function(a){console.log(1)})

这个时候needsContext:true

origType,type:有的时候由于浏览器的兼容性需要模拟事件,比如说mouseenter

var $clickTrigger = $("#clickTrigger");$clickTrigger.on("mouseenter", function(a){    console.log(1)})

这个时候origType:mouseenter,type:mouseover

selector:

var $clickTrigger = $("#clickTrigger");$clickTrigger.on("click","i", function(a){console.log(1)})

selector: "i"

这个就是jQuery事件的Data数据结构及其详细解释。

下次有时间再探讨下jQuery下关于事件的具体代码实现。

 

 

  

javascript事件之:jQuery事件中Data数据结构