事件
背景:
因为JavaScript在浏览器中以单线程模式运行。页面加载后,一旦页面上所有的JavaScript代码被执行完后,就只能依赖触发事件来执行JavaScript代码。
浏览器在接收到用户的鼠标或键盘输入后,会自动在对应的DOM节点上触发相应的事件。如果该节点已经绑定了对应的JavaScript处理函数,该函数就会自动调用。
由于不同的浏览器绑定事件的代码都不太一样,所以用jQuery来写代码,就屏蔽了不同浏览器的差异,我们总是编写相同的代码
为什么要事件:
处理用户操作,鼠标点击,键盘输入
事件类型:3种
1.鼠标事件
2.键盘事件
键盘事件仅作用在当前焦点的DOM上,通常是<input>和<textarea>。
两个键一起按时
if (e.ctrlKey && e.keyCode == 10) {
alert("发送");
}
事件参数
有些事件,如mousemove和keypress,我们需要获取鼠标位置和按键的值,否则监听这些事件就没什么意义了。
所有事件都会传入Event对象作为参数,可以从Event对象上获取到更多的信息:
$(function () {
$('#testMouseMoveDiv').mousemove(function (e) {
$('#testMouseMoveSpan').text('pageX = ' + e.pageX + ', pageY = ' + e.pageY);
});
});
3.其他事件
focus:当DOM元素获得焦点时触发;
blur:当DOM元素失去焦点时触发;
change:当<input>、<select>或<textarea>的内容改变时触发;
submit:当<form>提交时触发;
ready:页面加载完成后触发。
其中,ready仅作用于document对象。由于ready事件在DOM完成初始化后触发,且只触发一次,所以非常适合用来写其他的初始化代码
由于ready事件使用非常普遍,所以可以这样简化:
$(document).ready(function () {
});
如果你遇到$(function () {...})的形式,牢记这是document对象的ready事件处理函数。
绑定事件
function hello() {
alert('hello!');
}
a.click(hello); // 绑定事件
取消绑定(jquery)
a.off('click', function) 解除绑定
// 10秒钟后解除绑定:
setTimeout(function () {
a.off('click', hello);
}, 10000);
需要特别注意的是,下面这种写法是无效的:
// 绑定事件:
a.click(function () {
alert('hello!');
});
// 解除绑定:
a.off('click', function () {
alert('hello!');
});
这是因为两个匿名函数虽然长得一模一样,但是它们是两个不同的函数对象,off('click', function () {...})无法移除已绑定的第一个匿名函数。
off('click')一次性移除已绑定的click事件的所有处理函数。
无参数调用off()一次性移除已绑定的所有类型的事件处理函数。
事件触发条件
事件触发者:用户
var input = $('#test-input');
input.change(function () {
console.log('changed...');
});
当用户在文本框中输入时,就会触发change事件。
用JS代码去改动文本框的值,将不会触发change事件:
var input = $('#test-input');
input.val('change it!'); // 无法触发change事件
input.change(); // 触发change事件
有些时候,我们希望用代码触发change事件,可以直接调用无参数的change()方法来触发该事件
事件传播机制
分2个阶段:
1、捕获事件阶段
2、事件冒泡阶段
冒泡阶段
用"btn.oncklick"绑定事件处理函数,该事件是在冒泡阶段发生的
捕获事件阶段
用“ window.addEventListener()”绑定事件处理函数,可以在捕获阶段触发事件
// DOM2级绑定事件
// addEventListener(事件名称,事件回调函数,是否捕获)
// 第三个参数 true表示捕获阶段绑定 false表示冒泡阶段 默认值也是false
事件委托(事件代理)
当前事件源,委托祖先做某些事情(根据冒泡原理)
事件对象:
事件触发后会产生一个事件对象,包含事件信息
document.onmousemove = function(e) {
var e = e || window.event;//e就是事件对象,
}
事件冒泡
e.stopPropagation?e.stopPropagation():e.cancelBubble = true;
return false; // 阻止浏览器的默认行为
![]()