如果您想全面了解事件一共有多少种,每种是做什么的,每个事件内部包含哪些对象,请查看帮助手册或者这位仁兄的文章。
五、事件流
只有事件是不够的,一个点击触发的事件有多个,当你点击了一个链接,相当于同时点击了他所在的div,也相当于点击了整个body。
事件流即各个事件触发的顺序,这又是IE和Dom有着很大差异的地方。
从一个测试页面开始吧:
<!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.01//EN' 'http://www.w3.org/TR/html4/strict.dtd'>
<style>....bd{...}{border:1px orange solid}</style>
<SCRIPT>...
function addEvent = function(o,c,h)...{
if(o.attachEvent)...{
o.attachEvent('on'+c,h);
}else...{
o.addEventListener(c,h,false);
}
return true;
};

function bol()...{
addEvent(document.getElementById("di"),"click",ai);
addEvent(document.getElementById("dm"),"click",am);
addEvent(document.getElementById("do"),"click",ao);
}
function ai()...{
alert("i")
oe=window.event?window.event:arguments[0];
/**//*try{
oe.cancelBubble = true;
}catch(e){
oe.stopPropagation();
}*/
ot = oe.target?oe.target:oe.srcElement;
alert(ot.id)
}
function am()...{
alert("m")
oe=window.event?window.event:arguments[0];
ot = oe.target?oe.target:oe.srcElement;
alert(ot.id)
}
function ao()...{
alert("o")
oe=window.event?window.event:arguments[0];
ot = oe.target?oe.target:oe.srcElement;
alert(ot.id)
}
</SCRIPT>
<body onload="bol()">
<div id="do" class=bd>
<div id="dm">
<div id="di" class=bd style="margin:50px">
aa
</div>
</div>
</div>
</body>
</html>
对于IE事件的触发是自下而上单向的冒泡型的事件流,页面里先触发di->dm->do->...
对于Dom的事件模型是自上而下有自下而上的称为捕获型的事件流,页面里触发顺序为...->do->dm->di->(txt)->(txt)->di->dm->do...
Dom事件模型中事件可以定义在捕获阶段也可以定义在冒泡阶段,这个就是由addEventListener方法的第三个参数决定的,true代表在捕获阶段触发,false代表在冒泡阶段触发。大家可以尝试把页面的addEventListener方法第三个参数改成true看下ie和firefox的不同效果。
需要强调的是Dom事件模型中只有前面提到的第三种添加事件的方法可以增删捕获阶段事件处理函数,前两种方法都默认指定冒泡阶段的事件,所以大家在之前开发中很少会注意到这些差异。而且既然IE没有支持,基本上没有存在只支持Firefox网页的必要,所以捕获阶段的事件只能说看上去不错。
从这个测试页面我们还可以得到几点结论:
1.id==dm的div,在页面上并没有展现,边框都没,但是点击他的子节点仍然会触发他的onclick事件。
2.addEvent方法是一个简易的去除增删事件处理函数差异的方法,我们可以开发一些服务方法来统一事件处理。
3.事件流的描述中我使用了"...",代表继续向上或向下触发的元素事件,这个也是比较麻烦的地方,IE的不同版本都不同,有div->body->document的还有div->html->body->document的,只要记住不要给html元素添加事件处理函数就好了。
六、停止事件流
事件流存在,势必需要一种方式能够让事件流打住,阻止继续冒泡。
在IE中:oEvent.cancelBubble = true;
在Dom中:oEvent.stopPropagation();
把上面的测试页注掉的代码打开就可以看到效果
七、阻止事件默认动作
一个动作的触发事件的同时往往带有其目的,比如按键代表输入字符,点击链接代表去链接的地址等等。
事件发生在这些默认动作执行前,希望检查只有满足一定要求才进行默认动作,这需要一种方式能够阻止事件默认动作。
有两种方式
第1种写在JS中
对于IE:oEvent.returnValue=false;
对于Dom:oEvent.preventDefault();
第2种方式针对前面介绍的第1种添加事件的方式:
<a href="http://yahoo.cn" onclick="return clk()">yahoo</a>
<script>
function clk(){
if(Math.random()>0.5){
return false;
}else{
return true;
}
}
</script>
在事件处理函数调用前加了return,而根据事件处理函数return值来决定是否进行默认动作。
另外,很多网页这么写onclick="javascript:clk()";这样的做没有必要,因为不支持js的浏览器同样不会认,支持js的浏览器不用写也一样。想来可能和vbscript有关吧,谁非要在一个页面用两种script呢。
八、JS模拟点击
IE下面:
oDiv=document.getElementById("testDiv");
oDiv.click();
其他的还没有研究,觉得实在没必要。
Tags: javascript
原创文章如转载,请注明:转载自:飞扬部落编程仓库 : http://www.busfly.net/csdn/
本文链接地址:http://www.busfly.net/csdn/post/EVENT-javascript.html
如果你喜欢本文,请顶一下,支持我,你的支持是我继续发好文章的最大动力。谢谢。
好东西需要分享,快把本文发给你的朋友吧~!~