DOM、事件

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

答:innerText是获取不带标签的文本,而innerHTML获取的是带标签的文本。都可以用作改写页面上的内容,innerHTML会获取该元素所子元素的内容。一般使用innerText的多一些,这样可以防止用户所提交的数据中存在代码,对页面产生影响。

    <p>hello <a href="#">hunger</a></p>
<script>
    var p = document.getElementsByTagName('p')[0]
    
</script>
2.elem.children和elem.childNodes的区别?

答:elem.children和elem.childNodes都是返回元素的直接子元素。区别有:

  • children只返回有标签的元素节点。
  • childNodes除了返回元素节点,还会返回文本节点,文本节点包括:空格、换行符等等。
    <div id="ct">
        <p>青青子衿, 悠悠我心</p>
    <p>hello <a href="#">hunger</a></p>
    </div>
<script>
    var a = document.getElementById("ct")
    console.log(a.children)
    console.log(a.childNodes)
</script>
3.查询元素有几种常见的方法?

答:常用的有六种方法他们分别是getElementById()、getElementsByClassName()、getElementsByTagName()、getElementByName()、querySelector()、querySelectAll()。

  • getElementById():通过Id名称来查询元素
document.getElementById('ct') //查询id为ct的元素
  • getElementsByClassName():通过Class名称来获取元素。
document.getElementsByClassName('box')//获取Class名称为box的元素。
  • getElementsByTagName():获取指定标签的元素,返回值是一个HTMLCollection对象(类似一个数组)。
document.getElementsByTagName('p')//获取所有p标签内容的一个类数组。
  • getElementsByName():查询拥有Name属性的HTML元素,比如form、img等,返回一个NodeList格式对象,不会实时反映元素变化。
document.getElementsByName('text')
  • querySelector():查询匹配指定的CSS选择器的元素节点,如果有多个节点满足条件,只返回第一项,IE8以上支持,现在很常用。
document.querySelector('#ct')//获取Id为ct的元素
  • querySelectorAll():同上但返回对象是NodeList。
4.如何创建一个元素?如何给元素设置属性?

答:创建一个元素createElement(),createTextNode()来往元素中添加文本,定义属性setAttribute(),里面传入两个值,第一个值为元素的属性,第二个值为定义的值。

<body>
        <p class="a">青青子衿,悠悠我心</p>
<script>
var newP = document.createElement('p');
var newText = document.createTextNode('但为君故,沉吟至今')
    newP.appendChild(newText)
    document.body.appendChild(newP)
    var a = document.querySelector('.a')
    a.setAttribute('align','center')
</script>
</body>
5.元素的添加、删除?

答:使用appendchild()在元素的末尾添加元素参数为添加进的元素,在上一题的例子中已经使用过这个。
使用insertBefore在某个元素之前插入元素节点,该方法有两个参数一个是被添加的元素,另一个被替换的元素。

        <div id="ct">
            <p>青青子衿,悠悠我心</p>
        </div>
        <script>
            var div = document.getElementById('ct'),
                    newContent = document.createTextNode('但为君故,沉吟至今');
            div.insertBefore(newContent, div.firstChild);
        </script>

使用 removChild()来删除某个元素,参数是待删除元素。
使用replaceChild()来替换某个元素,它有两个参数一个是替换的元素,另一个是被替换的元素。

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

答:DOM0事件就是通过onclick写在HTML标签里的事件,

<a href="#" onclick="console.log('clicked');">点我</a>

这种写法的缺点是不利于日后的代码维护,以及一个代码只能使用一次,没有复用性。
DOM2事件有两种方法一个是addEventListener()和removeEventListener() 它们都返回三个参数分别是事件类型、事件处理方法和布尔值默认为false,false是冒泡阶段处理,如果是ture就是在调用阶段处理。

    <input id='btn' type="button" name="name" value="点我啊" />

    <script>
        var btn = document.querySelector("#btn")
        btn.addEventListener("click",function(){
            console.log("哈哈")
        },false)
    </script>

DOM2可以给上面代码添加多个事件处理程序,对IE9以下的浏览器不支持。

7.attachEvent与addEventListener的区别?

答:

  • addEventListener是W3C标准,而attachEvent()不是W3C标准,并只支持IE8浏览器以下的
  • addEventListener里面有三个参数(类型、函数、布尔值)而attachEvent只有两个(类型、函数),只支持事件冒泡。
  • addEventListener接收的类型为click而attachEvent接收的是onclick。
  • addEventListener的移除函数方法是removeEventListener,而attachEvent移除函数的方法是detachEvent。
  • addEventListener的作用域是元素本身,this指的是触发元素,attachEvent的作用域是全局this指的是window。
  • addEventListener按照添加顺序执行,attachEvent没有顺序执行。
8.解释IE事件冒泡和DOM2事件传播机制?

答:

  • IE事件冒泡是事件由第一个被触发的元素接收,然后逐级向上传播,
  • DOM2事件传播,事件由最外层元素接收,然后逐层向内传播,这个过程为捕获阶段,当达到目标元素时,处于目标阶段,然后事件由目标元素向最外层开始传递,这个过程称之为冒泡阶段
9.如何阻止事件冒泡? 如何阻止默认事件?

答:阻止事件冒泡:e.stopPropagation()用来阻止事件传播,事件在document冒泡阶段是听不到响应的。
使用cancelable来查询默认事件是否被阻止,如果返回值为true,可以使用e.preventDefault()来阻止默认事件,比如阻止a链接的跳转。

代码题

有如下代码,要求当点击每一个元素li时控制台展示该元素的文本内容。不考虑兼容
<ul class="ct">
    <li>这里是</li>
    <li>饥人谷</li>
    <li>前端6班</li>
</ul>
<script>
    var ct = document.querySelector(".ct")
    ct.addEventListener("click",function(e){
        console.log(e.target.innerText)
    },false)
</script>
方法2
<ul class="ct">
    <li>这里是</li>
    <li>饥人谷</li>
    <li>前端6班</li>
</ul>
<script>
    var ct = document.getElementsByClassName("ct")[0].getElementsByTagName("li")
    for (var i= 0;i<ct.length;i++){
        ct[i].addEventListener("click",function(){
            console.log(this.innerText)
        })
    }

</script>

代码2
代码3
代码4
代码5

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

推荐阅读更多精彩内容