我们知道,浏览器中的事假一般包括两种事件,一种是事件冒泡,一种是事件捕获,事件冒泡之于IE事件中,事件捕获之于DOM事件中。
假如我点击了一个div,那么按照事件冒泡的机制,那么将执行div中的点击事件,在执行body中的点击事件,再执行html中的点击事件,最后执行document的点击事件,而采用事件捕获思想,将先执行document的点击事件,再执行html中的点击事件,接着执行body中的点击事件,最后才执行本体div中的点击事件。
我们今天要讨论的,主要是如何在一个标签中,阻止一个事件发生,如下:
<a id='aid’href='http://www.baidu.com '>qq</a>
正常情况下,点击a标签将会跳转到http://www.baidu.com的页面,那么如何实现,才可以使得点击a标签后不会跳转到http://www.baidu.com的页面呢?
江湖惯例,先上代码:
<script>
function StopDefault(window,undefined){
domReady:function(){
if(document.readyState === "complete"){
var target = document.getElementById("aid");
EventListenerhandler(target, "click", preventDefault);
} else {
setTimeout(arguments.callee,1)
}
}
preventDefault:function(e){ //做兼容性匹配,分IE与dom两项
var e = e || window.event; //e是IE事件,window.event是dom事件
if(e.preventDefault){
e.preventDefault(); //DOM中取消事件的方法
} else {
e.returnValue = false; //IE中取消事件的方法
}
}
EventListenerhandler:function(target, type, handler){ //做兼容测试
if(target.addEventListener){ //DOM2级方法,
target.addEventListener(type, handler, false);
} else if(target.attachEvent){ //IE方法
target.attachEvent("on"+type, handler);
} else { //DOM0级方法,
target["on"+type] = handler;
}
}
domReady();
};
<script>
对EventListenerhandler()方法,这里做一下简要介绍,当为dom2级事件时,事件一般是这样的格式:
var btn =document.getElementById("mybtn");
btn.addEventListener("click",function(event){alert("hello")},false);
其中的false参数是表示在事件冒泡阶段进行处理,一般为了兼容性问题,都设置为false。
为dom0级事件时,事件一般是这样的格式:
var btn =document.getElementById("mybtn");
btn.οnclick=function(event){alert("hello")};
为IE级事件时,事件一般是这样的格式:
var btn =document.getElementById("mybtn");btn.attachEvent("click",function(event){alert("hello")})
这里要注意,target["on"+type]事实上相当于target. "on"+type,这是数组的另外一种表示方式
对preventDefault()方法,表示取消默认方法;
IE中只需要把returnValue的值设置为false即可,而dom中直接调用preventDefault()即可;
这里可能有时还会遇到不是取消默认事件,而是取消事件冒泡,那么只需要做如下调用;
IE中只需要把cancelBubble的值设置为true即可,而dom中直接调用stopPropagation()即可;