DOM, 事件

2016-08-24  本文已影响0人  老虎爱吃母鸡
<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 = ''
<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),返回的子节点类型包括元素节点、注释节点、文本节点。常常会把列表之间的回车当成文本节点返回

node.parentNode.removeChild(node)
<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级
    - 简单
    - 跨浏览器
<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
event.stopPropagation()
    - IE中取消冒泡并不是一个方法,而是一个属性,默认是false
event.cancelBubble = true
- 阻止默认事件
    - DOM2级
event.preventDefault()
    - IE中取消默认事件也是一个属性,默认是true
event.returnValue = false
上一篇 下一篇

猜你喜欢

热点阅读