jQuery - 理解事件代理

事件代理允许将单个的时间监听器,附加到父元素上,该事件会被所有该父元素的匹配的后代元素触发,无论该后代元素是当前存在的,或者是后续添加的。

示例:

<html>
<body>
<div id="container">
    <ul id="list">
        <li><a href="http://domain1.com">Item #1</a></li>
        <li><a href="/local/path/1">Item #2</a></li>
        <li><a href="/local/path/2">Item #3</a></li>
        <li><a href="http://domain4.com">Item #4</a></li>
    </ul>
</div>
</body>
</html>
// 附件事件处理函数
$( "#list a" ).on( "click", function( event ) {
    event.preventDefault();
    console.log( $( this ).text() );
});
// 在当前列表中加入新的元素
$( "#list" ).append( "<li><a href='http://newdomain.com'>Item #5</a></li>" );

当点击新加入的元素时,什么也不会发生。原因是先前加入的直接绑定事件处理函数。直系事件只会在 .on() 方法被呼叫时,附加在元素上。由于新加入的元素,在 .on() 方法被呼叫时,还不存在,所以该新加入的元素上不会附加事件处理函数。

事件传播 Event Propagation

如示例元素,当 <a> 被点击后,事件会冒泡传布至真个 DOM 树中,事件的传播顺序为:

  1. <a>
  2. <li>
  3. <ul #list>
  4. <div #container>
  5. <body>
  6. <html>
  7. document root

此种方式意味着,每次点击 <a> 元素,实际上是点击了真个文档体。这种模式称作:event bubbling 或者 event propagation。

// 附加代理事件处理函数
$( "#list" ).on( "click", "a", function( event ) {
    event.preventDefault();
    console.log( $( this ).text() );
});

使用触发元素

$( "#list" ).on( "click", "a", function( event ) {
    var elem = $( this ); // 代表 <a> 元素
    // 检测 <a> 元素的 href 属性是否为 http 起始
    if ( elem.is( "[href^='http']" ) ) {
        elem.attr( "target", "_blank" );
    }
});

// 简写方式
$( "#list" ).on( "click", "a[href^='http']", function( event ) {
    $( this ).attr( "target", "_blank" );
});

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值