在页面上可以有多个事件,也可以多个元素响应同一件事,
事件冒泡引发的问题:
有些时候不想动用的事件,却因为事件冒泡而触发
解决问题:
1.事件对象
由于IE-DOM和标准的DOM实现事件对象的方法各不相同,导致在不同浏览器上获取事件对象变得比较困难,。针对这个问题,jq进行了必要的扩展和封装,从而使得在什么浏览器中都能够轻松地获取事件对象以及事件对象的一些属性。
在程序中,实现事件对象非常简单,只需要为函数添加一个参数,例:
$(element).bind('click',function(event){
//event:事件对象
})
当单击element时,事件对象就被创建了,这个事件对象只有事件处理函数才能访问,事件处理函数执行完毕,事件对象就会被销毁。
2停止事件冒泡
停止事件冒泡可以阻止事件中其他对象的事件处理函数被执行。在jq中提供了stopPropagation()方法来停止事件冒泡。
3.阻止默认行为
网页中的元素有自己的默认行为,例如 单击超链接后会跳转,点击“提交”按钮后表单会提交,有时需要阻止元素的默认行为。
在jq中,提供了preventDefault()方法来阻止元素的默认行为。
例,在项目中,经常需要验证表单,在单击“提交”按钮时,验证表单内容,
例如,某元素是否是必填字段,某元素长度是否够6位,当表单不符合提交条件时,要阻止表单的默认行为,(表单提交);
$(function(){
$(obj).bind("click",function(){
var username=$("#username").val();//获取元素的值
if(username=''){//判断值是否为空
$('#el').html('<p>文本框值不能为空</p>');//提示信息
event.preventDefault();//阻止默认行为(表单提交);
}
})
})
如果想同时对事件对象停止冒泡和默认行为,可以在事件处理函数中返回false,这是对在事件对象上同时调用stopPropagation()和preventDefalut();
在表单的例子中,可以把
event.preventDefalut()//阻止默认行为
改写成
return false;
也可以把事件冒泡例子中的
event.stopPropagation()//停止事件冒泡
改写成
return false;
4.事件捕获
事件捕获和事件冒泡是两个相反的过程,事件捕获是从最顶端往下开始触发。
事件捕获并不是所有的主流浏览器都支持,并且这个缺陷无法通过javascript来修复,jq不支持事件捕获,如果需要用到事件捕获,只能用原生js;