@Dale-Lin
2017-12-12T17:09:22.000000Z
字数 2900
阅读 828
JavaScript
事件 | 说明 |
---|---|
load | Web页面加载完成 |
unload | Web页面卸载(通常是请求新页面) |
error | 浏览器遇到JS错误或不存在的资源 |
resize | 浏览器窗口大小发生变化 |
scroll | 用户使用滚动条移动页面 |
事件 | 说明 |
---|---|
keydown | 用户第一次按下某键(第一次按住会反复触发) |
keyup | 用户松开一个键 |
keypress | 键入了一个字符(input) |
触发顺序:keydown >> keypress >> keyup
事件 | 说明 |
---|---|
click | 按下并松开一个元素 |
dblclick | 双击并松开一个元素 |
mousedown | 按下一个元素 |
mouseup | 松开一个元素 |
mouseover | 鼠标移到一个元素上(触摸屏不会触发) |
mouseout | 鼠标从一个元素上移开(触摸屏不会触发) |
事件 | 说明 |
---|---|
focus | 元素得到焦点 |
blur | 元素失去焦点 |
事件 | 说明 |
---|---|
input | <input>或<textarea>元素中的值,或拥有contenteditable属性的元素中的值发生了变化 |
change | 复选框、单选框或单选按钮的值发生了变化 |
submit | 用户提交表单(使用键盘或按钮) |
reset | 用户使用了表单的重置按钮(很少使用) |
cut | 用户从一个表单域中剪切了内容 |
copy | 用户从一个表单域中复制了内容 |
paste | 用户从一个表单域中粘贴了内容 |
select | 用户从一个表单域中选中了一些文本 |
addEventListener()
window.onload = function {
}
//window.onload将在页面完全加载完后触发
addEventListener()
element.addEventListener("event", function, useCapture);
element.addEventListener("mouseover", func);
//默认Capture参数值为false
element.addEventListener("click", func, ture);
//注意事件类型前不像HTML中用on前缀
ie浏览器只支持element.attachEvent("on" + event, fn);,且只支持bubbling。
封装成一个事件处理器添加函数:
var addEvent = function(element, e, func){
if (element.addEventListenser){
element.addEventListenser(e, func, false);
} else if (element.attachEvent){
element.attachEvent('on' + e, func);
}
};
注意:传入的e是一个事件的字符串形式。
DOM中,事件流有两种:
1. capturing 事件捕获
2. bubbling 事件冒泡
capturing 的事件发生顺序是从元素外层向内层传导;
bubbling 的事件发生顺序是从元素最内层向外层传导;
当代码在一个元素和其祖先元素或后代元素上都有事件处理程序时,一定要注意事件流。
事件将作为第一个匿名参数,传递给事件监听器的函数或事件的处理程序。
事件作为对象有以下属性和方法:
属性 | 目标 |
---|---|
target | 发生事件的最具体元素 |
type | 发生的事件类型 |
cancelable | 是否可撤销事件在该元素上的行为 |
方法 | 目标 |
---|---|
preventDefault() | 撤销(可撤销)元素的默认行为 |
stopPropagation() | 停止事件传导 |
function checkUsername(e){
var target = e.target; //由第一个默认参数找到事件所在元素
}
var el = document.getElementById('username');
el.addEventListener('blur', checkUsername); //事件监听器的函数中并未命名事件参数
function checkUsername(e, minLength){
var type = e.type;
//some other code
}
var el = document.getElementById('username');
el.addEventListener('blur', checkUsername(e, 5)); //在事件监听器内命名了函数参数
当页面中有大量交互事件时,为每个元素分别添加事件会让页面速度下降。应该在一类元素的容器元素上使用事件监听器和事件传导,并用target属性定位到发生交互事件的后代元素。
preventDefult() 可以将HTML标签中的超链接或者表单提交的页面跳转行为取消。
stopPropagation() 可以防止事件向其祖先元素传递,尤其是当其祖先元素具有相同类型的事件处理程序的时候。
<ul id="shoppingList">
<li class="complete"><a href="itemDone.php?id=1"><em>fresh</em> figs</a></li>
<li class="complete"><a href="itemDone.php?id=1">pine nuts</a></li>
<li class="complete"><a href="itemDone.php?id=1">honey</a></li>
<li class="complete"><a href="itemDone.php?id=1">balasmic vinegar</a></li>
</ul>
function getTarget(e){
return e.target
}
function itemDone(e) {
//remove items from the list
var target, elParent, elGrandparent;
target = getTarget(e);
elParent = target.parentNode;
elGrandparent = elParent.parentNode;
elGrandparent.removeChild(elParent);
}
当处理器中遇到return flase
的时候,将停止事件函数的运行(余下代码将不被执行),且停止事件流。这种使用方法可以作为一种同时使用preventDefult()
和stopPropagation()
的方法。
(鼠标)事件发生时,鼠标指针的位置有三种定位:
语法
例如:MouseEvent.screenX
同样,将事件作为默认参数传入一个函数内,再利用这个命名参数的上述属性进行对鼠标指针的定位。