细说 jQuery 事件篇(五) – 事件的移除和重绑定


如果我们需要移除已经注册的事件处理程序,使某些处理程序失效。一种做法是在事件处理程序中使用条件语句进行判断,另一种更彻底的做法就是直接移除该处理程序。

移除处理程序

假设有个 divbutton,当我们点击 button 时即改变 div 的背景色,当如果我们点击 div 本身则移除 button 上的 click 事件处理程序。

<div></div>
<button>changeBgColor</button>

样式:

div {
  width: 200px;
  height: 200px;
  border: 1px solid #ccc;
}
.blue {
  background-color: blue;
}

jQuery 代码:

  $('button').click(function() {
    $('div').addClass('blue');//添加样式
  });

  $('button').click(function() {
    alert('change color!');
  });

  $('div').click(function() {
    $('button').off('click');
  });

这里为了区分两个不同的处理程序,特意将 addClassalert 过程分开来写。
当直接点击 button 按钮时,div 背景色发生改变,同时弹出 alert 框。

细说 jQuery 事件篇(五) - 事件的移除和重绑定

如果我们提前点击 div 后,使用 .off() 方法移除 button 按钮上的 click 事件处理程序。 此时再点击 button 按钮,click 事件处理程序不再生效。

移除特定的处理程序

在上例中,使用 off 方法移除了 button 按钮 click 事件内的所有的处理程序,但如果我们只想移除改变背景色的处理程序,同时保留 alert 处理程序的话,就需用使用事件命名空间。
事件命名空间其实就是在绑定事件处理程序时加入一些附加信息,用来识别特定的处理程序。
这里需要使用 .on() 方法。
使用 on 方法修改上例中的 jQuery 代码如下:

  $('button').on('click.changeBgColor', function() {
    $('div').addClass('blue');
  });

  $('button').on('click.justAlert', function() {
    alert('I want to change color!');
  });

  $('div').click(function() {
    $('button').off('click.changeBgColor');
  });

第一个事件处理程序我们添加附加信息,命名为 changeBgColor,第二个则命名为 justAlert。当点击 button 按钮后我们只移除 changeBgColor 相关的事件处理程序。
此时先点击 div 后,再点击 button,背景色改变失效,但 alert,仍然生效。

事件重绑定

我们添加一个 default 按钮,当点击 default 按钮后,所有的事件的处理程序又被重新绑定回来。为了能重复使用事件处理程序过程,我们需要使用一个匿名函数表达式来将其赋值给一个局部变量。
添加一个 default 按钮:

<div></div>
<button id="change">changeBgColor</button>
<button id="default">default</button>

修改 jQuery 代码如下:

  var changeBgColor = function() {
    $('div').addClass('blue');
  };
  var justAlert = function() {
    alert('I want to change color!');
  };

  $('button#change').on('click.changeBgColor', changeBgColor);

  $('button#change').on('click.justAlert', justAlert);

  $('div').click(function() {
    $('button#change').off('click.changeBgColor');
  });

  $('button#default').click(function() {
    $('button#change').on('click', changeBgColor);
  });

此时,如果我们先点击 div 后,再点击 change 按钮,修改背景色失效,但如果我们再点击 default 按钮,修改背景色的事件处理程序被重新绑定到 change 按钮的 click 事件中。

参考

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


8 responses on “细说 jQuery 事件篇(五) – 事件的移除和重绑定

发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>