先看个例子:
document.getElementById("myBtn").addEventListener("click", function(){ document.getElementById("demo").innerHTML = "Hello World"; });
定义和用法
addEventListener() 方法用于向指定元素添加事件句柄。
提示: 使用 removeEventListener() 方法来移除 addEventListener() 方法添加的事件句柄。
语法
element.addEventListener(event, function, useCapture)
使用 on语法,能不能同时给一个标签,相同的事件类型,绑定不同的事件处理函数
var oDiv = document.querySelector('div'); // on语法 只能给 一个标签,一个事件类型,绑定一个事件处理函数 oDiv.onclick = function(){ console.log('1111'); } oDiv.onclick = function(){ console.log('2222'); } // 只会输出22222
事件监听语法 可以同时给一个标签,一个事件类型,绑定多个事件处理函数
var oDiv = document.querySelector('div'); // 事件监听语法 可以同时给一个标签,一个事件类型,绑定多个事件处理函数 oDiv.addEventListener( 'click' , function(){ console.log(1111); } ) oDiv.addEventListener( 'click' , function(){ console.log(2222); } ) oDiv.addEventListener( 'click' , function(){ console.log(3333); } ) // 只有绑定的函数名称,可以删除 // 绑定的是一个匿名函数,无法删除的 // 每一个匿名函数,都有一个自己的地址 oDiv.removeEventListener('click' , function(){ console.log(3333); } ); // 删除绑定的事件 oDiv.addEventListener( 'click' , fun4 ); function fun4(){ console.log(4444); } oDiv.removeEventListener('click' , fun4 );
参数值
event 必须。字符串,指定事件名。
注意: 不要使用 “on” 前缀。 例如,使用 “click” ,而不是使用 “onclick”。
function 必须。指定要事件触发时执行的函数。
当事件对象会作为第一个参数传入函数。 事件对象的类型取决于特定的事件。例如, “click” 事件属于 MouseEvent(鼠标事件) 对象。
useCapture 可选。布尔值,指定事件是否在捕获或冒泡阶段执行。
可能值:
true - 事件句柄在捕获阶段执行
false- false- 默认。事件句柄在冒泡阶段执行
事件的监听和删除,低版本的IE浏览器有自己的语法形式,需要做兼容处理
事件的监听
标准浏览器
标签对象.addEventListener( '事件类型,没有on' , 事件处理函数 )
低版本IE浏览器
标签对象.attachEvent( '事件类型,要有on' , 事件处理函数 )
var oDiv = document.getElementById('div'); mySetEvent(oDiv , 'click' , function(){console.log(1111)}); mySetEvent(oDiv , 'click' , fun2 ); function fun2(){ console.log(2222) } // 兼容处理 绑定 // 需要三个参数 // 1,事件源 : 绑定事件的标签对象 // 2,事件类型 : 绑定事件的事件类型,此处输入的参数,不要有on // 3,事件处理函数 : 可以是 匿名函数,也可以是函数名称 function mySetEvent(element , type , fun){ // 如果有 addEventListener 这个方法,证明是普通浏览器 // 可以使用 addEventListener 这个方法 if(element.addEventListener){ // 给标签,直接绑定事件类型和事件处理函数 element.addEventListener( type , fun ); }else{ // 没有 addEventListener 这个方法,证明是低版本IE浏览器 // 使用 低版本IE浏览器语法 element.attachEvent( 'on' + type , fun ); } }
事件的删除
标准浏览器
标签对象.removeEventListener( '事件类型,没有on' , 事件处理函数 )
低版本IE浏览器
标签对象.detachEvent( '事件类型,要有on' , 事件处理函数 )
var oDiv = document.getElementById('div'); myDelEvent(oDiv , 'click' , function(){console.log(1111)}); myDelEvent(oDiv , 'click' , fun2 ); function fun2(){ console.log(2222) } // 兼容处理 删除 // 需要三个参数 // 1,事件源 : 删除事件的标签对象 // 2,事件类型 : 删除事件的事件类型,此处输入的参数,不要有on // 3,事件处理函数 : 可以是 匿名函数,也可以是函数名称 function myDelEvent(element , type , fun){ // 如果有 removeEventListener 这个方法,证明是普通浏览器 // 可以使用 removeEventListener 这个方法 if(element.removeEventListener){ // 给标签,直接绑定事件类型和事件处理函数 element.removeEventListener( type , fun ); }else{ // 没有 removeEventListener 这个方法,证明是低版本IE浏览器 // 使用 低版本IE浏览器语法 element.detachEvent( 'on' + type , fun ); } }
事件的传播和捕获
事件的传播:
所谓的事件的传播,是 JavaScript中 事件的一种执行方式
当前标签,触发事件时,父级标签,也会触发相同类型的事件
这样事件的执行方式成为 事件的传播 / 事件的冒泡
事件的捕获
事件的传播,有两种执行方式:
1,由内而外 : 子级 ---> 父级 事件的冒泡执行方式
2,由外而内 : 父级 ---> 子级 事件的捕获执行方式
目前,所有的是浏览器,都是按照 子级 --- 父级 按照事件的冒泡方式执行
可以通过 addEventListener() 定义 第三个参数 来 设定 事件的传播 执行方式
true : 捕获方式 执行
false : 默认的执行方式 冒泡方式执行
htmlcssjs
<div class="box"> <div class="middle"> <div class="inner" ></div> </div> </div>
*{ margin: 0; padding: 0; } .box{ width:800px ; height: 800px; background: pink; } .middle{ width:600px ; height: 600px; background: orange; } .inner{ width:400px ; height: 400px; background: green; }
// 给父子级关系的三个标签,都添加相同的事件类型 // 点击 inner最里面的标签,两个父级,绑定的,点击事件,也会一起触发 var oBox = document.querySelector('.box'); var oMiddle = document.querySelector('.middle'); var oInner = document.querySelector('.inner'); // 默认值 false 冒泡 子级---父级 // 设定为 true 捕获 父级---子级 oBox.addEventListener('click' , function(){console.log('我是box触发的')} , true); oMiddle.addEventListener('click' , function(){console.log('我是middle触发的')} , true); // ture 输出我是box触发的-->我是middle触发的-->我是inner触发的 // flase 输出我是inner触发的-->我是middle触发的-->我是box触发的 oInner.addEventListener('click' , function(){console.log('我是inner触发的')} , true);
阻止事件的传播
在绑定事件的同时,绑定阻止事件传播的兼容语法
if(e.stopPropagation){ // 标准浏览器 e.stopPropagation(); }else{ // 低版本IE e.cancelBubble = true; }
htmlcssjs
<div class="box"> <div class="middle"> <div class="inner" ></div> </div> </div>
*{ margin: 0; padding: 0; } .box{ width:800px ; height: 800px; background: pink; } .middle{ width:600px ; height: 600px; background: orange; } .inner{ width:400px ; height: 400px; background: green; }
// 给父子级关系的三个标签,都添加相同的事件类型 // 点击 inner最里面的标签,两个父级,绑定的,点击事件,也会一起触发 var oBox = document.querySelector('.box'); var oMiddle = document.querySelector('.middle'); var oInner = document.querySelector('.inner'); // oBox添加阻止传播的代码,事件的传播,就到 box 为止 // box 的父级 就不会在触发相同类型的事件了 oBox.addEventListener('click', function (e) { e = e || window.event; if (e.stopPropagation) { // 标准浏览器 e.stopPropagation(); } else { // 低版本IE e.cancelBubble = true; } console.log('我是box触发的'); }); // 如果给 middle 添加 阻止传播,事件的传播就到middle为止 // box 以及 body html 等父级就不会触发了 oMiddle.addEventListener('click', function (e) { e = e || window.event; if (e.stopPropagation) { // 标准浏览器 e.stopPropagation(); } else { // 低版本IE e.cancelBubble = true; } console.log('我是middle触发的'); }); oInner.addEventListener('click', function (e) { e = e || window.event; if (e.stopPropagation) { // 标准浏览器 e.stopPropagation(); } else { // 低版本IE e.cancelBubble = true; } console.log('我是inner触发的'); });
Comments | NOTHING