JS .addEventListener( ) 事件监听器:监听元素的事件,并设置事件发生时触发的函数,以及事件流(冒泡、捕获)

为什么使用事件监听?

当同一个对象使用.onclick的写法触发多个方法的时候,后一个方法会把前一个方法覆盖掉,也就是说,在对象的 onclick事件发生时,只会执行最后绑定的方法。而用事件监听则不会有覆盖的现象,每个绑定的事件都会被执行。

用 .addEventListener( ) 可以为元素绑定多个事件,而且每个事件都可以被执行,实现事件监听。

语法:

Element.addEventListener(event, function, useCapture)

event: 第一个参数是事件的类型 (如 "click" 或 "mousedown").

function: 第二个参数是事件触发后调用的函数

useCapture: 第三个参数是个布尔值用于描述事件是冒泡还是捕获。该参数是可选的。

<p>该实例使用 addEventListener() 方法在按钮中添加点击事件。 </p>
<button id="myBtn">点我</button>

<script>
document.getElementById("myBtn").addEventListener("click", function(){
    alert("Hello World!");
});
</script>

向一个元素添加多个事件

var x = document.getElementById("myBtn");
x.addEventListener("click", myFunction);
x.addEventListener("click", someOtherFunction);

function myFunction() {
    alert ("Hello World!")
}
function someOtherFunction() {
    alert ("函数已执行!")
}

向同一个元素中添加多个事件句柄(不同事件类型)

element.addEventListener("mouseover", myFunction);
element.addEventListener("click", mySecondFunction);
element.addEventListener("mouseout", myThirdFunction);

 向 Window 对象添加事件句柄

window.addEventListener("resize", function(){
    document.getElementById("demo").innerHTML = sometext;
});

事件冒泡或事件捕获?

事件传递有两种方式:冒泡与捕获。

事件传递定义了元素事件触发的顺序。 如果你将 <p> 元素插入到 <div> 元素中,用户点击 <p> 元素, 哪个元素的 "click" 事件先被触发呢?

冒泡 中,内部元素的事件会先被触发,然后再触发外部元素,即: <p> 元素的点击事件先触发,然后会触发 <div> 元素的点击事件。( 由内而外)

捕获 中,外部元素的事件会先被触发,然后才会触发内部元素的事件,即: <div> 元素的点击事件先触发 ,然后再触发 <p> 元素的点击事件。(由外而内)

addEventListener() 方法可以指定 "useCapture" 参数来设置传递类型:

addEventListener(event, function, useCapture);

useCapture 参数:默认值为 false, 即冒泡传递,当值为 true 时, 事件使用捕获传递。

JS 默认事件流为 事件冒泡(从内到外):

例子说明:

给爷爷元素、父元素、子元素都设置了点击事件。点击子元素时,3个点击事件都被触发。

触发顺序为:子元素 => 父元素 => 爷爷元素

从内到外,为事件冒泡机制

例子一、

<div id="app">
    <div class="outer" onclick="outer()">最外层
        <div class="middle" onclick="middle()">中间
            <div class="inner"  onclick="inner()">最内层点击我(^_^)</div>
        </div>
    </div>
    <p></p>
</div>
<script type="text/javascript">

function inner(){
                console.log( '触发了inner 事件'+"  target:"+event.target.className)
            }

function middle() {
                console.log( '触发了middle事件'+"  target:"+event.target.className)
            }

function outer() {
                console.log( '触发了outer事件'+"   target:"+event.target.className)
            }

</script>

例子二、只给最外的元素添加事件。因为事件冒泡机制,内部元素的事件会一层层往外传递

<div id="app">
    <div class="outer" onclick="outer()">最外层
        <div class="middle">中间
            <div class="inner" >最内层点击我(^_^)</div>
        </div>
    </div>
    <p></p>
</div>
<script type="text/javascript">

function outer() {
                console.log( '触发了事件的目标元素是'+"   target:"+event.target.className)
            }

</script>


更多 slibings 用法和事件冒泡与捕获:点击: 彻底弄懂JS的事件冒泡和事件捕获

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值