JavaScript笔记:BOM--event
event 事件
浏览器自动触发或者用户手动触发的页面状态的改变
事件处理函数:当事件发生时自动调用的函数
事件发生之前就需要绑定到事件属性上
绑定事件的三种方式:
1、在html中绑定
<a onclick = "alert('hello world')"></a>2、在js中动态绑定,为事件属性赋值一个函数
document.getElementById("xxx").onclick = fun; function fun(){ alert("hello world"); }3、使用addEventListener添加
function fun1() { console.log("abc1"); } function fun2() { console.log("abc2"); } Element.addEventListener("click", fun1); Element.addEventListener("click", fun2);删除事件
Element.removeEventListener("click", fun2);注意:添加时,第二个参数可以写匿名函数,若该事件明确未来可能删除,则不可以写匿名函数,否则无函数名无法删除。
事件模型
一个事件发生,有三个阶段
1、捕获
由外到内,记录各级父元素上绑定的相同的事件
2、目标出发
首先触发目标元素上的事件处理函数
3、冒泡
按照捕获的顺序,反向执行,由内到外,依次触发各级父元素绑定的事件的处理函数
html部分: <body> <div class="div1"> <div class="div2"> <div class="div3"></div> </div> </div> </body> css部分: <style> .div1 { width: 500px; height: 500px; background-color: #f00; } .div2 { width: 400px; height: 400px; background-color: #0f0; position: absolute; top: 50px; left: 50px; } .div3 { width: 300px; height: 300px; background-color: #00f; position: absolute; top: 50px; left: 50px; } </style> js部分: var div1 = document.getElementsByClassName("div1")[0]; var div2 = document.getElementsByClassName("div2")[0]; var div3 = document.getElementsByClassName("div3")[0]; div1.addEventListener("click", fun); div2.addEventListener("click", fun); div3.addEventListener("click", fun); function fun(e) { console.log(this.className); }点击蓝色区域,输出结果如图:
addEventListener的第三个参数:capture
是否在捕获阶段,提前出发
true或者false,默认为false
将上面的代码中的js部分中修改一行
div2.addEventListener("click", fun, true);点击蓝色区域,输出结果如图:
不难发现,给div2绑定事件时,加入了第三个参数,true,div2的事件可以提前触发。
事件对象
当事件发生时,自动创建的封装所有事件信息的一个对象
获取:
DOM标准: 事件对象默认作为事件处理函数的第一个参数传入
function fun(e){ e;//事件发生时,自动获得事件对象 }IE8:在全局window,定义了一个event
function fun(e){ window.e;//事件发生时,自动获得事件对象 }兼容写法:
function fun(e){ e = e | window.e; }取消冒泡
DOM标准:e.Propagation();
IE8:e.cancelBubble = true;
兼容写法:
if (e.stopPropagation()) { e.stopPropagation(); } else { e.cancelBubble = true; }本人使用的Chrome浏览器,故将上面代码中js部分中的fun函数做如下改动
function fun(e) { console.log(this.className); e.stopPropagation(); }并删掉之前加入的true
点击蓝色区域,输出结果如图:
