- 浏览: 127113 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
AlexBlume:
...
js中“使用”el表达式 -
xiaoyuer9953:
这两天正需要这个,很好!
json-lib-2.4-jdk15.jar 组装json字符串 -
liuyue513:
...
MyEclipse下debug调试 -
Fs_sky:
谢了,太厉害了!
Object... values的用法 -
ooo456mmm:
goood
MyEclipse下debug调试
先说下js事件中几个重要的概念:事件对象、目标元素(事件源)、冒泡事件流、捕获事件流。
事件对象:事件对象只有在事件发生时才会产生,是用来记录事件发生时相关信息的对象,只能在事件处理函数内部访问。
目标元素: 任何一个事件的目标元素都是最开始的那个元素,并且它在事件对象中以属性的形式出现。使用事件代理的话我们可以把事件处理器添加到一个元素上,等待事件从它的子级元素里冒泡上来,并且可以很方便地获取这个事件的目标元素。js中目标元素又称为事件源。
冒泡事件流: 当一个元素上的事件被触发的时候,比如说鼠标点击了一个按钮,同样的事件将会在那个元素的所有祖先元素中被触发,从原始元素开始一直冒泡到DOM树的最上层,这一过程被称为事件冒泡。在冒泡过程中的任何时候都可以终止事件的冒泡,在现代浏览器里可以通过调用事件对象上的stopPropagation()方法,在IE里可以通过设置事件对象的cancelBubble属性为true。也就是说,如果不停止事件的传播,由于js事件冒泡的机制,子元素会触发父级的事件,一直冒泡到最上层的元素(事件将一直通过DOM冒泡直至到达文档根)。
总结:冒泡型事件按照从最特定的事件目标到最不特定的事件目标的顺序触发(冒泡是从下级元素到上级元素)。
捕获事件流:事件的处理将从DOM层次的根开始,而不是从触发事件的目标元素开始,事件从目标元素的所有祖先元素依次往下传递。在这个过程中,事件会从文档根到事件目标元素之间各个继承派生的元素所捕获,如果事件监听器在被注册时设置了useCapture属性为true,那么它们可以被分派给这期间的任何元素以对事件做出处理;否则,事件会被接着传递给派生元素路径上的下一元素,直至目标元素。事件到达目标元素后,它会接着通过DOM节点再进行冒泡。
总结:捕获型事件按照从最不特定的事件目标到最特定的事件目标的顺序触发(与冒泡型事件顺序相反,捕获是从上级元素到下级元素)。
IE浏览器中的事件流:只支持冒泡事件流,不支持捕获事件流。
现代浏览器中的事件流:同时支持两种事件模型:捕获型事件和冒泡型事件,且捕获型事件先发生。 window->document->html->body->div->body->html->document->window 所以对于事件目标是接受了2次事件,一次是捕获过程,一次是冒泡过程。
事件冒泡的优点和缺点
想象一下现在我们有一个10列、100行的HTML表格(采用div-ul-li合成的表格),你希望在用户点击表格中的某一单元格(li)的时候做点什么,比如需要让表格中的每一个单元格在被点击的时候变成可编辑状态。如果把事件处理器加到这1000个单元格会产生一个很大的性能问题,有可能导致内存泄露甚至是浏览器的崩溃。相反地,使用事件代理的话,你只需要把一个事件处理器添加到表格div上就可以了,这个函数可以把点击事件给截下来,并且判断出是哪个单元格被点击了。
我们为这个表格div添加一个事件处理器以调用clickFun函数,此函数需要先判断出传到div来的事件的目标元素,然后再根据具体的条件去做相应的处理即可:
所以总结下冒泡的优点有:
1.需要创建的以及驻留在内存中的事件处理器少了,提高了性能,并降低了崩溃的风险。
2.在DOM更新后无须重新绑定事件处理器。如果你的页面是动态生成的,你不再需要在元素被载入或者卸载的时候添加或者删除事件处理器。
缺点:你的事件管理代码有成为性能瓶颈的风险,所以尽量使它能够短小精悍。
并不是所有的事件都能冒泡,blur、focus、load和unload不能像其它事件一样冒泡。
停止事件冒泡
IE:window.event.cancelBubble=true;
现代浏览器:e.stopPropagation();
阻止事件的默认行为
IE:window.event.returnValue=false;
现代浏览器:e.preventDefault();
事件处理函数
IE中:
obj.attachEvent(evtype,fn)---IE提供的添加事件处理函数的方法。obj是要添加事件的dom对象,evtype是事件类型,带on前缀,fn是事件处理函数。缺点:IE不支持事件捕获,且使用IE的attachEvent方法时在事件处理函数内部,this指向了window,而不是obj!解决attachEvent中this指向问题的方法是:
obj.attachEvent("on"+evtype,function(){fn.call(obj)});
obj.detachEvent(evtype,fn,)---IE提供的删除事件处理函数的方法,evtype包含on前缀。
现代浏览器:
obj.addEventListener(evtype,fn,useCapture)——W3C提供的添加事件处理函数的方法。obj是要添加事件的对象,evtype是事件类型,不带on前缀,fn是事件处理函数,如果useCapture是true,则事件处理函数在捕获阶段被执行,否则在冒泡阶段执行
obj.removeEventListener(evtype,fn,useCapture)——W3C提供的删除事件处理函数的方法
obj.event=fn这样事件处理函数会被添加到冒泡阶段
attachEvent和addEventListener方法的使用:
addEventListener参数说明
addEventListener有三个参数:第一个参数表示事件名称(不含on,如"click");第二个参数表示要接收事件处理的函数;第三个参数为useCapture,下面就讲解它:
上述是我们测试的代码,根据info的显示来确定触发的顺序,有三个addEventListener,而useCapture可选值为true和false,所以2*2*2,可以得出8段不同的程序:
全为false时,触发顺序为:inDiv、middleDiv、outDiv;
全为true时,触发顺序为:outDiv、middleDiv、inDiv;
outDiv为true,其他为false时,触发顺序为:outDiv、inDiv、middleDiv;
middleDiv为true,其他为false时,触发顺序为:middleDiv、inDiv、outDiv;
……
最终得出如下结论:
true的触发顺序总是在false之前;
如果多个均为true,则外层的触发先于内层;
如果多个均为false,则内层的触发先于外层。
附:几个常用的事件相关的处理方法
附:js常用事件
参考:http://www.iteye.com/topic/517899
事件对象:事件对象只有在事件发生时才会产生,是用来记录事件发生时相关信息的对象,只能在事件处理函数内部访问。
//W3C DOM把事件对象作为事件处理函数的第一个参数传入进去 domObj.onclick = function(e){ alert(e); }; //IE将事件对象作为window对象的一个属性(相当于全局变量) domObj.onclick = function(){ alert(window.event); }; //所以为了兼容各种浏览器,获取事件对象可以这样处理: domObj.onclick = function(e){ var evt = e || window.event; alert(evt); }; //也可以这样直接在页面中获取事件对象。注意:1.此时event就是事件对象,必须写成event,不能写为event22等其他形式;2.event参数可以在任意位置,比如onclick="clickFun(this,1,2,3,event,4,5)"也是可以的 <div onclick="clickFun(this,event)"></div>
目标元素: 任何一个事件的目标元素都是最开始的那个元素,并且它在事件对象中以属性的形式出现。使用事件代理的话我们可以把事件处理器添加到一个元素上,等待事件从它的子级元素里冒泡上来,并且可以很方便地获取这个事件的目标元素。js中目标元素又称为事件源。
冒泡事件流: 当一个元素上的事件被触发的时候,比如说鼠标点击了一个按钮,同样的事件将会在那个元素的所有祖先元素中被触发,从原始元素开始一直冒泡到DOM树的最上层,这一过程被称为事件冒泡。在冒泡过程中的任何时候都可以终止事件的冒泡,在现代浏览器里可以通过调用事件对象上的stopPropagation()方法,在IE里可以通过设置事件对象的cancelBubble属性为true。也就是说,如果不停止事件的传播,由于js事件冒泡的机制,子元素会触发父级的事件,一直冒泡到最上层的元素(事件将一直通过DOM冒泡直至到达文档根)。
总结:冒泡型事件按照从最特定的事件目标到最不特定的事件目标的顺序触发(冒泡是从下级元素到上级元素)。
捕获事件流:事件的处理将从DOM层次的根开始,而不是从触发事件的目标元素开始,事件从目标元素的所有祖先元素依次往下传递。在这个过程中,事件会从文档根到事件目标元素之间各个继承派生的元素所捕获,如果事件监听器在被注册时设置了useCapture属性为true,那么它们可以被分派给这期间的任何元素以对事件做出处理;否则,事件会被接着传递给派生元素路径上的下一元素,直至目标元素。事件到达目标元素后,它会接着通过DOM节点再进行冒泡。
总结:捕获型事件按照从最不特定的事件目标到最特定的事件目标的顺序触发(与冒泡型事件顺序相反,捕获是从上级元素到下级元素)。
IE浏览器中的事件流:只支持冒泡事件流,不支持捕获事件流。
现代浏览器中的事件流:同时支持两种事件模型:捕获型事件和冒泡型事件,且捕获型事件先发生。 window->document->html->body->div->body->html->document->window 所以对于事件目标是接受了2次事件,一次是捕获过程,一次是冒泡过程。
事件冒泡的优点和缺点
想象一下现在我们有一个10列、100行的HTML表格(采用div-ul-li合成的表格),你希望在用户点击表格中的某一单元格(li)的时候做点什么,比如需要让表格中的每一个单元格在被点击的时候变成可编辑状态。如果把事件处理器加到这1000个单元格会产生一个很大的性能问题,有可能导致内存泄露甚至是浏览器的崩溃。相反地,使用事件代理的话,你只需要把一个事件处理器添加到表格div上就可以了,这个函数可以把点击事件给截下来,并且判断出是哪个单元格被点击了。
我们为这个表格div添加一个事件处理器以调用clickFun函数,此函数需要先判断出传到div来的事件的目标元素,然后再根据具体的条件去做相应的处理即可:
var clickFun = function(e){ var evt = e || window.event; var src = evt.target || evt.srcElement; //获取事件源对象 if(src.tagName=='LI'){ //do something... } }
所以总结下冒泡的优点有:
1.需要创建的以及驻留在内存中的事件处理器少了,提高了性能,并降低了崩溃的风险。
2.在DOM更新后无须重新绑定事件处理器。如果你的页面是动态生成的,你不再需要在元素被载入或者卸载的时候添加或者删除事件处理器。
缺点:你的事件管理代码有成为性能瓶颈的风险,所以尽量使它能够短小精悍。
并不是所有的事件都能冒泡,blur、focus、load和unload不能像其它事件一样冒泡。
停止事件冒泡
IE:window.event.cancelBubble=true;
现代浏览器:e.stopPropagation();
阻止事件的默认行为
IE:window.event.returnValue=false;
现代浏览器:e.preventDefault();
事件处理函数
IE中:
obj.attachEvent(evtype,fn)---IE提供的添加事件处理函数的方法。obj是要添加事件的dom对象,evtype是事件类型,带on前缀,fn是事件处理函数。缺点:IE不支持事件捕获,且使用IE的attachEvent方法时在事件处理函数内部,this指向了window,而不是obj!解决attachEvent中this指向问题的方法是:
obj.attachEvent("on"+evtype,function(){fn.call(obj)});
obj.detachEvent(evtype,fn,)---IE提供的删除事件处理函数的方法,evtype包含on前缀。
现代浏览器:
obj.addEventListener(evtype,fn,useCapture)——W3C提供的添加事件处理函数的方法。obj是要添加事件的对象,evtype是事件类型,不带on前缀,fn是事件处理函数,如果useCapture是true,则事件处理函数在捕获阶段被执行,否则在冒泡阶段执行
obj.removeEventListener(evtype,fn,useCapture)——W3C提供的删除事件处理函数的方法
obj.event=fn这样事件处理函数会被添加到冒泡阶段
attachEvent和addEventListener方法的使用:
//如果这样写,那么将会只有medhot3被执行 document.getElementById("btn").onclick = method1; document.getElementById("btn").onclick = method2; document.getElementById("btn").onclick = method3; //IE下,运用object.attachEvent(event,function),写成这样: var btn1Obj = document.getElementById("btn1"); btn1Obj.attachEvent("onclick",method1); btn1Obj.attachEvent("onclick",method2); btn1Obj.attachEvent("onclick",method3); 执行顺序为method3->method2->method1 //现代浏览器需要用到addEventListener,写成这样: btn1Obj.addEventListener("click",method1,false); btn1Obj.addEventListener("click",method2,false); btn1Obj.addEventListener("click",method3,false); 执行顺序为method1->method2->method3
addEventListener参数说明
addEventListener有三个参数:第一个参数表示事件名称(不含on,如"click");第二个参数表示要接收事件处理的函数;第三个参数为useCapture,下面就讲解它:
<div id="outDiv"> <div id="middleDiv"> <div id="inDiv">请在此点击鼠标。</div> </div> </div> <div id="info"></div> var outDiv = document.getElementById("outDiv"); var middleDiv = document.getElementById("middleDiv"); var inDiv = document.getElementById("inDiv"); var info = document.getElementById("info"); outDiv.addEventListener("click",function(){info.innerHTML+="outDiv" +"<br>";},false); middleDiv.addEventListener("click",function(){info.innerHTML +="middleDiv"+"<br>";},false); inDiv.addEventListener("click",function(){info.innerHTML+="inDiv" +"<br>";},false);
上述是我们测试的代码,根据info的显示来确定触发的顺序,有三个addEventListener,而useCapture可选值为true和false,所以2*2*2,可以得出8段不同的程序:
全为false时,触发顺序为:inDiv、middleDiv、outDiv;
全为true时,触发顺序为:outDiv、middleDiv、inDiv;
outDiv为true,其他为false时,触发顺序为:outDiv、inDiv、middleDiv;
middleDiv为true,其他为false时,触发顺序为:middleDiv、inDiv、outDiv;
……
最终得出如下结论:
true的触发顺序总是在false之前;
如果多个均为true,则外层的触发先于内层;
如果多个均为false,则内层的触发先于外层。
附:几个常用的事件相关的处理方法
/** * 模拟触发调用 */ 可适用于所有html元素及任何事件。 当eventName为"click"时,exeEvent有的时候产生的是执行了btn.onclick()的效果。嗯,确实是这个效果,但是意义却完全不同,btn.onclick()只是一个对象对其方法的调用,它的执行必须依赖于用户对其赋值,否则btn.onclick为null,是不能执行btn.onclick()的。而exeEvent的效果,“等同于”鼠标在元素上进行了点击。 function exeEvent(domObj, eventName){ if(document.all && typeof(document.all)=="object"){//判断是否是IE浏览器 domObj.fireEvent('on' + eventName); }else{ var event=document.createEvent("HTMLEvents");//或document.createEvent("MouseEvents"); event.initEvent(eventName, true, true); domObj.dispatchEvent(event); } } 其中event.initEvent(eventName,canBubble,cancelable)参数 描述 eventName 字符串值。事件的类型。可以是"click"、"mouseup"等 canBubble 事件是否起泡。 cancelable 事件是否可以用preventDefault()方法取消事件。 /** * 添加事件 */ function addEvent(target, eventName, fn){ if(document.all && typeof(document.all)=="object"){//判断是否是IE浏览器 target.attachEvent("on"+eventName, fn); }else{ target.addEventListener(eventName, fn, false); } } 使用IE的attachEvent方法时在事件处理函数内部,this指向了window,而不是target!下面是改进后的方法,可以解决attachEvent中this指向问题 function addEvent(target, eventName, fn){ if(document.all && typeof(document.all)=="object"){//判断是否是IE浏览器 target.attachEvent("on"+eventName, function(){ fn.call(target); }); }else{ target.addEventListener(eventName, fn, false); } } /** * 删除事件 */ function removeEvent(target, eventName, fn){ if(document.all && typeof(document.all)=="object"){//判断是否是IE浏览器 target.detachEvent("on"+eventName, fn); }else{ target.removeEventListener(eventName, fn, false); } } /** * 获取事件对象与事件源 */ function getEventElement(e){ var evt = e || window.event;//获取事件对象 var src = evt.target || evt.srcElement;//获取事件源对象 return src; } /** * 事件停止冒泡 */ function stopBubble(e){ if(document.attachEvent) {//ie window.event.cancelBubble = true; }else{ e.stopPropagation(); } } /** * 阻止事件的默认行为 */ function preventDefault(e){ if(document.attachEvent) {//ie window.event.returnValue=false; }else{ e.preventDefault(); } }
附:js常用事件
//一般事件 onclick 鼠标点击时触发此事件 ondblclick 鼠标双击时触发此事件 onmousedown 按下鼠标时触发此事件 onmouseup 鼠标按下后松开鼠标时触发此事件 onmouseover 鼠标移动到某对象范围的上方时触发此事件 onmousemove 鼠标移动时触发此事件 onmouseout 鼠标离开某对象范围时触发此事件 onkeypress 键盘上的某个键被按下并且释放时触发此事件. onkeydown 键盘上某个按键被按下时触发此事件 onkeyup 键盘上某个按键被按放开时触发此事件 //页面相关事件 onabort 图片在下载时被用户中断 onbeforeunload当前页面的内容将要被改变时触发此事件 onerror 出现错误时触发此事件 onload 页面内容完成时触发此事件 onmove 浏览器的窗口被移动时触发此事件 onresize 浏览器的窗口大小被改变时触发此事件 onscroll 浏览器的滚动条位置发生变化时触发此事件 onstop 浏览器的停止按钮被按下时触发此事件或者正在下载的文件被中断 oncontextmenu当弹出右键上下文菜单时发生 onunload 当前页面将被改变时触发此事件 //表单相关事件 onblur 当前元素失去焦点时触发此事件 onchange 当前元素失去焦点并且元素的内容发生改变而触发此事件 onfocus 当某个元素获得焦点时触发此事件 onreset 当表单中RESET的属性被激发时触发此事件 onsubmit 一个表单被递交时触发此事件
参考:http://www.iteye.com/topic/517899
发表评论
-
My97日历控件 常用范例
2012-04-24 15:17 1199官方文档: http://www.mysuc.com/test ... -
js封装、构建对象
2012-04-10 16:27 2196一、通过闭包,执行匿名函数,返回一个对象 //例1 var ... -
frames["frameName"]用法bug?
2012-03-13 16:02 1240闲话少说,直接上代码 ... -
hasOwnProperty实现剔除数组中重复项
2012-03-02 16:41 2466hasOwnProperty是用来判断一个对象是否有你给出名称 ... -
js数组排序
2012-03-02 16:22 1445js的数组中有一个sort()方法,默认是按照ASCII字符顺 ... -
函数的参数arguments、当前上下文this、call apply
2010-09-16 13:52 1237函数的参数arguments js中 ... -
html中js代码的加载顺序
2010-09-02 12:31 3458搜索:非阻塞JavaScript 对于一个html页面,he ... -
js变量作用域
2010-08-19 08:41 1164JavaScript的函数是在局部 ... -
javascript中数据类型
2010-08-01 17:16 1907var str = "Hello, world&qu ... -
JavaScript条件表达式的布尔判断
2010-07-31 15:57 7744在JavaScript中,对于单独 ... -
setTimeout和setInterval的使用
2010-07-17 14:40 925window对象有两个主要的定时方法,分别是setTimeou ... -
更改地址栏前小图标、按下回车键事件、关闭窗口
2010-07-16 19:04 2553<!-- 地址栏前添加自 ... -
javascript中数组、对象
2010-06-11 15:34 1388javascript数组操作大全: ... -
正则表达式
2010-06-11 10:10 911var patten1 = /^\d+(\.\d{1,6})? ... -
不使用第三个变量完成两个整数的交换
2010-04-20 09:32 848public class Person { ... -
js点滴
2010-02-02 11:39 995onchange 事件会在域的内容改变时发生。支持该事件的HT ... -
javascript操作cookie 以及 html国际化
2010-02-02 11:36 1804下面是cookie操作的工具类: var CookieUtil ... -
js获得本周,本月,本季度的开始日期和结束日期 & 给定日期,获得是当年的第几周
2010-01-24 13:14 1353js获得本周,本月,本季度的开始日期和结束日期 <scr ... -
javaScript DOM方法与属性摘要
2009-12-18 18:56 776createDocumentFragment() 创建一个文 ...
相关推荐
JavaScript事件是浏览器或Node.js环境中发生的特定行为,如用户点击按钮、页面加载完成或输入框获得焦点等。事件驱动编程是JavaScript的核心特性之一,通过监听和处理这些事件,我们可以创建响应式的用户体验。 二...
在标题提到的"EventDispatcher, js事件派发器, javascript事件派发器"中,我们可以理解这是一个JavaScript实现的事件派发器,可能是作者的原创工作。用户可以通过GitHub上的问题跟踪系统(Issue)报告任何发现的错误...
JavaScript(简称JS)...总的来说,JavaScript事件集合是构建动态和交互式网页的核心工具。通过深入理解和熟练应用事件监听、事件处理、事件冒泡、事件捕获等概念,开发者能够创建出更加丰富、响应迅速的Web应用程序。
实验报告详细介绍了JavaScript事件处理的相关知识,这在Web开发中是非常关键的一部分,因为事件是用户与网页交互的主要方式。以下是对各个知识点的详细说明: 1. **JavaScript事件基本概念**: - **事件**:是用户...
JavaScript 事件机制详细研究 JavaScript 事件机制是指浏览器中发生的各种事件,例如点击、鼠标悬停、键盘输入等,JavaScript 通过捕捉这些事件来执行相应的操作。本文将详细介绍 JavaScript 事件机制的实现方式和...
JS事件触发大全是指在 JavaScript 中各种事件的触发机制,这些事件可以在不同的元素上触发,例如按钮、链接、文本框、图片等。这些事件可以被 JavaScript 代码捕捉和处理,以便执行特定的操作。 事件类型 1. 鼠标...
Js事件大全 1.一般事件... 2 2.页面相关事件... 2 3.表单相关事件... 3 4.滚动字幕事件... 3 5.编辑事件... 3 6.数据绑定... 4
全面,直观javascript的事件
在JavaScript中,监听浏览器窗口关闭事件对于实现特定的用户交互或数据保存功能至关重要。下面将详细介绍几种常用的浏览器关闭事件监听方法。 1. 方式一:适用于IE浏览器,仅在关闭时提示 ```javascript window....
如何给javascript js事件传递参数.zip
在这个"10-JS事件基础"的教程中,我们将深入理解JavaScript中的事件处理机制,包括事件对象、事件冒泡、DOM事件流以及鼠标和键盘事件。 首先,让我们了解一下什么是事件对象。在JavaScript中,每当发生一个事件(如...
JavaScript事件是Web开发中不可或缺的一部分,它允许用户与网页进行交互并响应用户的操作。...在阅读`event.js`这个文件和相关的博客文章后,你将能够深入理解JavaScript事件系统,并将其应用到自己的项目中。
JavaScript事件code对应表是JavaScript编程中非常重要的一个概念,它涉及到浏览器如何处理用户与网页的交互。在网页中,无论是点击按钮、滚动页面还是按下键盘上的键,都会触发各种事件。事件code就是用来识别这些...
通过自定义右键菜单,我们可以提升网页的用户体验,同时这也是一个很好的实践JavaScript事件处理和DOM操作的机会。记得在实际应用中考虑兼容性问题,确保你的代码能在不同的浏览器和设备上正常工作。
JavaScript事件学习小结(五)js中事件类型之鼠标事件 //www.jb51.net/article/86259.htm JavaScript事件学习小结(一)事件流 //www.jb51.net/article/86261.htm javaScript事件学习小结(四)event的公共成员...
jem.js(Javascript 事件管理器) 这是一个 Javascipt 库,可帮助我们编写事件驱动的 Javascript 代码。 没有依赖项,没有 jQuery,没有其他库。 这与 DOM 无关。 jem.js 用于您的自定义事件。 欢迎任何形式的...
eventdispatcher.js, 自定义对象的JavaScript事件 eventdispatcher.js 自定义对象的JavaScript事件用法[removed][removed][removed]
JAVASCRIPT 实现OPTION的事件触发
JavaScript事件监听机制是前端开发中不可或缺的一部分,它用于处理页面元素的各种交互,如点击、鼠标移动等。在本文中,我们将深入探讨事件监听,特别是事件捕获这一概念,以及如何在不同的浏览器环境中实现兼容。 ...
SVG事件和JavaScript事件的结合使得交互式图形成为可能。例如,你可以为SVG元素添加点击事件监听器,当用户点击某个图形时触发特定的JavaScript函数。这可以用于显示详细信息、导航或执行其他操作。SVG事件包括`...