专题复习五、DOM API及事件监听

放自己用DOM写的作品链接
写于2017.08.07
一、关于DOM

  • 什么是DOM
    DOM是JavaScript操作网页的接口,全称为“文档对象模型”(Document Object Model)。它的作用是将网页转为一个JavaScript对象,从而可以用脚本进行各种操作(比如增删内容)。
    浏览器会根据DOM模型,将结构化文档(比如HTML和XML)解析成一系列的节点,再由这些节点组成一个树状结构(DOM Tree)。所有的节点和最终的树状结构,都有规范的对外接口。所以,DOM可以理解成网页的编程接口。
    严格地说,DOM不属于JavaScript,但是操作DOM是JavaScript最常见的任务,而JavaScript也是最常用于DOM操作的语言
  • DOM的节点
    DOM的最小组成单位叫做节点(node)。文档的树形结构(DOM树),就是由各种不同类型的节点组成。每个节点可以看作是文档树的一片叶子。
    节点的类型有七种。
    *Document:整个文档树的顶层节点
    *DocumentType:doctype标签(比如<!DOCTYPE html>)
    *Element:网页的各种HTML标签(比如<body>、<a>等)
    *Attribute:网页元素的属性(比如class="right")
    *Text:标签之间或标签包含的文本
    *Comment:注释
    *DocumentFragment:文档的片段
    DOM树如下图:

image.png

具体DOM学习建议参考链接:http://javascript.ruanyifeng.com/#dom
二、事件模型

  • 什么是事件
    事件是一种异步编程的实现方式,本质上是程序各个组成部分之间的通信。一般来讲,有一下特点:
    1、某某订阅了/关注/监听了×××
    2、×××发生变化
    3、某某得到通知
    体现在DOM机制里就是:用户的操作发生变化,代码得到通知

  • 事件EventTarget接口
    DOM的事件操作(监听和触发),都定义在EventTarget接口。Element节点、document节点和window对象,都部署了这个接口。此外,XMLHttpRequest、AudioNode、AudioContext等浏览器内置对象,也部署了这个接口。
    该接口就是3个方法:
    1、addEventListener:绑定事件的监听函数
    例:
    target.addEventListener(type, listener[, useCapture]);
    type:事件名称,大小写敏感。
    listener:监听函数。事件发生时,会调用该监听函数。
    useCapture:布尔值,默认为false(监听函数只在冒泡阶段被触发)。true是在捕获阶段触发
    addEventListener方法可以为当前对象的同一个事件,添加多个监听函数。这些函数按照添加顺序触发,即先添加先触发。如果为同一个事件多次添加同一个监听函数,该函数只会执行一次,多余的添加将自动被去除(不必使用removeEventListener方法手动去除)。
    2、removeEventListener:移除事件的监听函数
    例:
    div.addEventListener('click', listener, false);
    removeEventListener方法移除的监听函数,必须与对应的addEventListener方法的参数完全一致,而且必须在同一个元素节点,否则无效。
    3、dispatchEvent:触发事件
    dispatchEvent方法在当前节点上触发指定事件,从而触发监听函数的执行。该方法返回一个布尔值,只要有一个监听函数调用了Event.preventDefault(),则返回值为false,否则为true
    例:
    para.addEventListener('click', hello, false);
    var event = new Event('click');
    para.dispatchEvent(event);
    上面代码在当前节点触发了click事件

  • 3种绑定监听函数的方法
    1、HTML标签的on-属性
    例:元素标签的属性中,直接定义某些事件的监听代码
    <body onload="doSomething()">
    <div onclick="console.log('触发事件')">
    上面代码为body节点的load事件、div节点的click事件,指定了监听函数。
    使用这个方法指定的监听函数,只会在冒泡阶段触发

    另外,Element元素节点的setAttribute方法,其实设置的也是这种效果。
    el.setAttribute('onclick', 'doSomething()');
    2、Element节点的事件属性
    Element节点对象有事件属性,同样可以指定监听函数。
    例:
    window.onload = doSomething;
    div.onclick = function(event){
    console.log('触发事件');
    };
    使用这个方法指定的监听函数,只会在冒泡阶段触发。
    3、addEventListener方法
    window.addEventListener('load', doSomething, false);(详解如上)
    总结:第一种“HTML标签的on-属性”,违反了HTML与JavaScript代码相分离的原则;第二种“Element节点的事件属性”的缺点是,同一个事件只能定义一个监听函数,也就是说,如果定义两次onclick属性,后一次定义会覆盖前一次。

  • 事件的捕获与冒泡阶段
    1、操作系统最先知道用户点击了鼠标,浏览器次之
    2、child被点击了,意味着parent也被点击了
    3、那么如果同时监听了child和parent,谁先通知我
    例子:如果对parent和child同时设置了监听,那么当我点击child,谁先通知我
    捕获阶段:parent先通知,child后通知(一般不用)
    冒泡阶段:child先通知,parent后通知

  • e.target与e.currentTarget
    e.target代表你点击的那个元素,而e.currentTarget代表你监听的那个元素,如果你处于捕获或者冒泡阶段,二者是不一样的

  • 阻止默认事件
    document.querySelector("a").addEventListener('click',function(e){
    e.preventDefault()
    })
    这样的话a就不会跳转了。如果在父元素阻止默认事件,那a也不跳转了,所以一般不建议这样做

  • 停止冒泡
    e.stopPropagation( )(在子元素加入,则不通知爸爸了,不会再向上传播)

  • 事件委托
    由于事件会在冒泡阶段向上传播到父节点,因此可以把子节点的监听函数定义在父节点上,由父节点的监听函数统一处理多个子元素的事件。这种方法叫做事件委托
    例:
    HTML代码:
    <ul>
    <li>选项1</li>
    <li>选项2</li>
    <li>选项3</li>
    <li>选项4</li>
    </ul>
    JS代码:
    var ul =document.querySelector('ul')
    function fn(e){
    if(e.target.tagName ==="LI"){
    console.log("ok")(如果li里面裹一层span,点击span就不能执行监听函数)
    }
    }
    ul.addEventListener('click',fn)
    优化执行函数:
    function fn(e){
    var el = e.target
    while(el.tagName !=="LI"){
    el =el.parentNode(向上遍历父元素)
    }
    if(el){
    console.log('yes')
    }
    }
    但是实际上我只需要遍历到我监听的元素就可以了,如果直到遍历到监听的元素还没有的话,就认为没有了
    例:
    HTML代码:
    <div>
    <p>我是<span>p</span></p>
    <hi>我是<span>h1</span></hi>
    </div>
    JS代码:
    var div =document.querySelector('div')
    function fn(e){
    var el = e.target
    while(el.tagName !=="H1"){
    el =el.parentNode(向上遍历父元素)
    if(el===div){
    el=null
    break;
    }
    }
    if(el){
    console.log('yes')
    }
    }
    div.addEventListener('click',fn(e))

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

推荐阅读更多精彩内容

  • 事件是一种异步编程的实现方式,本质上是程序各个组成部分之间的通信。DOM支持大量的事件,本节介绍DOM的事件编程。...
    周花花啊阅读 592评论 0 3
  • 题目1: DOM0 事件和DOM2级在事件监听使用方式上有什么区别? Dom0级Dom0级事件处理程序是将一个函数...
    QQQQQCY阅读 316评论 0 0
  • 问答 一、dom对象的innerText和innerHTML有什么区别? innerTextinnerText是一...
    婷楼沐熙阅读 398评论 0 0
  • 导读:本文是teren对DOM事件知识点所做的进一步整理,整理资料主要参考DOM事件简介和饥人谷课件,如果对DOM...
    犯迷糊的小羊阅读 4,014评论 1 5
  • 中厅花正怒,香满院,游人不归蝶常舞,谁解其中味?黄花斗霜缀清秋,敢与时令争!花如此,我辈岂能屈?高朋满座,美酒佳肴...
    你就是我心中的棉花糖阅读 183评论 1 0