事件
- 事件介绍
- 内联模型
- 脚本模型
- 事件处理函数
JavaScript事件是由访问Web页面的用户引起的一系列操作,例如:用户点击。当用户执行某些操作的时候,再去执行一系列代码。
一.事件介绍
事件一般是用于浏览器和用户操作进行交互。最早是IE和Netscape Navigator中出现,作为分担服务器端运算负载的一种手段。直到几乎所有的浏览器都支持事件处理。而DOM2级规范开始尝试以一种复合逻辑的方式标准化DOM事件。IE9、Firefox、Opera、Safari和Chrome全都已经实现了“DOM2级事件”模块的核心部分。IE8之前浏览器仍然使用其专有事件模型。
JavaScript有三种事件模型:内联模型、脚本模型和DOM2模型。
这种模型是最传统接单的一种处理事件的方法。在内联模型中,事件处理函数是HTML标签的一个属性,用于处理指定事件。虽然内联在早期使用较多,但它是和HTML混写的,并没有与HTML分离。
内联模型
在HTML中把事件处理函数作为属性执行JS代码
<input type="button" value="按钮" onclick="alert('Lee');" /> //注意单双引号
//在HTML中把事件处理函数作为属性执行JS函数
<input type="button" value="按钮" onclick="box();" /> //执行JS的函数
PS:函数不得放到window.onload里面,这样就看不见了。
脚本模型
由于内联模型违反了HTML与JavaScript代码层次分离的原则。为了解决这个问题,我们可以在JavaScript中处理事件。这种处理方式就是脚本模型。
var input = document.getElementsByTagName('input')[0]; //得到input对象
input.onclick = function () { //匿名函数执行
alert('Lee');
};
通过匿名函数,可以直接触发对应的代码。也可以通过指定的函数名赋值的方式来执行函数(赋值的函数名不要跟着括号)。
input.onclick = box;
事件处理函数
JavaScript可以处理的事件类型为:鼠标事件、键盘事件、HTML事件。
事件处理函数 | 影响的元素 | 何时发生 |
---|---|---|
onabort | 视频和音频 | 当图像加载被中断时 |
onblur | 窗口、框架、所有表单对象 | 当焦点从对象上移开时 |
onchange | 输入框,选择框和文本区域 | 当改变一个元素的值且失去焦点时 |
onclick | 链接、按钮、表单对象、图像映射区域 | 当用户单击对象时 |
ondblclick | 链接、按钮、表单对象 | 当用户双击对象时 |
ondragdrop | 窗口 | 当用户将一个对象拖放到浏览器窗口时 |
onError | 脚本 | 当脚本中发生语法错误时 |
onfocus | 窗口、框架、所有表单对象 | 当单击鼠标或者将鼠标移动聚焦到窗口或框架时 |
onkeydown | 文档、图像、链接、表单 | 当按键被按下时 |
onkeypress | 文档、图像、链接、表单 | 当按键被按下然后松开时 |
onkeyup | 文档、图像、链接、表单 | 当按键被松开时 |
onload | 主题、框架集、图像 文档或图像 | 加载后 |
onunload | 主体、框架集 文档或框架集 | 卸载后 |
onmouseout | 链接 | 当图标移除链接时 |
onmouseover | 链接 | 当鼠标移到链接时 |
onmove | 窗口 | 当浏览器窗口移动时 |
onreset | 表单复位按钮 | 单击表单的reset按钮reset按钮 |
onresize | 窗口 | 当选择一个表单对象时 |
onselect | 表单元素 | 当选择一个表单对象时 |
onsubmit | 表单 | 当发送表格到服务器时 |
1.鼠标事件,页面所有元素都可触发
click:当用户单击鼠标按钮。
input.onclick = function () {
alert('click');
};
dblclick:当用户双击主鼠标按钮时触发。
input.ondblclick = function () {
alert('dblclick');
};
mousedown:当用户按下了鼠标还未弹起时触发。
input.onmousedown = function () {
alert('mousedown');
};
mouseup:当用户释放鼠标按钮时触发。
input.onmouseup = function () {
alert('mouseup');
};
mousemove:当鼠标指针在元素上移动时触发。
<div id="onmousemove" style="background-color: aqua;width: 500px;height: 500px;display: block">
onmousemove
</div>
<script>
function foo() {
console.log("我一直在移动");
}
document.getElementById("onmousemove").onmousemove = foo;
</script>
一般来说,onmouseover、onmouseout一起使用,鼠标经过时自身触发事件,经过其子元素时也触发该事件,每经过一次子元素都触发该事件,属于不断触发;onmouseenter、onmouseleave:鼠标经过时自身或者其子元素都触发事件,但是只触发一次。
<div id="first_layer" style="background-color: aqua;width: 500px;height: 500px">
第一层
<div id="second_layer" style="background-color: violet;width: 300px;height: 300px">
第二层
<div id="third_layer" style="background-color: yellow;width: 100px;height: 100px">
第三层
</div>
</div>
<script>
var onmouseover = document.getElementById("first_layer");
onmouseover.onmouseenter = function () {
console.log("onmouseenter");
}
onmouseover.onmouseleave = function () {
console.log("onmouseleave");
}
</script>
键盘事件
keydown:当用户按下键盘上任意键触发,如果按住不放,会重复触发。
document.onkeydown = function (e) {
alert('Lee');
};
keypress:当用户按下键盘上的字符键触发,如果按住不放,会重复触发。
document.onkeypress = function () {
alert('Lee');
};
keyup:当用户释放键盘上的键触发。
document.onkeyup = function () {
alert('Lee');
};
https://www.cnblogs.com/wuhua1/p/6686237.html
HTML事件
select:当用户选择文本框(input或textarea)中的一个或多个字符触发。
input.onselect = function () {
alert('Lee');
};
change:当文本框(input或textarea)内容改变且失去焦点后触发。
input.onchange = function () {
alert('Lee');
};
focus:当页面或者元素获得焦点时在window及相关元素上面触发。
input.onfocus = function () {
alert('Lee');
};
blur:当页面或元素失去焦点时在window及相关元素上触发。
input.onblur = function () {
alert('Lee');
};
submit:当用户点击提交按钮在元素上触发。
form.onsubmit = function () {
alert('Lee');
};
reset:当用户点击重置按钮在元素上触发。
form.onreset= function () {
alert('Lee');
};
resize:当窗口或框架的大小变化时在window或框架上触发。
window.onresize = function () {
alert('Lee');
};
scroll:当用户滚动带滚动条的元素时触发。
window.onscroll = function () {
alert('Lee');
};
事件绑定及深入
- 传统事件绑定的问题
- W3C事件处理函数
- IE事件处理函数
- 事件对象的其他补充
传统事件绑定的问题
问题一:一个事件处理函数触发两次事件
window.onload = function () { //第一组程序项目或第一个JS文件
alert('Lee');
};
window.onload = function () { /第二组程序项目或第二个JS文件
alert('Mr.Lee');
};
当两组程序或两个JS文件同时执行的时候,后面一个会把前面一个完全覆盖掉。导致前面的window.onload完全失效了。
事件流
页面中元素接受事件的顺序
谷歌IE--------事件冒泡流
事件由最开始的元素接收,然后逐级向上传播到最不具体的那个节点(文档)
你在地方法院要上诉一件案子,如果地方没有处理此类案件的法院,地方相关部门会帮你继续往上级法院上诉,比如从市级到省级,直至到中央法院,最终使你的案件得以处理。
网景--------事件捕获流
事件由最最不具体的那个节点(文档)元素接收,然后逐级向下广播到最具体的那个元素
W3C事件处理函数
“DOM2级事件”定义了两个方法,用于添加事件和删除事件处理程序的操作:addEventListener()和removeEventListener()。所有DOM节点中都包含这两个方法,并且它们都接受3个参数;事件名、函数、冒泡或捕获的布尔值(true表示捕获,false表示冒泡)。
window.addEventListener('load', function () {
alert('Lee');
}, false);
window.addEventListener('load', function () {
alert('Mr.Lee');
}, false);
阻止事件的默认行为—阻止冒泡
e.stopPropagation(),
写法
xxx.addEventListener("click",function (e) {
alert("child");
e.stopPropagation()
},false)