宝哥软件园

阅读jQuery XIV(触发事件的核心方法)

编辑:宝哥软件园 来源:互联网 时间:2021-10-18

在事件模块的演进中,我使用了dispatchEvent(标准)和fireEvent(IE)来主动触发事件。以下复制代码如下:dispatch=w3c?函数(el,type){ try { var evt=document . createevent(' Event ');evt.initEvent(type,true,true);El . dispatchevent(evt);} catch(e){ alert(e)};} :函数(el,type){尝试{ el.fireEvent('on '类型);} catch(e){ alert(e)} };jQuery根本不使用dispatchEvent/fireEvent方法。它使用不同的机制。jQuery触发事件的方法是jQuery.event.trigger.它为客户端程序员提供了两种触发事件的方法:触发器/。triggerhandler

某些元素中事件的发生可能会导致两个动作,一个是默认行为,另一个是事件处理程序。例如,link aa href=' http://mail . Sina.com . cn ' onclick=' alert(1);'点击新浪邮箱/a后,弹出1(事件处理程序),点击确定跳转(默认行为)到mail.sina.com.cn。因此,触发事件的设计功能应考虑这两种情况。JQuery使用。扳机和。triggerHandler来区分这两种情况:trigger执行事件handler/执行冒泡/执行默认行为。triggerHandler执行事件处理程序/不冒泡/不执行默认行为。的源代码。triggerHandler如下:trigger:函数(类型,数据){返回这个。每个(函数(){jquery。事件。触发器(类型、数据、本);});},triggerHandler:函数(类型,数据){ if(this[0]){ return jquery . event . trigger(类型,数据,this[0],true);}},可以看出两者都调用jQuery.event.trigger.调用时,一个没有传递true,另一个传递。传递true的触发器处理程序意味着只执行事件处理程序。另外,注意区别:触发器是对jQuery对象集合的操作,而。triggerHandler只对jQuery对象的第一个元素进行操作。下面的代码复制如下: pp1/PPP 1/PPP 1/pstcript $(' p ')。click(function(){ alert(1)});$('p ')。触发器(' click ');//播放三次,即三个P的所有点击触发$('p ')。triggerHandler(' click ');//只播放一次,也就是只触发第一个p的click /script,那么就到了发布jQuery.event.trigger的代码的时候了复制代码如下: trigger : function(Event,data,elem,onlyHandlers ) { //Event对象或事件类型var type=event.type || event,namespace=[],exclusive.}这是jQuery.event.trigger的定义,大部分省略了。以下重复代码列表如下: if (type.indexOf(!)).)=0 ) { //Exclusive事件仅针对确切的事件触发(无命名空间)类型=type.slice(0,-1);排他=真;}这一段是要处理的。触发器('咔嚓!'。),即在非命名空间中触发事件。变量exclusive挂在事件对象上后,在jQuery.event.handle中使用。例如,复制代码如下:函数fn1 () {console.log (1)}函数fn2 () {console.log (2)} $(文档)。绑定('点击。a ',fn1);$(文档)。绑定(' click ',fn2);$(文档)。触发器('咔嚓!');//2为文档增加了两个click事件,一个是带命名空间的‘click . a’,另一个不是‘click’。添加感叹号“!”使用trigger时参数点击后。从2的输出结果可以看出,命名空间的事件没有被触发。总结一下,触发器(“点击”)触发所有点击事件。触发器(' click.a ')只触发“click.a”的点击事件。)触发非命名空间的click事件,然后查看复制代码如下: if(类型。的索引('.')=0){//命名空间触发器;创建一个正则表达式来匹配handle()命名空间=type.split(' . '中的事件类型);type=namespace . shift();namespace . sort();}这一段很容易理解,也就是的处理。trigger('click.a '),即处理带有名称空间的事件。然后看复制代码如下: if((!elem | | jquery . event . customevent[type])!jQuery.event.global[ type ] ) { //此事件类型没有jQuery处理程序,不能有内联处理程序返回;}对于某些特殊事件,如‘getData’或已经触发的事件,直接返回。

往下复制代码代码如下:事件=事件类型==='对象?//jQuery .事件对象事件[ jQuery.expando ]?事件: //对象文字新jQuery .事件(类型,事件): //只是事件类型(字符串)新jQuery .事件(类型);有三种情况,事件本身就是jQuery .事件类的实例,事件是个普通射流研究…对象(非jQuery .事件类的实例),事件是个字符串,如点击续event . type=type event . exclusive=独占;事件。命名空间=命名空间。联接(' . ');新RegExp('(^|\.)"命名空间。join('\ ' .(?*\.)?') '(\.|$)');需要注意独占/命名空间/命名空间_re挂到了事件上了,在jQuery.event.handle中可以用到(事件命名空间)。往下是复制代码代码如下:///triggerHandler()和全局事件不会冒泡或运行默认操作,如果(onlyHandlers ||!elem){ event。prevent default();事件。stopperpagation();} onlyHandlers只在触发处理器.用到了,即不触发元素的默认行为,且停止冒泡。下面是复制代码代码如下: //如果(!elem ) { //TODO:停止嘲讽数据缓存;移除全局事件并始终附加到文档jQuery.each(jQuery.cache,function() { //internalKey变量只是为了更容易找到//,并可能在以后更改这些东西;目前它只是//指向jquery。expando var内部键=jquery。expando,内部缓存=this[内部键];if(内部缓存内部缓存。事件内部缓存。events[type]){ jquery。事件。触发器(事件、数据、内部缓存。把手。elem);} });返回;} 这里是个递归调用。如果没有传初步的元素,那么从jQuery.cache里取。接着是复制代码代码如下: //如果(elem。nodetype===3 | | elem。nodetype===8){ return;} 属性,文本节点直接返回。下面是复制代码代码如下: //克隆任何传入的数据并前置事件,创建处理程序银列表数据=数据!=null?jQuery.makeArray(数据):[];data.unshift(事件);先将参数数据放入数组,事件对象放在数组的第一个位置。接着是复制代码代码如下: //对当前元素进行火事件,然后冒泡数字正射影像图树做{ var handle=jQuery ._data(cur,‘handle’);event . CurrentTarget=curif(handle){ handle . apply(cur,data);} //如果(在jquery类型上。接受数据(cur)cur[on type]cur[on type],则触发内联绑定脚本apply(cur,data)==false){ event。结果=假;事件。prevent default();} //冒泡到文档,然后到窗口cur=cur。parentnode | | cur。ownerdocument | | cur===事件。目标。所有者文档窗口;} while (cur!event.isPropagationStopped这段代码很重要,做了以下事情,取把手,执行,执行通过在XXX方式添加的事件(如onclick='fun()'),取父元素正在…循环不断重复这四步以模拟事件冒泡。直到窗户对象。接下是复制代码代码如下: //如果没有人阻止默认操作,现在就做如果(!事件。isdefaultprevented()){ var old,special=jquery。事件。特殊[类型]| | { };if((!特别的。_默认||特殊_默认值。呼叫(elem。ownerdocument,event)==false)!(类型==='单击' jquery。nodename(elem,a ')jquery。接受数据(elem)){//在目标上调用与事件同名的本机数字正射影像图方法。//不能使用isFunction()()请在此处检查,因为IE6/7未通过该测试//IE9 .死在聚焦到隐藏元素(#1486)上,可能要重访一试/抓一抓。尝试{ if (ontype elem[ type ] ) { //当我们调用其FOO()方法old=elem[ ontype ]时,不要重新触发onFOO事件;if(old){ elem[on type]=null;} jquery。事件。trigged=typeelem[type]();} } catch(IEerror){ } if(old){ elem[on type]=old;} jquery。事件。trigged=undefined} } 这一段是对于浏览器默认行为的触发。如表单。提交(),按钮。单击()等。

注意,由于Firefox中链接的安全限制,jQuery对链接的默认行为统一为不触发。也就是说,链接不能被跳过。触发器()。

更多资讯
游戏推荐
更多+