DOM、事件

一、dom对象的innerTextinnerHTML有什么区别?

  <div id="test"> 
    <span style="color:red">test1</span> test2
  </div>
  <script>
    var test = document.getElementById("test");
  </script>
  • innerHTML返回的是从对象起始位置到终止位置的全部内容,包含HTML标签。
    上例中test.innerHTML的值是“<span style="color:red">test1</span> test2”
  • innerText返回的是从对象起始位置到终止位置的所有文本内容,不包含HTML标签。
    上例中test.innerText的值是“test1 test2”

二、elem.childrenelem.childNodes的区别?

  • elem.children返回当前元素的所有子元素节点的集合
  • elem.childNodes返回当前元素的所有子节点的集合,包含元素节点、属性节点和文本节点

elem.childrenelem.childNodes的区别是,elem.children只包含HTML元素类型的子节点,不包含其他类型的子节点。
可用nodeType来判断节点类型,当nodeType==1时是元素节点,2是属性节点,3是文本节点

三、查询元素有几种常见方法

  • getElementById():返回匹配指定ID属性的元素节点。
  • getElementByClassName():返回className符合指定条件的所有元素的集合。
  • getElementByTagName():返回所有指定标签的元素集合。
  • getElementByName():用于选择拥有name属性的HTML元素,比如form、img、frame、embed和object,返回所有满足条件的元素集合。(在IE浏览器使用这个方法,会将没有name属性、但有同名id属性的元素也返回,所以name和id属性最好设为不一样的值。)
  • querySelector():返回匹配指定的CSS选择器的元素节点。如果有多个节点满足匹配条件,则返回第一个匹配的节点。
  • querySelectorAll()返回匹配指定的CSS选择器的所有节点的集合。

四、如何创建一个元素?如何给元素设置属性?

  • 创建元素:var element = document.creatElement(元素名)
  • 给元素设置属性:元素节点.setAttribute(属性名, 值)

五、元素的添加、删除

  • 在元素末尾添加元素:appendChild(新节点)
    将新节点插入到当前结点末尾作为最后一个子节点
    var newDiv = document.createElement("div");
    var newContent = document.createTextNode("Hello");
    newDiv.appendChild(newContent);
  • 在某个元素之前插入元素:insertBefore(新节点, 参照子节点)
    将新节点插入当前结点的某个子节点前面
    var newDiv = document.createElement("div");
    var newContent = document.createTextNode("Hello");
    newDiv.insertBefore(newContent, newDiv.firstChild);
  • 删除元素:node.removeChild()
    删除当前结点的某个子节点

六、DOM0 事件和DOM2级在事件监听使用方式上有什么区别?

  • DOM0事件处理程序
    每个元素(包括windowdocument)都有自己的事件处理程序属性,这些属性通常全部小写,如onclick,将这种属性赋值为一个函数,就是DOM0 级事件处理程序的指定方式。如下:
    var btn = document.getElementById('myBtn'); // 取得对操作对象的引用
    btn.onclick = function () { // 为onclick赋值一个函数,指定事件处理程序
    console.log('hello');
    }
    移除事件处理程序:
    btn.onclick = null; // 只需将属性置空
    特点:

    • 添加事件处理程序的代码只有在运行完之后才会为元素绑定事件处理程序,因此如果该段代码为执行,单击按钮是没有反应的
    • 事件处理程序中的this引用当前元素,级绑定了该事件的元素
    • 以这种方式添加的事件处理程序会在事件的冒泡阶段被处理
    • 所有浏览器都支持DOM0级事件处理程序
  • DOM2级事件处理程序
    DOM2级事件处理程序定义了两个方法,用来指定和删除事件处理程序:addEventListener()removeEventListener()。这两个方法都接受三个参数:要处理的事件类型、作为事件处理程序的函数、一个布尔值。这个布尔值参数如果为true表示在事件捕获阶段调用事件处理程序,为false表示在事件冒泡阶段调用事件处理程序,一般设为false
    添加事件处理程序:
    var btn = document.getElementById('myBtn'); // 取得对操作对象的引用
    btn.addEventListener('click', function(){ // 注意是 click 哦~
    console.log('hello');
    }, false);

    function show() {
    console.log('hello');
    }
    var btn = document.getElementById('myBtn'); // 取得对操作对象的引用
    btn.addEventListener('click', show, false);
    移除事件处理程序:
    移除事件处理程序有一个要求就是:移除时传入的参数必须与添加事件处理程序时使用相同的参数。从而通过addEventListener()添加的匿名函数将无法移除。
    移除上面第二种方式绑定的事件处理程序代码:
    var btn = document.getElementById('myBtn'); // 取得对操作对象的引用
    btn.removeEventListener('click', show, false);
    通过addEventListener()添加的事件处理程序只能通过removeEventListener()来移除。

特点:

  • 只有运行完addEventListener()才会为元素绑定事件处理程序
  • 事件处理程序的this引用当前元素,即绑定了当前事件的元素
  • 通过设置第三个参数为truefalse可以设定在捕获阶段还是冒泡阶段调用事件处理程序
  • 可以为同一元素的同一事件绑定多个事件处理程序,绑定的事件处理程序会按照他们添加的先后顺序依次触发(DOM0级只能添加一个事件处理程序,后添加的会覆盖先添加的)
  • IE9、Firefox、Safari、Chrome和Opera都支持DOM2 级事件处理程序。

七、attachEventaddEventListener的区别?

  1. 参数及绑定阶段不同:
* 参数个数不同:`addEventListener()`有3个参数,`attachEvent()`有2个参数;
* `attachEvent()`事件处理程序只能绑定在事件冒泡阶段,`addEventListener()`可以通过其第三个参数设定为`true`或`false`来决定事件处理程序绑定在冒泡还是捕获阶段;
* 第一个参数意义不同:`addEventListener()`第一个参数是事件类型(如`click`、`load`),`attachEvent()`第一个参数是事件处理函数名称(如`onclick`、`onload`)
  1. 事件处理程序的作用域不同,addEventListener()作用域是元素本身,this指触发元素;attachEvent()在全局作用域中运行,thiswindow
  2. 在同一事件上绑定多个事件处理程序时执行顺序不同,addEventListener()是以添加他们的顺序执行,attachEvent()执行顺序是无序的

八、解释IE事件冒泡和DOM2事件传播机制?

  • IE事件冒泡
    接收事件的顺序是:事件开始由具体的元素接收,然后逐级向上传播到较为不具体的节点。

    如果页面中有个div,点击了div之后,事件的传播顺序如下:
    (1)div
    (2)body
    (3)html
    (4)document

    事件冒泡过程图如下:


所有现代浏览器都支持事件冒泡,而且IE9,Firefox、Chrome、Safari都将事件一直冒泡到window
对象。

  • DOM2事件传播机制
    事件传播包含三个阶段:事件捕获阶段处于目标阶段事件冒泡阶段
    如下图:

捕获阶段包括1、2、3,冒泡阶段包括4、5、6、7,其中4是处于目标阶段,在事件处理中被看成是冒泡阶段的一部分

虽然“DOM2级事件”规定捕获阶段不涉及事件目标,但是IE9,Firefox、Chrome、Safari和Opera9.5及以上版本都会在捕获阶段触发事件对象上的事件,这就意味着有两个机会在目标对象上面操作事件

IE9,Firefox、Chrome、Safari、Opera都支持“DOM2级事件传播机制”,IE8及更早版本不支持“DOM2级事件传播机制”。即IE9,Firefox、Chrome、Safari、Opera既支持冒泡又支持捕获,而IE8及以前版本仅支持冒泡。

需要说明的是,在实际中,大多数都使用冒泡事件,仅在有特殊需要时才使用捕获事件。

九、如何阻止事件冒泡? 如何阻止默认事件?

  • DOM中的事件对象(两个方法)
    • preventDefault()方法用来取消事件默认行为
    • stopPropagation()方法用来阻止事件进一步捕获或冒泡
      // 假设事件对象传入给参数event
      event.preventDefault(); // 取消事件默认行为
      event.stopPropagation(); // 阻止事件进一步捕获或冒泡
  • IE8及以下中的事件对象(两个属性)
    • returnValue属性用来设置事件的默认行为。默认值为true,当设置为false时,就会取消事件的默认行为。

    • cancelBubble属性用来取消事件冒泡。默认值为false,当设置为true时,就会阻止事件冒泡

      event.returnValue = false; // 取消事件的默认行为  
      event.cancelBubble = true; // 阻止事件冒泡
      

注:这两个属性仅IE8及以下版本支持,IE9+使用这两个属性会报错。


本文版权属吴天乔所有,转载务必注明出处。

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

推荐阅读更多精彩内容