Javascript事件笔记

事件在DOM结构中传播的顺序叫事件流,分三个阶段:事件捕获、事件发生、事件冒泡

现代浏览器事件冒泡一直冒到window身上,事件捕获也延伸到window开始

事件级别

  • HTML事件 onclick = "showAlert(event)"
  • DOM0级事件 div.onclick = function(){}
  • DOM2级事件 addEventListen

事件的分类

UI事件、焦点事件、鼠标事件、滚轮事件、文本事件、键盘事件、设备事件。

UI事件指的是那些不一定与用户操作有关的事件。包括:
  • load 当页面完全加载后(包括所有图像、Javascript文件、CSS文件等外部资源)就会触发window身上的load事件。当我们为image图像指定事件时,需要先指定事件,然后设置 src 才能在图像加载完毕触发事件,否则不能生效。
  • unload window身上
  • abort
  • error window身上
  • select 表单元素
  • resize window身上
  • scroll window和body身上触发,有兼容性问题,
焦点事件
  • focus 不冒泡
  • blur 不冒泡
  • focusin 冒泡
  • focusout 冒泡
鼠标事件与滚轮事件
  • click
  • dbclick
  • mousedown
  • mouseenter 鼠标光标从元素外部首次移动到元素范围之内时触发,不冒泡,而且移动到后代元素上也不触发
  • mouseleave 在位于元素上方的鼠标光标移动到元素范围之外时触发,不冒泡,而且光标移动到后代元素上不会触发
  • mousemove 光标在元素内部移动时重复地触发。
  • mouseout 在鼠标指针位于一个元素上方,然后用户将其移入另一个元素时触发。一个元素可能位于前一个元素的外部,也可能是这个元素的子元素
  • mouseover 在鼠标指针位于一个元素外部,然后用户将其首次移入另一个元素边界之内触发
  • mouseup

客户区座标

  • event.clientX
  • event.clientY
  • event.pageX IE8下需要采用折衷方案计算出来scrollLeft 和scrollTop
  • event.pageY
  • event.screenX
  • event.screenY
iOS 和 Andriod 特殊处理
  • 不支持dbclick
  • 轻击可单击元素会触发mousemove事件。如果此操作会导致内容滚变化,将不再有其他事件法身滚;如果屏幕没有因此变化,那么一次会发生mousedown mouseup click 事件。轻击不可单击的元素不会触发任何事件。可单击的元素指那些淡季可产生默认操作的元素,或这那些已经被指定了onclick事件处理程序的元素。
  • mousemove事件也会触发mouseover 和 mouseout 事件
  • 两个手指放在屏幕上且页面随手指移动二滚动时会触发mousewheel 和 scroll事件。
键盘事件
  • keydown 按下任意键时触发,一直按下,一直触发,文本框变化前
  • keypress 按下任意键时触发,一直按下,一直触发,文本框变化前
  • keyup
  • textInput 用户在可编辑区域中输入字符时触发,退格键,button身上的都不能触发

contentmenu事件 在呼出快捷菜单时触发,具体可以参见范例。

DOMContentLoaded事件 DOM树加载完毕后触发,document身上或者window身上

pageshow 在页面onload之后触发,切换标签从缓存中读取时也会触发
pagehide

hashchange URL的参数列表发生变化时通知开发人员。window对象

设备事件
  • orientationchange事件 window身上,苹果ios系统 0 90 -90
  • deviceorientation xyz轴,
触摸手势事件
  • touchstart 冒泡

  • touchmove 冒泡

  • touchend 冒泡

  • touchcancel 冒泡

  • 以上事件的事件对象中不仅包括clientX等参数,还包括touches targetTouchs changeTouches等属性

  • touches 表示当前跟踪的触摸操作的Touch对象的数组

  • targetTouchs 特定与事件目标的Touch对象数组

  • changeTouches 表示自上此触摸以来发生了什么改变的Touch对象的数组

手势事件

  • gesturestart 当一个手指已经安在屏幕上,另一个手指有触摸屏幕时触发
  • gesturechange 当触摸屏上任意一个手指位置发生变化时触发
  • gestureend 当任何一个手指从屏幕上面移开时触发

事件委托

  • 利用事件冒泡和target来获取对应的元素
  • 移除事件处理程序
//scroll事件的触发
EventUtil.addHandler(window,"scroll",function (event) {
  if(document.compatMode == "CSS1Compat"){
    alert(document.documentElement.scrollTop);
  }else {
    alert(document.body.scrollTop);
  }
})

//计算IE8下pageX和pageY

//修改键

//快捷菜单范例
//跨浏览器事件解决方案
var EventUtil = {
  //添加事件
  addHandler: function (element,type,handler) {
    if(element.addEventListener){
      element.addEventListener(type,handler,false);
    } else if (element.attachEvent){
      element.attachEvent("on" + type,handler);
    } else {
      element["on" + type] = hanlder;
    }
  },
  //移除事件
  removeHandler: function (element, type, hanlder) {
    if(element.removeEventListener){
      element.removeEventListener(type,handler,false);
    }else if(element.detachEvent){
      element.detachEvent("on" + type, hanlder);
    } else {
      element["on" + type] = null;
    }
  },
  //获取事件对象
  getEvent: function (event) {
    return event ? event : window.event;
  },
  //获取事件发生时的目标对象
  getTarget: function (event) {
    return event.target || event.srcElement;
  },
  //事件发生时阻止默认行为
  preventDefault: function (event) {
    if(event.preventDefault){
      event.preventDefault();
    } else  {
      event.returnValue = false;
    }
  },
  //事件发生时阻止事件冒泡和捕获
  stopPropagation: function (event) {
    if(event.stopPropagation){
      event.stopPropagation();
    }else {
      event.cancelBubble = true;
    }
  },
  //当事件为mouseover和mouseout时,事件对象中会有相关元素,这里就是获取相关元素
  getRelatedTarget: function (event) {
    if(event.relatedTarget){
      return event.relatedTarget;
    }else if (event.toElement) {
      return event.toElement;
    }else if(event.fromElement) {
      return event.fromElement;
    }else {
      return null;
    }
  },
  //获取鼠标点击时,用的是哪个按键
  getButton: function (event) {
    if(document.implementation.hasFeature("MouseEvents","2.0")){
      return event.button;
    } else {
      switch (event.button) {
        case 0:
        case 1:
        case 3:
        case 5:
        case 7:
          return 0;
        case 2:
        case 6:
          return 2;
        case 4:
          return 1;
      }
    }
  },
  //获取鼠标滚轮滚动的方向,120为向上滚,-120为向下滚
  getWheelDelta: function (event) {
    if(event.wheelDelta){
      return (client.engine.opera && client.engine.opera < 9.5 ? -event.wheelDelta: event.wheelDelta)
    } else {
      return -event.detail * 40;
    }
  },
  //获取按键的编码
  getCharCode: function (event) {
    if(typeof event.charCode == "number"){
      return event.charCode;
    }else {
      return event.keyCode;
    }
  },
  //获取剪切板内容
  getClipboardText: function (event) {
    var clipboardData = (event.clipboardData || window.clipboardData);
    return clipboardData.getData("text");
  },
  //设置剪切板内容
  setClipboardText: function (event) {
    if(event.clipboardData){
      return event.clipboardData.setData("text/plain",value);
    } else if (window.clipboardData){
      return window.clipboardData.setData("text",value);
    }
  }
};
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容

  •   JavaScript 与 HTML 之间的交互是通过事件实现的。   事件,就是文档或浏览器窗口中发生的一些特...
    霜天晓阅读 3,470评论 1 11
  • JavaScript 与 HTML 之间的交互是通过事件实现的。事件,就是文档或浏览器窗口中发生的一些特定的交互瞬...
    LemonnYan阅读 673评论 0 4
  • 事件类型 Web 浏览器中可能发生的事件有很多类型UI事件:当用户与界面上的元素交互时触发。焦点事件:当元素获得或...
    shanruopeng阅读 901评论 0 0
  • 第3章 基本概念 3.1 语法 3.2 关键字和保留字 3.3 变量 3.4 数据类型 5种简单数据类型:Unde...
    RickCole阅读 5,096评论 0 21
  • 事件 http://www.w3school.com.cn/jsref/dom_obj_event.asp Jav...
    CMPEAX阅读 373评论 0 0