我的前端学习笔记20——DOM、事件

1,dom对象的innerText和innerHTML有什么区别?

  • innerText是将对象中的字符串过滤组合展示;而innerHTML则是将对象中的所有内容都进行展示;
  • 对于链接,innerHTML会将其保留连接属性,而innerText则会将链接转化为字符串;

2,elem.children和elem.childNodes的区别?

  • elem.children:非标准型,它返回指定元素的子元素集合。只返回HTML节点。

  • elem.childNodes:标准型,返回指定元素的子元素集合,包括HTML属性,所有属性,文本。可以通过nodeType来判断是那种类型的节点,当nodeType==1时时元素节点,2是属性节点,3是文本节点。

    <html>
    <head>
    <meta charset="utf-8">
    </head>
    <body>
    <div id = "part">
    <p class="part1">段落二<a href=" http://www.baidu.com ">我是链接</a></p>
    <p class="part2">段落三</p>
    </div>
    </body>
    <script>
    var parts = document.getElementById("part")
    parts.children //  [p.part1, p.part2]
    parts.childNodes //  [text, p.part1, text, p.part2, text]
    </script>
    </html>
    

3,查询元素有几种常见的方法?

查询元素常见的方法

document节点获取

document.getElementById(' '):
返回匹配指定ID属性的元素节点.如果没有发现匹配的节点,则返回null。
document.getElementsByClassName(' '):
返回一个类似数组的对象(HTMLCollection类型的对象),包括了所有class名字符合指定条件的元素(搜索范围包括本身),元素的变化实时反映在返回结果中.这个方法不仅可以在document对象上调用,也可以在任何元素节点上调用;
document.getElementsByTagName(' '):
返回所有指定标签的元素(搜索范围包括本身).返回值是一个HTMLCollection对象,也就是说,搜索结果是一个动态集合,任何元素的变化都会实时反映在返回的集合中.这个方法不仅可以在document对象上调用,也可以在任何元素节点上调用;
document.querySelector(''):
返回匹配指定的CSS选择器的元素节点.如果有多个节点满足匹配条件,则返回第一个匹配的节点.如果没有发现匹配的节点,则返回null;
document.querySelectorAll():
返回匹配指定的CSS选择器的所有节点,返回的是NodeList类型的对象.NodeList对象不是动态集合,所以元素节点的变化无法实时反映在返回结果中;
document.getElementsByName():
方法用于选择拥有name属性的HTML元素,比如form、img、frame、embed和object,返回一个NodeList格式的对象,不会实时反映元素的变化。  
document.elementFromPoint(x, y):
elementFromPoint方法的参数x和y,分别是相对于当前窗口左上角的横坐标和纵坐标,单位是CSS像素。elementFromPoint方法返回位于这个位置的DOM元素,如果该元素不可返回(比如文本框的滚动条),则返回它的父元素(比如文本框)。如果坐标值无意义(比如负值),则返回nul

父元素节点获取:

parentNode
parentElement

兄弟节点获取:

nextSibling
previousSibling

通过子节点获取:

childNodes
firstChild
lastChild

4,如何创建一个元素?如何给元素设置属性?

创建元素:

创建元素

document.createElement(''):
createElement方法用来生成HTML元素节点。
document.createTextNode(''):
createTextNode方法用来生成文本节点,参数为所要生成的文本节点的内容。
document.DocumentFragment():
createDocumentFragment方法生成一个DocumentFragment对象。DocumentFragment对象是一个存在于内存的DOM片段,但是不
属于当前文档,常常用来生成较复杂的DOM结构,然后插入当前文档。这样做的好处在于,因为DocumentFragment不属于当前文档,
对它的任何改动,都不会引发网页的重新渲染,比直接修改当前文档的DOM有更好的性能表现。

属性操作:

getAttribute():getAttribute()用于获取元素的attribute值
createAttribute():createAttribute()方法生成一个新的属性对象节点,并返回它setAttribute():setAttribute()方法用于设置元素属性
removeAttribute():removeAttribute()用于删除元素属性

具体详见

5,元素的添加、删除?

appendChild():在元素末尾添加元素;
insertBefore():在某个元素前插入元素;
replaceChild():替换某个元素(要插入的元素,要替换的元素);
removeChild():删除元素;

举例:

<body>
<div id="part">
  <p class="part1">段落一<a href="#">我是链接</a></p>
</div>
<script>
var p = document.createElement('p');
document.body.appendChild(p);  //在body最后添加了<p></p>;

添加div,给div添加class,添加内容为hello:

<div class=wrap></div>
var node = document.createElement('div');
node.setAttribute('class','d');
node.innerHTML = "hello";
wrap.appendChild(node);

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

  • DOM0
    DOM0在事件监听使用方式上,采用HTML内链方式,即通过onclick 写在HTML标签里的事件

    <a href="#" onclick="console.log('clicked');">点我</a>
    或者:
    <div id="ct">
    <a class="button" href="#">点我</a>
    </div>
    <script>
    document.querySelector(".button").onclick = function(e){
    console.log('click me...');
    console.log(this.innerText);
    console.log(e);
    }
    

这种写法的缺点是不利于日后维护,代码只能使用一次,不可以重复使用。

  • DOM2
    DOM2事件有两种方法:addEventListener()和removeEventListener()。他们都返回三个参数,分别是:事件类型、事件处理方法、布尔值(默认为false,false是冒泡阶段处理,true是调用阶段处理)。

    <div id="ct">
    <a class="button" href="#">点我</a>
    </div>
    <script>
    document.querySelector("#ct").addEventListener('click', function(){
    console.log(this);
    console.log('in ct...');
    },false);
    

7,attachEvent与addEventListener的区别?

  • 适用的浏览器不同:
    addEventListener适用于现代浏览器(非低版本IE浏览器);
    attachEvent是最低版本IE浏览器的私有方法;

  • 参数和触发阶段不同:
    addEventListener有三个参数,分别是事件类型,事件处理方法,布尔值,其中布尔值可以定义处理方式在捕获/冒泡阶段触发;
    true表明该事件监听器绑定在捕获阶段(和目标阶段),false则表明绑定在冒泡阶段(和目标阶段)且false是被默认的选项。

  • 第一个参数的形式不同:
    addEventListener的第一个参数是click;
    attachEvent的第一个参数是onclick;

  • this不同:
    addEventListener中的this是触发事件的元素;
    attachEvent的this指代的是window;

  • 在同一个事件上绑定多个事件处理程序时的执行顺序不同:
    addEventListener会按照添加顺序并按照布尔值执行;
    attachEvent的执行是无序的;

8,解释IE事件冒泡和DOM2事件传播机制?

<html>
<head>
<meta charset="utf-8">
</head>
<body>
<div id="ct">
  <a class="button" href="#">点我</a>
</div>
</body>
<script>
document.querySelector(".button").onclick = function(e){
  console.log('click me...');
  console.log(this.innerText);
  console.log(e);
}
document.querySelector("#ct").addEventListener('click', function(){
  console.log(this);
  console.log('in ct...');
});
</script>
</html>
  • IE事件冒泡:
    IE事件冒泡是事件由第一个被触发的元素接收,然后逐级向上传播。


  • DOM2的事件传播机制:

DOM2事件传播,事件由最外层元素接收,然后逐层向内传播,这个过程为捕获阶段,当达到目标元素时,处于目标阶段,然后事件由目标元素向最外层开始传递,这个过程称之为冒泡阶段

捕获阶段:


9,如何阻止事件冒泡? 如何阻止默认事件?

常规浏览器:

  • 阻止事件冒泡:stopPropagation( )

    <body>
    <a id="btn" href="http://www.baidu.com">点我</a>
    <script>
    var btn = document.querySelector("#btn");
    btn.addEventListener('click',function(e){
    console.log('at btn...',e);
    e.stopPropagation();    //阻止事件冒泡函数
    })
    document.body.addEventListener("click",function(e){
    console.log('at body...',e);
    })
    </script>
    

当执行到a链接时,事件就会被阻止在a链接处,不会传到body上。

  • 阻止默认事件:preventDefault( )

    <body>
    <a id="btn" href="http://www.baidu.com">点我</a>
    <script>
    var btn = document.querySelector("#btn");
    btn.addEventListener('click',function(e){
    console.log('at btn...',e);
    e.preventDefault();    //阻止默认事件函数
    })
    document.body.addEventListener("click",function(e){
    console.log('at body...',e);
    })
    </script>
    

当点击a链接时,由于a链接默认会跳转,e.preventDefault()阻止了a链接的跳转。

IE浏览器:

  • 阻止事件冒泡:

    <body>
    <a id="btn" href="http://www.baidu.com">点我</a>
    <script>
    var btn = document.querySelector('#btn');
    btn.attachEvent('onclick',function(e){
    console.log('at btn...',e);
    e.cancelBubble = true;    //默认为false,设置为true后可以取消事件冒泡
    })
    </script>
    </body>
    
  • 阻止默认事件:

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

推荐阅读更多精彩内容

  • 问答 一、dom对象的innerText和innerHTML有什么区别? innerTextinnerText是一...
    婷楼沐熙阅读 395评论 0 0
  • dom对象的innerText和innerHTML有什么区别? innerHTML指的是从对象的起始位置到终止位置...
    coolheadedY阅读 479评论 0 0
  • DOM0级和DOM2级在事件监听使用方式上有什么区别? DOM0级事件监听:用JavaScript指定事件处理程序...
    LeeoZz阅读 366评论 0 1
  • 问答题 dom对象的innerText和innerHTML有什么区别?答:innerText和innerHTML都...
    饥人谷_桶饭阅读 480评论 0 0
  • 1.dom对象的innerText和innerHTML有什么区别? innerText是一个可写属性。将写入的内容...
    candy252324阅读 517评论 0 0