jQuery 事件注册
jQuery 为我们提供了方便的事件注册机制,是开发人员的福音,操作优缺点如下:
- 优点: 操作简单,且不用担心事件覆盖等问题。
- 缺点: 普通的事件注册不能做事件委托,且无法实现事件解绑,需要借助其他方法。
单个事件注册
语法:
element.事件(function(){})
$('div').click(function(){ 事件处理程序 })
其他事件和原生基本一致。比如mouseover、mouseout、blur、focus、change、keydown、keyup、resize、scroll
等
示例代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<div></div>
<script>
$(function() {
// 1. 单个事件注册
// $("div").click(function() {
// $(this).css("background", "purple");
// });
// $("div").mouseenter(function() {
// $(this).css("background", "skyblue");
// });
$("div").click(function () {
$(this).css("background", "purple");
});
$("div").mouseover(function () {
$(this).css("background", "skyblue");
});
})
</script>
</body>
</html>
jQuery 事件处理
因为普通注册事件方法的不足,jQuery又开发了多个处理方法,重点讲解如下:
on()
: 用于事件绑定,目前最好用的事件绑定方法off()
: 事件解绑trigger()
/triggerHandler()
: 事件触发
事件处理 on() 绑定事件
on()
方法在匹配元素上绑定一个或多个事件的事件处理函数
语法
element.on(events,[selector],fn)
参数:
events
:一个或多个用空格分隔的事件类型,如click
或keydown
。selector
: 元素的子元素选择器 。fn
:回调函数 即绑定在元素身上的侦听函数。
on()
方法优势1
可以绑定多个事件,多个处理事件处理程序
$("div").on({
mouseover: function () {},
mouseout: function () {},
click: function () {}
});
如果事件处理程序相同
$("div").on("mouseover mouseout", function () {
$(this).toggleClass("current");
});
on() 方法优势2
可以事件委派操作 。
事件委派的定义就是把原来加给子元素身上的事件绑定在父元素身上,就是把事件委派给父元素。
$('ul').on('click', 'li', function () {
alert('hello world!');
});
在此之前有bind()
,live()
,delegate()
等方法来处理事件绑定或者事件委派,最新版本的请用on替代他们。
on() 方法优势3
动态创建的元素,click()
没有办法绑定事件, on()
可以给动态生成的元素绑定事件
$("div").append($("<p>我是动态创建的p</p>"));
$("div").on("click", "p", function () {
alert("俺可以给动态生成的元素绑定事件")
});
注意: on通过事件委托绑定的事件,可以对未来元素生效。(未来元素指代码执行时还没有的元素,是后来动态添加的元素。)
理解:当p委托div处理点击事件的代码执行完成之后,又给div添加了一个p儿子,这个未来儿子p,也同样可以有委托。
示例代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<style>
div {
width: 100px;
height: 100px;
background-color: pink;
}
.current {
background-color: purple;
}
</style>
<script src="jquery.min.js"></script>
</head>
<body>
<div></div>
<ul>
<li>我们都是好孩子</li>
<li>我们都是好孩子</li>
<li>我们都是好孩子</li>
<li>我们都是好孩子</li>
<li>我们都是好孩子</li>
</ul>
<ol>
</ol>
<script>
$(function () {
// 2. 事件处理on
// (1) on可以绑定1个或者多个事件处理程序
// $("div").on({
// mouseenter: function() {
// $(this).css("background", "skyblue");
// },
// click: function() {
// $(this).css("background", "purple");
// },
// mouseleave: 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 () {
alert(11);
});
// (3) on可以给未来动态创建的元素绑定事件
$("ol li").click(function () {
alert(11);
});
// $("ol").on("click", "li", function() {
// alert(11);
// })
var li = $("<li>我是后来创建的</li>");
$("ol").append(li);
})
</script>
</body>
</html>
案例:发布微博案例
1.点击发布按钮, 动态创建一个小li,放入文本框的内容和删除按钮, 并且添加到ul 中。
2.点击的删除按钮,可以删除当前的微博留言。
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title></title>
<style>
* {
margin: 0;
padding: 0
}
ul {
list-style: none
}
.box {
width: 600px;
margin: 100px auto;
border: 1px solid #000;
padding: 20px;
}
textarea {
width: 450px;
height: 160px;
outline: none;
resize: none;
}
ul {
width: 450px;
padding-left: 80px;
}
ul li {
line-height: 25px;
border-bottom: 1px dashed #cccccc;
display: none;
}
input {
float: right;
}
ul li a {
float: right;
}
</style>
<script src="jquery.min.js"></script>
<script>
$(function() {
// 1.点击发布按钮, 动态创建一个小li,放入文本框的内容和删除按钮, 并且添加到ul 中
$(".btn").on("click", function() {
var li = $("<li></li>");
li.html($(".txt").val() + "<a href='javascript:;'> 删除</a>");
$("ul").prepend(li);
li.slideDown(); // 需要让li先隐藏,才能做向下 出现 的动画
$(".txt").val("");
})
// 2.点击的删除按钮,可以删除当前的微博留言li
// $("ul a").click(function() { // 此时的click不能给动态创建的a添加事件
// alert(11);
// })
// on可以给动态创建的元素绑定事件
$("ul").on("click", "a", function() {
// li向上隐藏
$(this).parent().slideUp();
// 删除li
$(this).parent().remove();
// $(this).parent().slideUp(function() { // this,事件源 ---a
// $(this).remove(); // this动画源---li
// });
})
})
</script>
</head>
<body>
<div class="box" id="weibo">
<span>微博发布</span>
<textarea name="" class="txt" cols="30" rows="10"></textarea>
<button class="btn">发布</button>
<ul>
</ul>
</div>
</body>
</html>
注意:
slideDown
,是做向下滑动的出现的动画,所以需要先隐藏,才能做此动画。slideUp
,是做向上滑动的隐藏动画,所以需要先出现,才能做此动画。
事件处理 off() 解绑事件
- 事件解绑:当某个事件上面的逻辑,在特定需求下不需要的时候,可以把该事件上的逻辑移除,这个过程我们称为事件解绑
- jQuery 为我们提供 了多种事件解绑方法:
die()
/undelegate()
/off()
等,甚至还有只触发一次的事件绑定方法one()
off()
方法可以移除通过 on()
方法添加的事件处理程序。
语法
$("p").off() // 解绑p元素所有事件处理程序
$("p").off("click") // 解绑p元素上面的点击事件 后面的 foo 是侦听函数名
$("ul").off("click", "li"); // 解绑事件委托
如果有的事件只想触发一次, 可以使用 one()
来绑定事件。
示例代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<style>
div {
width: 100px;
height: 100px;
background-color: pink;
}
</style>
<script src="jquery.min.js"></script>
<script>
$(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);
})
})
</script>
</head>
<body>
<div></div>
<ul>
<li>我们都是好孩子</li>
<li>我们都是好孩子</li>
<li>我们都是好孩子</li>
</ul>
<p>我是屁</p>
</body>
</html>
事件处理 trigger() 自动触发事件
-
有些时候,在某些特定的条件下,我们希望某些事件能够自动触发, 比如轮播图自动播放功能跟点击右侧按钮一致。(轮播图自动播放是通过设置间隔定时器,每次只需定时器回调函数,就触发右侧按钮的点击事件)
-
代码:
var timer = setInterval(function () {
//手动调用点击事件
arrow_r.click();
}, 2000);
-
可以利用定时器自动触发右侧按钮点击事件,不必鼠标点击触发。
-
由此 jQuery 为我们提供了两个自动触发事件
trigger()
和triggerHandler()
;
trigger()
语法
element.click() // 第一种简写形式
element.trigger("type") // 第二种自动触发模式
注意:type为事件类型
triggerHandler()
语法:
element.triggerHandler(type) // 第三种自动触发模式
triggerHandler
模式不会触发元素的默认行为,这是和前面两种的区别。
示例代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<style>
div {
width: 100px;
height: 100px;
background-color: pink;
}
</style>
<script src="jquery.min.js"></script>
<script>
$(function() {
// 绑定事件
$("div").on("click", function() {
alert(11);
});
// 自动触发事件
// 1. 元素.事件()
// $("div").click();会触发元素的默认行为
// 2. 元素.trigger("事件")
// $("div").trigger("click");会触发元素的默认行为
$("input").trigger("focus");
// 3. 元素.triggerHandler("事件") 就是不会触发元素的默认行为
$("input").on("focus", function() {
$(this).val("你好吗");
});
// 一个会获取焦点,一个不会
// $("div").triggerHandler("click");
// $("input").triggerHandler("focus");
});
// 注意: 默认行为解释: 当触发了text文本框获取焦点事件之后,会有一个默认行为就是光标停留
// 事件发生之后,会执行俩逻辑:1.事件处理程序,2.事件默认行为(如果有)
// 这里的默认行为,文本框获取焦点之后的默认光标停留行为
</script>
</head>
<body>
<div></div>
<input type="text">
</body>
</html>
总结
on()
:绑定事件,可做事件委托
off()
:可以解绑某个事件
trigger()和triggerHandler()
:触发某个事件,后者不会触动浏览器默认行为
jQuery 事件对象
jQuery 对DOM中的事件对象 event 进行了封装,兼容性更好,获取更方便,使用变化不大。
事件被触发,就会有事件对象的产生。
语法 :
element.on(events,[selector],function(event) {})
阻止默认行为:event.preventDefault()
或者 return false
阻止冒泡: event.stopPropagation()
示例代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<style>
div {
width: 100px;
height: 100px;
background-color: pink;
}
</style>
<script src="jquery.min.js"></script>
<script>
$(function() {
$(document).on("click", function() {
console.log("点击了document");
})
$("div").on("click", function(event) {
// console.log(event);
console.log("点击了div");
event.stopPropagation();
})
})
</script>
</head>
<body>
<div></div>
</body>
</html>
注意:jQuery中的 event 对象使用,可以借鉴 API 和 DOM 中的 event 。