js事件

温故而知新,很多东西了解但不是很明确就很容易忘记,项目中就会不断的踩坑,所以今天宅在家里看看js的事件部分,争取早日爬出这个坑,进入下一个,好了回归正题。

一、 有关事件的几个概念

  1. 事件流:描述从页面中接收事件的顺序
  2. 事件处理程序:响应某个事件的函数就叫做事件处理程序,或者叫做事件侦听器
  3. 事件对象:在DOM上触发一个事件的时候会产生一个事件对象event,它包含所有与该事件有关的信息
  4. 事件类型:
  • ui事件,例如load,unload,resize,scroll
  • 焦点事件,例如focus,blur,focusin,focusout(备注:focus,blur不会冒泡,但是focusin,focusout支持)
  • 鼠标、滚轮事件,例如click, dblclick, mousedown, mouseenter......
  • 键盘事件,例如keydown,keypress(textInput),keyup

textInput事件与keypress稍有不同,区别之一是任何可以获取焦点的元素都可以触发keypress,但只有可编辑区域才能够触发textInput;二是textInput只有在用户按下能够输入实际字符的按键才会触发。另外event对象上还会有一个inputMethod属性表示输入到文本框的方式,例如1表示键盘输入,2表示粘贴......

  • 合成事件,例如compositionstart, compositionupdate,compositionend,这些事件会在输入框搜索建议的地方用到,后面会单独用一个文章说明
  • 变动事件
  • HTML5事件,例如hashchange
  • 设备事件
  • 触摸与手势事件,例如touchstart,touchmove,touchend

二、DOM事件流的三个阶段

  • 事件捕获阶段
    即事件从不太具体的节点开始最后是具体节点接收事件。ie9+支持
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title></title>
</head>
<body>
  <button>click</button>
</body>
</html>

上面的代码会依次发生在window --> document --> html --> body --> button

  • 处于目标阶段
  • 事件冒泡阶段
    即事件开始由最具体的元素接收然后逐级向上传播,所有现代浏览器都支持冒泡,但是具体会有差异。
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title></title>
</head>
<body>
  <button>click</button>
</body>
</html>

上面的代码会依次发生在button --> body --> html --> document
备注:ie5.5以及更早的版本会跳过document;ie9,firefox,chrome和safari都是将事件最后冒泡到window上面的

DOM2级事件规定首先发生的是事件捕获,为捕获事件提供了机会,然后是实际的目标接收到事件,最后一个阶段是冒泡,对事件作出响应

三、利用DOM事件流做事件代理

一个表格,里面含有N跳数据,每一条点击的时候都会展示对应的详情,结构如下

<ul>
  <li><span>xxxxxx</span><button>点击查看详情</button></li>
  <li><span>xxxxxx</span><button>点击查看详情</button></li>
  <li><span>xxxxxx</span><button>点击查看详情</button></li>
  <li><span>xxxxxx</span><button>点击查看详情</button></li>
  <li><span>xxxxxx</span><button>点击查看详情</button></li>
</ul>

很明显,如果给上面的每一个button绑定一个事件就会绑定很多事件,这个时候我们就可以利用事件的冒泡仅仅指定一个事件处理程序来处理这些事件,这个处理方式叫做事件代理

延伸问题:既然事件的代理是依靠事件冒泡的原理,那么blur和focus事件不支持冒泡,怎么处理呢?
用focusin,focusout?yes,但是这两个事件是不兼容的,所以需要特殊处理

  1. focusin 与 focusout的浏览器支持
    几乎所有的浏览器都支持focus和blur事件,但对于focusin和focusout 就不是这样理想了。Firefox中不支持focusin和focusout事件;chrome和safari中只有通过addEventListener方式绑定事件才能正常使用,其他方式绑定都不行
  2. 根据上面的支持,我们可以分为用addEventListener在捕获阶段绑定focus/blur的和直接绑定focusin,focusout的,示例代码如下
function consoleA (){
  console.log('a')
}
var form = document.forms['form'];
if (form.addEventListener) { // 非 IE 浏览器
  // 注意这个后面的参数是true,则表示是在捕获阶段的
  form.addEventListener('focus', consoleA, true);
}else{  // IE
  form.onfocusin = consoleA
}

之前也记录过一个关于blur和click事件踩过的坑,可以点击查看//www.greatytc.com/p/7d48cbe0a640

好了,这个文章就记录到这里,欢迎指正

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,718评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,683评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,207评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,755评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,862评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,050评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,136评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,882评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,330评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,651评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,789评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,477评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,135评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,864评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,099评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,598评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,697评论 2 351

推荐阅读更多精彩内容

  • 第1章 鼠标事件 1-1 jQuery鼠标事件之click与dbclick事件 用交互操作中,最简单直接的操作就是...
    mo默22阅读 1,263评论 0 6
  • 总结: 鼠标事件 1.click与dbclick事件$ele.click()$ele.click(handler(...
    阿r阿r阅读 1,599评论 2 10
  • 事件流 IE和Netscape开发团队提出了完全相反的两种事件流的概念,事件冒泡流和事件捕获流。 事件冒泡 事件由...
    exialym阅读 930评论 0 9
  • 13.1 事件流 “DOM2级事件”规定事件流包括3个阶段:事件捕获阶段,处于目标阶段,事件冒泡阶段。事件捕获表示...
    Elevens_regret阅读 416评论 0 0
  • 一阵凄清萧瑟的秋风吹过,菩提叶纷纷扬扬飘落,身在菩提树下的李静怡默默许下了一个心愿:若是今世修佛注因果,来世能...
    菩提亦般若阅读 1,545评论 2 3