概念事件是你编程时系统中发生的一个动作或某事。系统响应事件后,您可以根据需要以某种方式响应事件。在Web上,事件在浏览器窗口内触发,并且通常绑定到窗口内的特定部分——无论是元素、元素序列、加载到窗口中的HTML代码,还是整个浏览器窗口。事件流事件流描述页面中接收事件的顺序。“DOM2级事件”规定的事件流程包括三个阶段:事件捕获阶段、目标阶段、事件冒泡阶段。——《JavaScript高级程序设计》按照W3C模型,事件先被目标元素捕获,然后冒泡上去。——《基于MVC的JavaScript Web富应用开发》事件捕获从顶层父节点触发事件,由外向内传播,触发事件originTarget时结束。事件冒泡从内部originTarget节点触发事件,由内向外传播,逐级向上冒泡,直到最顶层节点结束。注意:并非所有事件都支持事件冒泡,blur、focus、load、unload、mouseenter、mouseleave和自定义事件不支持冒泡。防止事件传播e.stopPropagation():大家经常听到的可能是防止冒泡。事实上,这种方法不仅可以防止冒泡,还可以防止捕获阶段的传播。e.stopImmediatePropagation():防止其他侦听同一事件的事件侦听器被调用。如果多个事件侦听器附加到相同事件类型的相同元素,它们将按照此事件触发时添加的顺序被调用。如果在其中一个事件侦听器中执行了stopImmediatePropagation(),则不会调用任何剩余的事件侦听器。阻止事件的默认行为e.preventDefault()可以阻止事件的默认行为发生。默认行为是指:点击a标签跳转到其他页面,拖放图片到浏览器自动打开,点击表单的提交按钮提交Forms等等,因为有时候我们不会想要这些事情发生,所以我们需要防止默认行为。注意:只有cancelable属性为true的事件才能使用preventDefault()方法取消其默认行为。当要终止冒泡和默认行为时,可以使用事件处理程序(事件监听器)直接返回false来响应事件。函数或代码块事件处理程序HTML属性(内联事件处理程序)属性值是事件发生时要运行的JavaScript代码以这种方式指定时,将创建一个封装元素属性值的函数。这个函数中有一个局部变量event(也就是事件对象)。通过事件变量,可以直接访问事件对象,不需要自己定义,也不需要从函数的参数列表中读取(经测试,不需要读取它来自函数的参数列表,在chrome和IE11中,但在fireFox中需要)。在此函数内部,this值等于事件的目标元素。——《JavaScript高级编程》上面这段话可以理解为:通过html属性指定一个事件处理器时,在指定的处理器函数外面包裹一层函数,然后将这个新函数赋值给btn.onclick(见DOM0级事件处理器)),这样新函数中的this将指向事件目标元素。但在具体的事件处理器内部,由于没有具体的调用对象,其内部this指向非严格模式下的windowDOM0级事件处理器varbtn=document.getElementById("btn");btn.onclick=function(){警报(this.id);//btn}DOM2级的事件处理器主要有两个方法,addEventListener和removeEventListener,都接受三个参数:要启用事件捕获的事件的名称),使用它们的主要好处是可以添加多个事件处理程序。注意:如果被监控函数是匿名函数并且没有引用它,那么在不销毁元素的情况下无法移除监听器。IE事件处理程序(IE7、IE8)IE实现attachEvent()和detachEvent()。两种方法都接受两个参数:事件处理程序名称和事件处理程序函数。使用这两个函数时,事件处理程序是在全局范围内运行的,所以this指向window,这些事件处理程序并不是按照添加的方式运行的,而是跨浏览器事件处理程序是在倒序函数addHandler(target,eventType,handler){if(target.addEventListener){//DOM2事件target.addEventListener(eventType,handler,false);}elseif(target.attachEvent){//IEtarget.attachEvent('on'+eventType,handler);}else{target['on'+eventType]=handler;}}functionremoveHandler(target,eventType,handler){if(target.removeEventListener){target.removeEventListener(eventType,handler,false);}elseif(target.detachEvent){target.detachEvent('on'+eventType,handler);}else{target['on'+eventType]=null;}}//阻止事件(主要是事件冒泡,因为IE不支持事件捕获)functionstopPropagation(e){if(e.stopPropagation){e.stopPropagation();//标准w3c}else{e.cancelBubble=true;//IE}}//默认取消事件行为functionpreventDefault(e){if(e.preventDefault){e.preventD默认();//标准w3c}else{e.returnValue=false;//IE}}通俗点说,事件委托就是将一个元素响应事件(点击、按键等)的功能委托给另一个元素。一个或一组元素的事件委托给其父层或外部元素。外部元素是实际绑定事件的元素。当事件响应需要绑定的元素时,会通过事件冒泡机制触发。自定义事件非IE浏览器方法1//创建事件,参数为事件类型varevent=newEvent('Event');//初始化事件//initEvent(type:string,bubbles?:boolean,cancelable?:boolean):void;event.initEvent('build',true,true);elem.addEventListener('build',function(e){//做某事},false);//触发事件elem.dispatchEvent(event);方法2Event的构造函数定义为new(type:string,eventInitDict?:EventInit):Event;其中EventInit定义为:interfaceEventInit{bubbles?:boolean;//是否冒泡,默认为falsecancelable?:boolean;//是否可取消,默认falsecomposed?:boolean;//是否在shadowDOM根节点外触发监听,默认false}//创建并初始化事件varevent=newEvent('build',{bubbles:true,cancelable:true});elem.addEventListener('build',function(e){//做某事},false);//触发事件elem.dispatchEvent(event);IE8和以前的浏览器varevent=document.createEventObject();//不接受任何参数//给事件的属性赋值...elem.fireEvent('onclick',event);//触发事件会自动成为调用fireEvent()方法时的事件对象添加srcElement和type属性;其他属性必须手动添加。事件对象事件对象分为DOM中的事件对象和IE中的事件对象。应该是为了兼容。Event对象中的属性和方法包括这两个事件对象的属性和方法。DOM中事件对象的属性/方法bubbles:boolean表示事件是否冒泡cancelable:boolean表示事件是否可以取消defaultbehaviorcomposed:boolean是否会在shadowDOM根节点外触发监听器currentTarget:EventTargetis当前调用事件处理函数的元素defaultPrevented:boolean为true表示调用了preventDefault()方法是浏览器生成的事件目标:EventTarget事件目标initEvent(type:string,bubbles?:boolean,cancelable?:布尔值):无效;preventDefault():voidstopImmediatePropagation():voidstopPropagation():voidtype:stringIE中的事件类型事件对象的属性/方法cancelBubble:boolean默认值为false,设置为true可以取消事件冒泡returnValue:默认boolean的值为true,但是设置为false可以取消事件的默认行为:target和currentTarget的区别