@Dale-Lin
2017-12-12T09:09:22.000000Z
字数 2900
阅读 1139
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参数值为falseelement.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 listvar target, elParent, elGrandparent;target = getTarget(e);elParent = target.parentNode;elGrandparent = elParent.parentNode;elGrandparent.removeChild(elParent);}
当处理器中遇到return flase的时候,将停止事件函数的运行(余下代码将不被执行),且停止事件流。这种使用方法可以作为一种同时使用preventDefult()和stopPropagation()的方法。
(鼠标)事件发生时,鼠标指针的位置有三种定位:
语法
例如:MouseEvent.screenX
同样,将事件作为默认参数传入一个函数内,再利用这个命名参数的上述属性进行对鼠标指针的定位。