[关闭]
@Dale-Lin 2017-12-12T17:09:22.000000Z 字数 2900 阅读 828

JS Event

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 用户从一个表单域中选中了一些文本

  1. window.onload = function {
  2. }
  3. //window.onload将在页面完全加载完后触发
addEventListener()
  1. element.addEventListener("event", function, useCapture);
addEventListener()
  1. element.addEventListener("mouseover", func);
  2. //默认Capture参数值为false
  3. element.addEventListener("click", func, ture);
  4. //注意事件类型前不像HTML中用on前缀

ie浏览器只支持element.attachEvent("on" + event, fn);,且只支持bubbling。

封装成一个事件处理器添加函数:

  1. var addEvent = function(element, e, func){
  2. if (element.addEventListenser){
  3. element.addEventListenser(e, func, false);
  4. } else if (element.attachEvent){
  5. element.attachEvent('on' + e, func);
  6. }
  7. };

注意:传入的e是一个事件的字符串形式。


DOM中,事件流有两种:
1. capturing 事件捕获
2. bubbling 事件冒泡

capturing 的事件发生顺序是从元素外层向内层传导;
bubbling 的事件发生顺序是从元素最内层向外层传导;

当代码在一个元素和其祖先元素或后代元素上都有事件处理程序时,一定要注意事件流。


事件

事件将作为第一个匿名参数,传递给事件监听器的函数或事件的处理程序。
事件作为对象有以下属性和方法:

属性 目标
target 发生事件的最具体元素
type 发生的事件类型
cancelable 是否可撤销事件在该元素上的行为
方法 目标
preventDefault() 撤销(可撤销)元素的默认行为
stopPropagation() 停止事件传导
  1. function checkUsername(e){
  2. var target = e.target; //由第一个默认参数找到事件所在元素
  3. }
  4. var el = document.getElementById('username');
  5. el.addEventListener('blur', checkUsername); //事件监听器的函数中并未命名事件参数
  1. function checkUsername(e, minLength){
  2. var type = e.type;
  3. //some other code
  4. }
  5. var el = document.getElementById('username');
  6. el.addEventListener('blur', checkUsername(e, 5)); //在事件监听器内命名了函数参数

当页面中有大量交互事件时,为每个元素分别添加事件会让页面速度下降。应该在一类元素的容器元素上使用事件监听器和事件传导,并用target属性定位到发生交互事件的后代元素。


preventDefult() 可以将HTML标签中的超链接或者表单提交的页面跳转行为取消。

stopPropagation() 可以防止事件向其祖先元素传递,尤其是当其祖先元素具有相同类型的事件处理程序的时候。


  1. <ul id="shoppingList">
  2. <li class="complete"><a href="itemDone.php?id=1"><em>fresh</em> figs</a></li>
  3. <li class="complete"><a href="itemDone.php?id=1">pine nuts</a></li>
  4. <li class="complete"><a href="itemDone.php?id=1">honey</a></li>
  5. <li class="complete"><a href="itemDone.php?id=1">balasmic vinegar</a></li>
  6. </ul>
  1. function getTarget(e){
  2. return e.target
  3. }
  4. function itemDone(e) {
  5. //remove items from the list
  6. var target, elParent, elGrandparent;
  7. target = getTarget(e);
  8. elParent = target.parentNode;
  9. elGrandparent = elParent.parentNode;
  10. elGrandparent.removeChild(elParent);
  11. }

当处理器中遇到return flase的时候,将停止事件函数的运行(余下代码将不被执行),且停止事件流。这种使用方法可以作为一种同时使用preventDefult()stopPropagation()的方法。


确定鼠标事件发生时鼠标的位置

(鼠标)事件发生时,鼠标指针的位置有三种定位:

  1. 屏幕:使用事件的 screenXscreenY 属性,得到鼠标指针相对于显示器屏幕的位置。
  2. 页面:使用事件的 pageXpageY 属性,得到鼠标指针在页面中的位置。
  3. 客户端:使用事件的 clientXclientY 属性,得到鼠标指针相对于客户端显示内容的位置。

语法
例如:MouseEvent.screenX
同样,将事件作为默认参数传入一个函数内,再利用这个命名参数的上述属性进行对鼠标指针的定位。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注