Make everything as simple as possible, but not simpler — Albert Einstein
把每件事,做简单到极致,但又不过于简单 - 阿尔伯特·爱因斯坦
由于不同的浏览器绑定事件的代码都不太一样,所以用jQuery来写代码,就屏蔽了不同浏览器的差异,我们总是编写相同的代码。
jQuery能够绑定的事件主要包括:
鼠标事件
- click: 鼠标单击时触发;
- dblclick:鼠标双击时触发;
- mouseenter:鼠标进入时触发;
- mouseleave:鼠标移出时触发;
- mousemove:鼠标在DOM内部移动时触发;
- hover:鼠标进入和退出时触发两个函数,相当于mouseenter加上mouseleave。
例如:
/* HTML:
* <a id="test-link" href="#0">点我试试</a>
*/
// 获取超链接的jQuery对象:
var a = $('#test-link');
a.on('click', function () {
alert('Hello!');
});
on
方法用来绑定一个事件,我们需要传入事件名称和对应的处理函数。
另一种更简化的写法是直接调用click()
方法:
a.click(function () {
alert('Hello!');
});
两者完全等价。我们通常用后面的写法。
键盘事件
键盘事件仅作用在当前焦点的DOM上,通常是<input>
和<textarea>
。
- keydown:键盘按下时触发;
- keyup:键盘松开时触发;
- keypress:按一次键后触发。
其他事件
- focus:当DOM获得焦点时触发;
- blur:当DOM失去焦点时触发;
- change:当
<input>、<select>
或<textarea>
的内容改变时触发; - submit:当
<form>
提交时触发; - ready:当页面被载入并且 DOM 树完成初始化后触发。
其中,ready
仅作用于document
对象。由于ready
事件在 DOM 完成初始化后触发,且只触发一次,所以非常适合用来写其他的初始化代码。
假设我们想给一个<form>
表单绑定submit
事件,下面的代码没有预期的效果:
<html>
<head>
<script>
// 代码有误:
$('#testForm).on('submit', function () {
alert('submit!');
});
</script>
</head>
<body>
<form id="testForm">
...
</form>
</body>
JavaScript 在此执行的时候,<form>
尚未载入浏览器,所以$('#testForm)
返回[]
,并没有绑定事件到任何 DOM 上
所以我们自己的初始化代码必须放到document
对象的ready
事件中,保证 DOM 已完成初始化:
<html>
<head>
<script>
$(document).on('ready', function () {
$('#testForm).on('submit', function () {
alert('submit!');
});
});
</script>
</head>
<body>
<form id="testForm">
...
</form>
</body>
由于ready
事件使用非常普遍,所以可以这样简化:
$(document).ready(function () {
// on('submit', function)也可以简化:
$('#testForm).submit(function () {
alert('submit!');
});
});
还可以再简化为:
$(function () {
// init...
});
如果你遇到$(function () {...})
的形式,牢记这是document
对象的ready
事件处理函数
事件参数
有些事件,如mousemove
和keypress
,我们需要获取鼠标位置和按键的值,否则监听这些事件就没什么意义了。所有事件都会传入Event 对象作为参数,可以从 Event 对象上获取到更多的信息
$(function () {
$('#testMouseMoveDiv').mousemove(function (e) {
$('#testMouseMoveSpan').text('pageX = ' + e.pageX + ', pageY = ' + e.pageY);
});
});
取消绑定
一个已被绑定的事件可以解除绑定,通过off('click', function)
实现
function hello() {
alert('hello!');
}
a.click(hello); // 绑定事件
// 10秒钟后解除绑定:
setTimeout(function () {
a.off('click', hello);
}, 10000);
事件触发条件
事件的触发总是由用户操作引发的
监控文本框的内容改动
var input = $('#test-input');
input.change(function () {
console.log('changed...');
});
当用户在文本框中输入时,就会触发change
事件。但是,如果用JavaScript 代码去改动文本框的值,将不会触发change
事件。