jQuery 事件注册
mdn 界面上的事件:https://www.w3.org/TR/DOM-Level-3-Events
jQuery 为我们提供了方便的事件注册机制,是开发人员抑郁操作优缺点如下:
- 优点: 操作简单,且不用担心事件覆盖等问题。
- 缺点: 普通的事件注册不能做事件委托,且无法实现事件解绑,需要借助其他方法。
语法
element.事件(function () {
})
$("div").click(function () {
// 事件处理程序
})
其他事件和原生基本一致
比如 mouseover
、mouseout
、 blur
、 focus
、change
、 keydown
、 keyup
、resize
、scroll
等
演示代码
<div style="width: 200px;height: 200px;background-color: cyan;"></div>
$(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()
绑定多个事件
可以绑定多个事件,多个处理事件处理
$("div").on({
mouseover: function () {},
mouseout: function () {},
click: function () {},
});
如果事件处理程序相同
$("div").on("mouseover mouseout", function () {
$(this).toggleClass("current");
});
事件委派
可以事件委派操作。事件委派定义是,把原来加给子元素身上的事件绑定在父元素身上,就是把事件委派给父元素。
$("ul").on("click", "li", function () {
console.log("hello world!");
});
在此之前有 bind()
, live()
, delegate()
等方法来处理事件绑定或者事件委派,最新版本的请用 on
替代他们。
动态绑定事件
动态创建的元素,click()
没有办法绑定事件。on()
可以给动态生成的元素绑定事件
$("div").on("click", "p", function () {
console.log("俺可以给动态生成的元素绑定事件");
});
$("div").append($("<p>我是动态创建的p</p>"));
演示代码
<ul>
<li>橘子</li>
<li>西瓜</li>
<li>哈密瓜</li>
</ul>
$(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:事件委派
<ul>
<li>li 1</li>
<li>li 2</li>
<li>li 3</li>
<li>li 4</li>
<li>li 5</li>
</ul>
$(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() 方法添加的事件处理程序。
$("p").off(); // 解绑 p 元素所有事件处理程序
$("p").off("click"); // 解绑 p 元素上面的点击事件后面的 foo 是监听函数名
$("ul").off("click", "li"); // 解绑事件委托
如果有的事件只想触发一次,可以使用 one() 来绑定事件。
演示代码
<ul>
<li>橘子</li>
<li>西瓜</li>
<li>哈密瓜</li>
</ul>
$(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 进行了封装,兼容性更好,获取更方便,使用变化不大。事件被触发,就会有事件对象的产生。
语法
element.on(events, [selector], function (event) {});
阻止默认行为: event.preventDefault() 或者 return false
阻止冒泡: event.stopPropagation()
演示代码
<body>
<div style="width: 200px;height: 200px;background-color: cyan;"></div>
</body>
$(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 。