细说 jQuery 事宜篇(四) - 转变事宜历程

《细说 jQuery 事宜篇(三) – 事宜流传》 中提到了事宜冒泡能够形成的弊病,当时举了 mouseout 的例子,关于 mouseout 这个特殊情况,我们能够用 hover 要领来处置惩罚,然则关于 hover 要领没法处置惩罚的情况,我们又应当怎样处置惩罚呢?
为此,我们必需经由历程接见事宜对象来转变事宜历程。

事宜对象是一种 DOM 构造,它会在元素取得处置惩罚事宜的时机时传递给挪用的事宜处置惩罚顺序。这个对象中包含着与事宜有关的信息。

事宜对象 eventtarget 属性指的是事宜目的,它将保留发作事宜的目的元素。
起首,我们举一个 hover 没法处置惩罚的例子:

<div class="wrapper">
  <span class="bar">
    <a href="http://segmentfault.com" target="_blank">segmentfault</a>
  </span>
</div>

款式为:

div {
  width: 200px;
  height: 200px;
  border: 1px solid #ccc;
}

《细说 jQuery 事宜篇(四) - 转变事宜历程》

我们的需求是仅仅当点击 div 地区时增加一个背景色,然则点击 a 标签时并不转变背景色。
增加款式为:

.blueBg {
  background-color: lightblue;
}

jQuery 代码为:

  $('div').click(function() {
    $('div').addClass('blueBg');
  });

此时点击 div 后:

《细说 jQuery 事宜篇(四) - 转变事宜历程》

但由于事宜冒泡的存在,当我们点击 a 标签跳出页面后,发明 div 的背景色也被转变。所以,接下来我们就要想办法转变事宜历程来阻挠这个行动。

阻挠事宜冒泡

应用事宜对象的 .stopPropagation() 要领能够阻挠事宜冒泡。下面我们来阻挠 a 标签向上冒泡。修正 jQuery 代码以下:

  $('a').click(function(event) {
    event.stopPropagation();
  });
  $('div').click(function(event) {
    $('div').addClass('blueBg');
  });

此时,再点击 a 标签将不会转变 div 的背景色。
然则依据 jQuery 文档的申明,stopPropagation 要领对 livedelegate 绑定的事宜是不支持的。

阻挠默许行动

假如此时我们还希望能阻挠 a 标签的默许行动,也就是翻开一个页面的行动,这里我们须要用到事宜对象的 .preventDefault() 要领。

  $('a').click(function(event) {
    event.preventDefault();
    event.stopPropagation();
  });
  $('div').click(function(event) {
    $('div').addClass('blueBg');
  });

此时,点击 a 标签不仅不会转变 div 的背景色,也不会翻开新的页面,也就是说默许行动被阻挠。

事宜托付

曾写过一篇引见事宜托付的博文 – 《Javascript – 事宜托付是怎样事情的?》。这里就不细致写了,然则 jQuery 供应了特地的要领来完成事宜托付,就是应用 .on() 要领。
关于之前博文的例子:

<ul id="parent-list">
    <li id="post-1">Item 1</li>
    <li id="post-2">Item 2</li>
    <li id="post-3">Item 3</li>
    <li id="post-4">Item 4</li>
    <li id="post-5">Item 5</li>
    <li id="post-6">Item 6</li>
</ul>

<script>
// 取得父级元素并增加 click 事宜监听
document.getElementById("parent-list").addEventListener("click",function(e) {
    // e.target 即 click 事宜发作的元素,同时推断该元素是不是是一个 li 标签
    if(e.target && e.target.nodeName == "LI") {
        // console 输出被点击的 li 标签的 id
        console.log("List item ",e.target.id," was clicked!");
    }
});
</script>

利于 jQueryon 要领能够简写为:

<ul id="parent-list">
    <li id="post-1">Item 1</li>
    <li id="post-2">Item 2</li>
    <li id="post-3">Item 3</li>
    <li id="post-4">Item 4</li>
    <li id="post-5">Item 5</li>
    <li id="post-6">Item 6</li>
</ul>
<script type="text/javascript">
$(function() {
  $('#parent-list').on('click', 'li', function(e) {
    console.log("List item ",e.target.id," was clicked!");
  })
});
</script>

参考

http://book.douban.com/subject/24669823/

    原文作者:StephenLee
    原文地址: https://segmentfault.com/a/1190000000524682
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞