Skip to content

jQuery 事件注册

mdn 界面上的事件:https://www.w3.org/TR/DOM-Level-3-Events

jQuery 为我们提供了方便的事件注册机制,是开发人员抑郁操作优缺点如下:

  • 优点: 操作简单,且不用担心事件覆盖等问题。
  • 缺点: 普通的事件注册不能做事件委托,且无法实现事件解绑,需要借助其他方法。

语法

JavaScript
element.事件(function () {
})

$("div").click(function () {
    // 事件处理程序
})

其他事件和原生基本一致

比如 mouseovermouseoutblurfocuschangekeydownkeyupresizescroll

演示代码

html
<div style="width: 200px;height: 200px;background-color: cyan;"></div>
javascript
$(function () {
  // 1. 单个事件注册
  $("div").click(function () {
    $(this).css("background", "purple");
  });
  $("div").mouseenter(function () {
    $(this).css("background", "skyblue");
  });
});

jQuery 事件处理

因为普通注册事件方法的不足,jQuery 又开发了多个处理方法,重点讲解如下:

  • on(): 用于事件绑定,目前最好用的事件绑定方法
  • off(): 事件解绑
  • trigger() / triggerHandler(): 事件触发

on() 绑定事件

因为普通注册事件方法的不足,jQuery 又创建了多个新的事件绑定方法 bind() / live() / delegate() / on() 等,其中最好用的是: on()

绑定多个事件

可以绑定多个事件,多个处理事件处理

javascript
$("div").on({
  mouseover: function () {},
  mouseout: function () {},
  click: function () {},
});

如果事件处理程序相同

javascript
$("div").on("mouseover mouseout", function () {
  $(this).toggleClass("current");
});

事件委派

可以事件委派操作。事件委派定义是,把原来加给子元素身上的事件绑定在父元素身上,就是把事件委派给父元素。

javascript
$("ul").on("click", "li", function () {
  console.log("hello world!");
});

在此之前有 bind(), live(), delegate() 等方法来处理事件绑定或者事件委派,最新版本的请用 on 替代他们。

动态绑定事件

动态创建的元素,click() 没有办法绑定事件。on() 可以给动态生成的元素绑定事件

javascript
$("div").on("click", "p", function () {
  console.log("俺可以给动态生成的元素绑定事件");
});
javascript
$("div").append($("<p>我是动态创建的p</p>"));

演示代码

html
<ul>
  <li>橘子</li>
  <li>西瓜</li>
  <li>哈密瓜</li>
</ul>
javascript
$(function () {
  // (1) on可以绑定1个或者多个事件处理程序
  // $("div").on({
  //     mouseenter: function() {
  //         $(this).css("background", "skyblue");
  //     },
  //     click: function() {
  //         $(this).css("background", "purple");
  //     }
  // });
  $("div").on("mouseenter mouseleave", function () {
    $(this).toggleClass("current");
  });

  // (2) on 可以实现事件委托(委派)
  // click 是绑定在 ul 身上的,但是 触发的对象是 ul 里面的小 li
  // $("ul li").click();
  $("ul").on("click", "li", function () {
    console.log($(this).text(), "被点击了");
  });

  // (3) on 可以给未来动态创建的元素绑定事件
  $("ol").on("click", "li", function () {
    console.log($(this).text(), "被点击了");
  });
  var li = $("<li>我是后来创建的</li>");
  $("ol").append(li);
});

案例2:事件委派

html
<ul>
  <li>li 1</li>
  <li>li 2</li>
  <li>li 3</li>
  <li>li 4</li>
  <li>li 5</li>
</ul>
javascript
$(function () {
  /*****************事件委派*************************/
  $("ul li").click(function () {
    console.log("普通绑定:\t", $(this).text());
  });

  // (2) on可以实现事件委托(委派)
  $("ul").on("click", "li", function () {
    console.log("事件委托:\t", $(this).text());
  });

  // 直接添加的元素,没有事件
  var li = $("<li>我是后来创建的</li>");
  $("ul").append(li);

  /********ol*********/
  // click 是绑定在 ul 身上的,但是 触发的对象是 ul 里面的小li
  // (3) on可以给未来动态创建的元素绑定事件
  $("ol li").click(function () {
    console.log("ol 普通绑定:\t", $(this).text());
  });

  var li = $("<li>我是后来创建的</li>");
  $("ol").append(li);

  // 事件委托之后才会打印
  $("ol").on("click", "li", function () {
    console.log("ol 事件委托:\t", $(this).text());
  });
});

off() 解绑事件

当某个事件上面的逻辑,在特定需求下不需要的时候,可以把该事件上的逻辑移除,这个过程我们称为事件解绑。jQuery 为我们提供 了多种事件解绑方法:die() / undelegate() / off() 等,甚至还有只触发一次的事件绑定方法 one(),在这里我们重点讲解一下 off() ;

语法

off() 方法可以移除通过 on() 方法添加的事件处理程序。

javascript
$("p").off(); // 解绑 p 元素所有事件处理程序
$("p").off("click"); // 解绑 p 元素上面的点击事件后面的 foo 是监听函数名
$("ul").off("click", "li"); // 解绑事件委托

如果有的事件只想触发一次,可以使用 one() 来绑定事件。

演示代码

html
<ul>
  <li>橘子</li>
  <li>西瓜</li>
  <li>哈密瓜</li>
</ul>
javascript
$(function () {
  // 事件绑定
  $("div").on({
    click: function () {
      console.log("我点击了");
    },
    mouseover: function () {
      console.log("我鼠标经过了");
    },
  });

  $("ul").on("click", "li", function () {
    alert(11);
  });

  // 1. 事件解绑 off
  // $("div").off();  // 这个是解除了 div 身上的所有事件
  $("div").off("click"); // 这个是解除了 div 身上的点击事件
  $("ul").off("click", "li");

  // 2. one() 但是它只能触发事件一次
  $("p").one("click", function () {
    alert(11);
  });
});

jQuery 事件对象

jQuery 对 DOM 中的事件对象 event 进行了封装,兼容性更好,获取更方便,使用变化不大。事件被触发,就会有事件对象的产生。

语法

javascript
element.on(events, [selector], function (event) {});

阻止默认行为: event.preventDefault() 或者 return false

阻止冒泡: event.stopPropagation()

演示代码

html
<body>
  <div style="width: 200px;height: 200px;background-color: cyan;"></div>
</body>
javascript
$(function () {
  $(document).on("click", function () {
    console.log("点击了document");
  });
  $("div").on("click", function (event) {
    // console.log(event);
    console.log("点击了div");
    event.stopPropagation();
  });
});

注意:jQuery 中的 event 对象使用,可以借鉴 API 和 DOM 中的 event 。