DOM, 事件

  • dom对象的innerText和innerHTML有什么区别?
    • Node.innerText
      • 这个API不是W3C标准的API,在FF45之间的版本不支持,现在已经支持


        2016-08-24_151412.png
      • 表示节点和它的子节点的文本内容
<div id="a">hello I'm a.
    <div id="aa">hello I'm aa.
        <div id="aaa">hello I'm aaa.</div>
    </div>
</div>
<script>
    var a = document.getElementById('a')
    console.log(a.innerText)
</script>

2016-08-24_151323.png

- 是可以修改的的,在如果在父节点上修改,会导致所有的子节点内容被改写

a.innerText = "modified"

2016-08-24_153513.png

- IE10和IE11中,如果textareaplaceholder属性,会获取placeholder作为textarea的value
- Element.innerHTML
- 这是个很强大的API,是符合W3C标准的API,但是在IE会有兼容问题,例如
2016-08-24_153733.png

1. IE8标签自动大写
2. 在IE9及以下,这些标签是只读的

col, colgroup, frameset, html, head, style, table, tbody, tfoot, thead, title, and tr
        3. 在IE10和IE11,如果`textarea`有`placeholder`属性,会获取`placeholder`作为`textarea`的value
    - 表示元素后代的所有HTML内容
2016-08-24_153901.png

- 常用来添加一个子节点,或者删除子节点
- 添加子节点

var ul = document.getElementsByTagName('ul')[0],
    lst = document.getElementsByTagName('li'),
    li = document.createElement('li')
ul.appendChild(li)
li.innerHTML = '<a href="">赵六</a><img src="" alt="">'
//不推荐用法,会导致ul的节点状态更新,原本的样式和事件都会失效
// ul.innerHTML+='<li><a href="">赵六</a><img src="" alt=""></li>'
        - 删除子节点
lst[0].innerHTML = ''
  • elem.children和elem.childNodes的区别?
<ul>
    <li>
        <a href="">li1</a>
    </li>
    <li>
        <a href="">li2</a>
    </li>
    <li>
        <a href="">li3</a>
    </li>
</ul>
<script>
    var ul = document.getElementsByTagName('ul')[0]
    console.log(ul.children)
    console.log(ul.childNodes)
</script>
2016-08-24_180753.png

- Element.children
- 非W3C标准
- 是一个只读属性,返回一个包含当前元素的子元素集合,HTMLCollection(live)
- IE9之前的版本会包含注释节点
- Element.childNodes
- W3C标准
- 也是只读属性,返回指定节点的子节点集合,NodeList(live),返回的子节点类型包括元素节点、注释节点、文本节点。常常会把列表之间的回车当成文本节点返回

  • 查询元素有几种常见的方法?
    • document.getElementById(idName)
      • 返回单一的元素
    • document|ele.getElementsByTagName(tagName)
      • 返回一个HTMLCollection(live)
    • document|ele.getElementsByClassName(className)
      • 返回一个HTMLCollection(live)
      • IE9之前的版本不支持
    • document|ele,querySelector(selection)
      • 返回匹配到的第一个元素
      • IE8不匹配id选择器的兄弟选择器(#a+p)
    • document|ele.querySelectorAll(selection)
      • 返回NodeList(non-live)
      • IE8不匹配id选择器的兄弟选择器(#a+p)
  • 如何创建一个元素?如何给元素设置属性?
    • 创建元素,document.createElement(tagName),传入的参数是一个标签
    • 设置属性主要有两种方法
      • element.setAttribute(name,value)能设置自定义的属性,可以直接传入属性名
      • 通过点直接设置,但是有些属性不能通过属性名直接访问,例如class,需要通过className来访问,例如style中的background-color也不能直接访问,需要改成驼峰式命名style.backgroundColor
  • 元素的添加、删除?
    • 元素添加
      • Node.appendChild(node),将一个节点插入到指定父节点的最后,其中Node是指定的父节点
      • Node.insertBefore(new,ref),在当前的某个子节点之前再插入一个子节点
    • 元素删除
      • Node.removeChild(child),从某个父节点中移除指定子节点,Node是指定的父节点,如果要使用这个方法删除某个节点,需要先访问到它的父节点
node.parentNode.removeChild(node)
  • DOM0 事件和DOM2级在事件监听使用方式上有什么区别?
<ul id="lst-wrap">
    <li class="lst">张三</li>
    <li class="lst">李四</li>
    <li class="lst">王五</li>
</ul>
<script>
    var ul = document.getElementById('lst-wrap'),
        li = ul.querySelectorAll('.lst')
    //DOM0级
    // for (var i = 0; i < li.length; i++) {
    //     li[i].onclick = function(event) {
    //         console.log(event.target.innerText)
    //     }
    // }
    //DOM2级事件委托
    function lstClick(event) {
        if (event.target.tagName === 'LI') {
            console.log(event.target.innerText)
        }
    }
    ul.addEventListener('click',lstClick)
</script> 
- DOM2级
    - 可以给一个事件注册多个监听器
    - 更加精细的控制事件监听器的触发(即可以选择捕获或者冒泡)
    - IE9之前不支持
- DOM0级
    - 简单
    - 跨浏览器
  • attachEvent与addEventListener的区别?
    • addEventListener()是W3C标准,但是在IE9之前不支持,addEventListener(),接受三个参数,第一个参数是事件类型,例如'click',第二个参数是事件处理程序,第三个参数可以选择是注册捕获事件还是冒泡事件
    • attachEvent()是IE实现的与DOM2级类似的方法,但是从IE11开始已经不再支持,attachEvent(),接受两个参数,第一个参数是事件类型,但是与addEventListener的参数不同,需要加on,例如'onclick',第二个参数是事件处理程序,没有第三个参数,默认是冒泡事件
  • 解释IE事件冒泡和DOM2事件传播机制?
    • 事件冒泡,当浏览器发展到第四代,IE和网景分别提出了相反的事件传播机制,其中IE提出的就是事件冒泡,事件冒泡就是,事件从最具体的元素(文档中嵌套最深的元素)向最不具体的元素传播
<div id="a">
    <div id="aa">
        <div id="aaa">
            <div id="aaaa">点我吧</div>
        </div>
    </div>
</div>
<script>
    var a = document.getElementById('a'),
        aa = document.getElementById('aa'),
        aaa = document.getElementById('aaa'),
        aaaa = document.getElementById('aaaa')
    a.addEventListener('click',function() {
        console.log('a')
    })
    aa.addEventListener('click',function() {
        console.log('aa')
    })
    aaa.addEventListener('click',function() {
        console.log('aaa')
    })
    aaaa.addEventListener('click',function() {
        console.log('aaaa')
    })
</script>
//输出aaaa,aaa,aa,a
- DOM2级事件传播机制,W3C采用了IE和网景的折中方式,先事件捕获,再事件冒泡,但是事件是注册在捕获过程还是冒泡过程是可选的,事件捕获就是,从文档中最不具体的那个元素向最具体的那个元素传播
<script>
    var a = document.getElementById('a'),
        aa = document.getElementById('aa'),
        aaa = document.getElementById('aaa'),
        aaaa = document.getElementById('aaaa')
    a.addEventListener('click',function() {
        console.log('冒泡a')
    })
    aa.addEventListener('click',function() {
        console.log('冒泡aa')
    })
    aaa.addEventListener('click',function() {
        console.log('冒泡aaa')
    })
    aaaa.addEventListener('click',function() {
        console.log('冒泡aaaa')
    })
    a.addEventListener('click',function() {
        console.log('捕获a')
    },true)
    aa.addEventListener('click',function() {
        console.log('捕获aa')
    },true)
    aaa.addEventListener('click',function() {
        console.log('捕获aaa')
    },true)
    aaaa.addEventListener('click',function() {
        console.log('捕获aaaa')
    },true)
</script>
2016-08-24_215943.png
  • 如何阻止事件冒泡? 如何阻止默认事件?
    • 阻止事件冒泡
      • DOM2级
event.stopPropagation()
    - IE中取消冒泡并不是一个方法,而是一个属性,默认是false
event.cancelBubble = true
- 阻止默认事件
    - DOM2级
event.preventDefault()
    - IE中取消默认事件也是一个属性,默认是true
event.returnValue = false
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,026评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,655评论 1 296
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,726评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,204评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,558评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,731评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,944评论 2 314
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,698评论 0 203
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,438评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,633评论 2 247
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,125评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,444评论 3 255
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,137评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,103评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,888评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,772评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,669评论 2 271

推荐阅读更多精彩内容

  • 1.dom对象的innerText和innerHTML有什么区别? innerText是一个可写属性。将写入的内容...
    candy252324阅读 490评论 0 0
  • 问答 一、dom对象的innerText和innerHTML有什么区别? innerTextinnerText是一...
    婷楼沐熙阅读 379评论 0 0
  • 问答题 dom对象的innerText和innerHTML有什么区别?答:innerText和innerHTML都...
    饥人谷_桶饭阅读 448评论 0 0
  • 1. dom对象的innerText和innerHTML有什么区别? innerText用于获取元素内的文本内容;...
    王康_Wang阅读 222评论 0 0
  • 在你到来之前 我在夜里想起你 无边的春草怎样穿越黑暗 你就怎样穿过黑夜 它们从黑暗里走出鲜艳的绿色 你从黑夜里结出...
    淑文许阅读 276评论 2 12