饥人谷技术博客

DOM事件小结

2017-10-12  本文已影响0人  饥人谷_Jack

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

DOM0处理程序

<input type="button" value="Click Here" onclick="showMessage();" />
<input id="btnClick" type="button" value="Click Here" />

<script type="text/javascript">
    var btnClick = document.getElementById('btnClick');
    btnClick.onclick = function showMessage() {
        alert(this.id);
    };
</script>

DOM2处理程序

<input id="btnClick" type="button" value="Click Here" />

<script type="text/javascript">
    var btnClick = document.getElementById('btnClick');
    btnClick.addEventListener('click', function() {
        alert(this.id);
    }, false);
</script>

2. attachEvent与addEventListener的区别?

  1. 参数个数不相同,这个最直观,addEventListener有三个参数,attachEvent只有两个,attachEvent添加的事件处理程序只能发生在冒泡阶段,addEventListener第三个参数可以决定添加的事件处理程序是在捕获阶段还是冒泡阶段处理(我们一般为了浏览器兼容性都设置为冒泡阶段)
  2. 第一个参数意义不同,addEventListener第一个参数是事件类型(比如click,load),而attachEvent第一个参数指明的是事件处理函数名称(onclick,onload)
  3. 事件处理程序的作用域不相同,addEventListener的作用域是元素本身,this是指的触发元素,而attachEvent事件处理程序会在全局变量内运行,this是window.
  4. 为一个事件添加多个事件处理程序时,执行顺序不同,addEventListener添加会按照添加顺序执行,而attachEvent添加多个事件处理程序时顺序无规律(添加的方法少的时候大多是按添加顺序的反顺序执行的,但是添加的多了就无规律了),所以添加多个的时候,不依赖执行顺序的还好,若是依赖于函数执行顺序,最好自己处理,不要指望浏览器

3. 解释IE事件冒泡和DOM2事件传播机制?

4. 如何阻止事件冒泡? 如何阻止默认事件?

    <div class="ct">
        <div class="box">
            <button id="btn">点我</button>
        </div>
    </div>
    <script>
        var ct = document.querySelector('.ct');
        var box = document.querySelector('.box');
        var btn = document.querySelector('#btn');
        document.body.addEventListener('click',function() {
            console.log('body阶段')
        })
        ct.addEventListener('click',function(e) {
            e.stopPropagation()
            console.log('ct阶段')
        })
        box.addEventListener('click',function() {
            console.log('box阶段')
        })
        btn.addEventListener('click',function() {
            console.log('btn阶段')
        })
        
    </script>
image.png
    <a href="http://www.baidu.com" id="a">点我</a>
    <script>
        var a = document.querySelector('#a');
        a.addEventListener('click', function (e) {
            e.preventDefault()
        })
    </script>

5. 有如下代码,要求当点击每一个元素li时控制台展示该元素的文本内容。不考虑兼容

    <ul class="ct">
        <li>这里是</li>
        <li>饥人谷</li>
        <li>前端6班</li>
    </ul>
    <script>
        var ct = document.getElementsByClassName('ct')[0];
        ct.addEventListener('click', function (e) {
            if (e.target.nodeName.toLowerCase() === 'li') {
                console.log(e.target.innerText)
            }
        })
    </script>

6. 补全代码,要求:

   <ul class="ct">
        <li>这里是</li>
        <li>饥人谷</li>
        <li>任务班</li>
    </ul>
    <input type="text" class="ipt-add-content" placeholder="添加内容" />
    <button id="btn-add-start">开头添加</button>
    <button id="btn-add-end">结尾添加</button>
    <script>
        var btnStart = document.querySelector('#btn-add-start');
        var btnEnd = document.querySelector('#btn-add-end');
        var ct = document.querySelectorAll('.ct')[0];

        ct.addEventListener('click', function (e) {
            if (e.target.nodeName.toLowerCase() === 'li') {
                console.log(e.target.innerText)
            }
        })
        btnStart.addEventListener('click', function () {
            var text = document.querySelectorAll('.ipt-add-content')[0].value;
            if (text === '') {
                alert('不能为空')
            } else {
                var li = document.createElement('li');
                var firstChild = ct.childNodes[0]
                ct.insertBefore(li, firstChild);
                li.innerText = text;
            }
        })
        btnEnd.addEventListener('click', function () {
            var text = document.querySelectorAll('.ipt-add-content')[0].value;
            if (text === '') {
                alert('不能为空')
            } else {
                var li = document.createElement('li');
                li.innerText = text;
                ct.appendChild(li)
            }
        })
    </script>

7. 补全代码,要求:当鼠标放置在li元素上,会在img-preview里展示当前li元素的data-img对应的图片。

   <style>
        .img-preview {
            width: 300px;
            height: 200px;
        }

        img {
            height: 100%;
            width: 100%;
        }
    </style>
</head>

<body>
    <ul class="ct">
        <li data-img="../image/elephant.png">鼠标放置查看图片1</li>
        <li data-img="../image/read.jpg">鼠标放置查看图片2</li>
        <li data-img="../image/view.jpg">鼠标放置查看图片3</li>
    </ul>
    <div class="img-preview"></div>
    <script>
        var ct = document.querySelectorAll('.ct')[0];
        var img = document.createElement('img');
        var preview = document.querySelectorAll('.img-preview')[0];

        ct.addEventListener('mouseover', function (e) {
            preview.appendChild(img);
            var imgSrc = e.target.getAttribute('data-img');
            img.setAttribute('src', imgSrc)
        })     
    </script>
上一篇 下一篇

猜你喜欢

热点阅读