jQuery1.9.1源分析系列(十)主动触发事件和模拟气泡处理事件系统

jQuery1.9.1源分析系列(十)主动触发事件和模拟气泡处理事件系统
找到一个以前没有注意到的小点。
StopPropagation: function () {
var = this.originalevent;

如果(e.stoppropagation){
e.stoppropagation();
}
这个jQuery重载函数调用防止泡沫里面的局部事件对象里面的功能。也就是说,它是当前节点,而不是事件的来源,防止泡沫。

当谈到触发事件时,我们的第一个反应是使用$(…)Click()来触发点击事件。毫无疑问,如果这种方式可以这样使用,建议使用这种方式。但是如果它是一个自定义事件呢例如,一个定义(document),(chuaclick 这是使用美元(#中间),Trigger(chuaclick )。

A.低级别的API,jquery.event.trigger触发事件
触发功能支持所有类型的事件触发的,这些事件主要分为两类:常见的浏览器事件(包括命名空间,如点击。事件蔡),自定义事件。因为统一处理,该函数的内部实现不叫。单击()在这这样做快捷方式的普通浏览器事件,但统一的过程。过程如下

1。获取要触发的事件(传入事件可能是事件类型,而不是事件对象)
事件= { jquery.expando:新的jQuery事件。事件(事件类型,事件类型为对象事件);
2。修改的浏览器事件(主要是修改过的事件源)和正确的事件处理参数数据的组合
如果(type.indexof(,)> = 0){
命名空间事件事件处理函数;首先使用事件类型输入入口句柄()
命名空间= type.split(,);
类型= namespaces.shift();
Namespaces.sort();
}
来电者可以通过…事件对象,普通对象,甚至字符串
事件=事件{ jQuery expando }。
事件:
新的(jquery.event类型,类型的事件=对象事件);
event.istrigger =真;
event.namespace = namespaces.join(,);
event.namespace_re = event.namespace
新的正则表达式((^ | 。)+ namespaces.join(。(:* 。|))+(。|美元)):
无效的;
重新设置结果属性,避免最后的结果
event.result =定义;
如果(!事件(目标){
event.target =元;
}
数据和参数的复制将被放置在参数数据前面,在入口后创建一个事件处理函数的参数列表,创建结果可以是{事件,数据}。
数据=数据= null
{事件}:
JQuery.makeArray(数据,{事件});
组合事件处理参数列表数据的后一部分在稍后处理时调用。
如果(句柄){
handle.apply(CUR,数据);
}
三.确定它是否是特殊的节点对象的特殊事件是一种特殊处理。
特殊= jQuery事件。特殊类型| | } { } {;
如果(onlyhandlers special.trigger!special.trigger.apply(元素、数据)= false){
返回;
}
需要特殊处理的事件较少,这里有一个列表
特殊:{
Click.trigger:(功能){ / /复选框,触发本地事件以确保正确的状态,如果(jquery.nodename(,输入)this.type =复选框,单击){
This.click();
返回false;
}
},
Focus.trigger:(功能){ / /触发事件确保正确的序列如果 /焦点散焦(这!= = document.activeelement这个焦点){
{试
This.focus();
返回false;
} catch(e){
支持:< < < > > 9
我们错误的焦点/如果隐元(# 1486,# 12518),
让. Trigger(运行)处理程序
}
}
},
Blur.trigger:(功能){ if(= document.activeelement这个模糊){
This.blur();
返回false;
}
}
}
4。开始遍历父节点从源到窗口对象,通过节点保存(保存到eventpath)站在
为(;;电流;电流=电流。parentNode){
EventPath.push(CUR);
当前版本;
}
窗口也将按eventpath /(例如,不是一个普通的对象不是断开的DOM)
如果(TMP =(elem.ownerdocument | |文件)){
EventPath.push(tmp.defaultview tmp.parentwindow窗口| | | |);
}
5、循环以前保存的节点以访问节点缓存。If the corresponding event type is processed, the binding event (the entry function) is retrieved.      
绑定函数:确定是否保存了相应的事件处理函数节点缓存。
处理=(jQuery。_data(CUR,事件)| | { }){ } jQuery事件。型。_data(CUR,手柄);
如果(句柄){
handle.apply(CUR,数据);
}
本地绑定处理
处理= ON ON电流{ };
如果(处理jquery.acceptdata(CUR)handle.apply handle.apply(CUR,数据)= false){
Event.preventDefault();
}
6。最后处理浏览器默认事件,比如提交标签的提交表单处理。
如果没有人停止处理默认/执行
如果(!onlyhandlers!event.isdefaultprevented()){

}
注:与命名空间,普通事件,仍属于普通事件,和常见的调用仍然有效。例如,$(document),(一。蔡、# ID 才能触发指定命名空间事件触发:$(# ID(Trigger)。点击。蔡),只有在这个时候,FN1调用。

从第四,第五个步骤,你可以看到另一个巨大的触发模拟气泡处理的效果。

B.事件的特殊处理jquery.event.special(主要事件置换,模拟气泡)详细解决方案
委托设计是基于可活泼的事件。但有些事件不鼓泡,和一些事件在不同的浏览器的不同,也有不同的类型采用不同的浏览器支持的事件。这些过程都是放在jquery.event.special.the jquery.event.special对象保存所需要的特定事件的变量和方法

具体来说,有:

delegatetype / bindtype(对事件类型的调整

安装程序(在事件的第一个绑定时调用)

添加(在事件绑定时调用)

删除(在事件绑定被解除时调用)

拆卸(打电话的时候,所有的事件绑定将被删除)

Trigger(当内部触发事件调用)

nobubble

_default

句柄(当事件实际触发时调用)

PreDispatch(前实际触发事件调用)

PostDispatch(后称为实际触发事件)

模拟气泡的功能模拟
模拟:功能(类型、元素、事件、泡沫){
创建一个新事件来区分以前绑定的事件。
新构建的事件避免了阻塞泡沫,但如果模拟事件可以防止默认操作,则我们执行相同的操作以防止默认设置。
VaR(E = jquery.extend
新jQuery事件(),
事件,
{类型:类型,
真实模拟,
originalevent:{ }
}
);
如果(泡){
JQuery.event.trigger(E,null元素);
{人}
jquery.event.dispatch.call(元素,E);
}
如果(e.isdefaultprevented()){
Event.preventDefault();
}
}
看见没有,真实模拟气泡的功能是jquery.event.trigger功能

特殊的第一组

这涉及到泡沫处理的问题。
特殊:{
负载:{
停止/触发image.load事件冒泡到window.load
NoBubble:真的
},
点击:{
确保当触发复选框时状态是正确的。
触发器:函数({)({单击)(…);返回false;}
},
焦点:{
当前节点模糊/焦点/触发事件队列以确保正确
触发器:函数(){
如果(这个)!= = document.activeelement这个焦点){
{试
This.focus();
返回false;
} catch(e){
/ /即<9,如果我们犯错误隐藏节点获得焦点(# 1486,# 12518),
让(触发器)处理器操作
}
}
},
DelegateType:热点
},
模糊:{
触发器:函数(){
如果(= document.activeelement这个模糊){
This.blur();
返回false;
}
},
DelegateType:focusout
},
beforeunload:{
postdispatch:功能(事件){
即使 /值等于没有定义,火狐仍然会显示警告
如果(event.result!=未定义的){
event.originalevent.returnvalue = event.result;
}
}
}
}
焦点/模糊不冒泡,但我们仍然可以绑定美元(文件)。在('focus','左' #,FN),你是怎么做到的让我们来看一下jQuery的处理

第一步是将重点结合事件为重点的结合。重点是在W3C标准的鼓泡。除了Firefox,浏览器也支持冒泡。(Firefox的焦点/ focusout支持泡沫的兼容性。稍后,它将详细解释)。

类型=(选择special.delegatetype特殊。bindtype)| |型;
然后,得到新的特殊的基于新收购的类型(重点)

特殊= jQuery事件。特殊类型| | } { } {;
获得的特殊结果如下
jquery.each({重点:重点
var = 0,
函数(事件){
气泡/模拟
jquery.event.simulate(固定,event.target,jquery.event.fix(事件),真的);
};
事件。
安装程序:函数(){
如果(连接+ + = 0){
Document.addEventListener(1,处理程序,真的);
}
},
拆卸:函数(){
如果(- = = 0){
Document.removeEventListener(1,处理程序,真的);
}
}
};
});
然后,它是绑定事件。结合事件实际上是重点和focusout兼容。在源代码中的第一个是special.setup.call(…)。这个代码,根据上述功能时,安装程序首先进入可见光实际上是通过设置功能document.addeventlistener(原版,处理程序,真的)结合的活动,注意:第一个参数是原始的,因为浏览器不支持重点 / focusout所以使用jquery焦点/模糊而不是听事件;注意,第三个参数是真正的触发,表示在事件捕获阶段的事件。

我们知道,任何浏览器捕获由外层到精确的节点,所有的焦点事件将被捕获,然后执行处理函数(里面是jquery.event.simulate功能,源代码)。其他事件绑定输入如果分支绑定事件直接的元素
如果(special.setup | |!special.setup.call(元素、数据、命名空间、eventhandle)= false){
如果(元素。addEventListener){
elem.addeventlistener(类型,eventhandle,假);
} else if(元素。attachevent){
elem.attachevent(+型,eventhandle);
}
}

特殊二组:MouseEnter和MouseLeave
使用鼠标悬停 / / / /离开创建MouseEnter事件和事件定时检测
jquery.each({
Mouseenter:鼠标悬停
MouseLeave:怪
},功能(1,固定){
jquery事件。特殊{ } = { orig
DelegateType:修复,
BindType:修复,
句柄:函数(事件){
VaR RET,
目标=此,
event.relatedtarget相关=,
handleobj = event.handleobj;
对于mousenter /离开,当相关目标外调用处理程序
/参考:当鼠标离开/进入浏览器窗口不relatedtarget
如果(相关| |!(相关!=目标!jquery.contains(目标、相关))){
event.type = handleobj.origtype;
ret = handleobj.handler.apply(这个参数);
event.type =固定;
}
返回页首;
}
};
});
需要注意的是,MouseEnter事件触发鼠标指针经过选择的元素只有当重要。在MouseLeave的情况下,子元素的MouseEnter不会触发事件的反复,或在伊江有一个频繁闪烁

使用鼠标悬停/和事件定时检测MouseEnter /创作离开事件有一个关键的判断
如果(相关| |!(相关!=目标!jquery.contains(目标、相关的)))
其中!jquery.contains(目标、相关)意味着相关以外的目标。我们使用图解说明

我们假设我们正在处理MouseEnter事件和进入目标。

鼠标从相关到目标,很明显相关是外部目标,所以当鼠标移动到目标时,它就满足条件和调用处理。
U3000 U3000

现在,反过来,这是显而易见的,相关的是在目标状态之前,老鼠在MouseEnter状态(即MouseEnter处理器已被处理之前),避免重复调用,当然,没有经过任何处理,直接返回。
U3000 U3000

我们假设我们正在处理MouseLeave事件,离开目标。

从目标到相关,很明显相关是在目标中,所以当鼠标移动到相关时,它仍然不会离开目标。
U3000 U3000

从目标到相关,很明显相关是外部目标,所以当鼠标移动到相关时,它就离开了目标的范围进行处理。
U3000 U3000

特殊第三组:提交和更改

最主要的是IE提交不能处理冒泡。

jquery.event.special.submit有几个主要特点

安装程序

postdispatch

拆卸

根据添加到事件的代码,我们知道当添加一个事件时,安装程序被调用来添加一个事件,如果它是合格的。

如果(special.setup | |!special.setup.call(元素、数据、命名空间、eventhandle)= false)

jQuery模拟提交事件下的IE是通过点击和按键所取代,只有通过添加命名空间来区分普通的点击和按键事件之间。
安装程序:函数(){

JQuery.event.add(这个,点击。_submit按键。_submit
var elem = e.target,
形式= jquery.nodename(元素、输入)| | jquery.nodename(元素、按钮)elem.form:未定义;
如果(形式)!jQuery。_data(形式,submitbubbles )){
JQuery.event.add(表格,提交_submit 。
_submit_bubble =真实事件;
});
jQuery。_data(形式,submitbubbles
}
});
},
事件调用期间(调度),这postdispatch被调用来处理
如果(特别postdispatch){
special.postdispatch.call(此事件);
}
通过模拟在postdispatch完成事件处理
postdispatch:功能(事件){
表单由用户提交,将事件冒泡到树上。
如果(事件。_submit_bubble){
_submit_bubble删除事件;
如果(this.parentnode!事件。istrigger){
jquery.event.simulate(提交
}
}
},
拆卸用于删除事件绑定

改变事件处理类似事件在IE提交而不是处理beforeactivate监测。处理函数成为事件分发(分发)中的句柄和执行代码。
(ret =(jquery事件。特殊{ handleobj.origtype.handle handleobj.handler | | | | } { }))
申请(matched.elem,args);
主要的源代码如下所示
jquery.event.special.change = { {
安装程序:函数(){
/ / rformelems = $ /我/ ^(输入|选择| textarea)
如果(rformelems.test(这个节点名称)){
更改将在检查/无线电散焦中触发事件;触发属性更改事件后的单击。
在special.change.handle /改变将吞下散焦的触发事件。
这将触发onchange /检查/无线电中的焦点事件。
如果(this.type =复选框| | this.type =无线电){
JQuery.event.add(,propertychange _change 。
如果(event.originalevent.propertyname =检查){
这_just_changed =真;
}
});
JQuery.event.add(,点击_change 。
如果(这_just_changed!事件。istrigger){
这_just_changed = false;
}
模拟变化 / /触发事件(#允许,11500)
jquery.event.simulate(变化
});
}
返回false;
}
事件代理;为输入节点的后代提供的延迟模式添加更改事件处理
JQuery.event.add(,beforeactivate _change 。
var elem = e.target;
如果(rformelems.test(元素。它们)!jQuery。_data(元素,changebubbles )){
JQuery.event.add(元,的变化。_change
如果(this.parentnode!event.issimulated!事件。istrigger){
jquery.event.simulate(变化
}
});
jQuery。_data(元素,changebubbles
}
});
},
句柄:函数(事件){
var elem = event.target;
燕子 /本地单选按钮和复选框更改事件,我们已经制定了在上述事件
如果这个= =元(event.issimulated event.istrigger!| | | | | |(elem.type!= =无线电elem.type!{复选框){
返回event.handleobj.handler.apply(这个参数);
}
},
}
好了,这里的事件系统也有一段,谢谢大家多多支持。
免责声明:本网信息来自于互联网,目的在于传递更多信息,并不代表本网赞同其观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,并请自行核实相关内容。本站不承担此类作品侵权行为的直接责任及连带责任。如若本网有任何内容侵犯您的权益,请及时联系我们,本站将会在24小时内处理完毕。
相关文章
返回顶部