1.javascript中的事件.
事件流
javascript中的事件是以一种流的形式存在的. 一个事件会也有多个元素同时响应. 有时候这不是我们想要的效果, 我们只是需要某个特定的元素相应我们的绑定事件, 或者只需要这样一个.
事件分类
捕获型事件(非IE), 冒泡型事件 (所有浏览器都支持)
捕获型事件是自上而下的, 而冒泡型事件是自下而上的. 或许有图会更直观一点.
冒泡型事件在平常遇到可能会比较多一些, 但捕获型事件怎样才会执行到呢? 而如果我们想要在非IE浏览器中创建捕获型事件, 只需将 addEventListener 的第三个参数设计为true就可以了.
这样的dom结构
----------->>
<div id='div1' style="width:300px;height:300px;background:#0000ff;">
<div id='div2' style="width:200px;height:200px;position:relative; left:50%;top:50%;background:#ffff00;">
</div>
</div>
------------>>
var $ = document.getElementById;
$('div1').addEventListener('click', alertID, true);
$('div2').addEventListener('click', alertID, true);
function alertID(){
alert(this.id);
}
----------->>
ID为div1和div2的两个元素都被绑定了捕捉阶段的事件处理函数, 这样:
当点击#div1(蓝色区域)时, 应该会alert出'div1'
当点击#div2(黄色区域)时, 应该会先alert出'div1', 再alert出'div2', 因为在事件捕捉阶段, 事件是从根元素向下传播的, #div1是#div2的父元素, 自然绑定在#div1上的click事件也会优先于#div2上的click事件被执行.
冒泡型事件例子:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>冒泡事件</title> <script type="text/javascript"> var i = 1; function Add(sText,objText) { document.getElementById("Console").innerHTML +=sText + "执行顺序:" + i + "<br />" + "<hr />"; i = i + 1; //window.event.cancelBubble = true; } </script> </head> <body onclick="Add('body事件触发<br />','body')"> <div onclick="Add('div事件触发<br />','div')"> <p onclick="Add('p事件触发<br />','p')" style="background:#c00;">点击</p> </div> <div id="Console" style="border:solid 1px #ee0; background:#ffc;"></div> </body> </html>
这个例子当中可以很清楚看到事件冒泡是从元素p一直上升到body元素.
那么冒泡型事件如何阻止? 或许我在某个时候不想要这种事件机制.
如下有一个函数, 兼容了IE和其他浏览器的阻止事件冒泡.
function stopBubble(e) { //如果提供了事件对象, 则这是一个非IE浏览器 if( e && e.stopPropagation ){ //因此它支持W3C的stopPropagation()方法 e.stopPropagation(); }else{ //否则, 我们需要使用IE的方式来取消事件冒泡 window.event.cancelBubble = true; } }
在IE中并没有 stopPropagation 方法, 但我们可以通过 window.event.cancelBubble 来阻止事件冒泡.
监听函数
IE : attachEvent, detachEvent
非IE : addEventListener, removeEventListener
除了上面四个函数还有一个比较通用的方法是 document.getElementById(元素ID).onclick = function( ){ }
事件对象
当触发事件, 在监听函数执行函数里怎样才可以获取事件对象呢? 在IE 中使用 window.event,srcElement, 而在非IE浏览器则用 e.currentTarget
例代码:
btn.onclick = ctdClickEvent; function ctdClickEvent(e){ if( window.event ) //IE { var readonly = 'readOnly'; var obj = window.event.srcElement; }else { //非IE var readonly = 'readOnly'; var obj = e.currentTarget; } var id = obj.id.replace("btn_", ""); if( obj.value ) { ...... } }
原文地址:http://www.nowamagic.net/javascript/js_EventAnalysis.php