美文网首页前端学习
事件(进阶9作业)

事件(进阶9作业)

作者: Feiyu_有猫病 | 来源:发表于2017-06-07 00:16 被阅读83次

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

    • DOM0级事件:
      就是把一个方法赋值给一个元素的事件处理程序属性。
      使用方式:
    var btnClick = document.getElementById('btnClick');
        btnClick.onclick = function showMessage() {
            alert(this.id);
        };
    

    这样处理,事件处理程序被认为是元素的方法,事件处理程序在元素的作用域下运行,this就是当前元素,所以点击button结果是:btnClick
    这样还有一个好处,我们可以删除事件处理程序,只需把元素的onclick属性赋为null即可。

    • DOM2级事件定义了两个方法用于处理指定和删除事件处理程序的操作:
      addEventListener
      removeEventListener
      所有的DOM节点都包含这两个方法,并且它们都接受三个参数:
      事件类型
      事件处理方法
      布尔参数,如果是true表示在捕获阶段调用事件处理程序,如果是false,则是在事件冒泡阶段处理
      使用方式:
    var btnClick = document.getElementById('btnClick');
        btnClick.addEventListener('click', function() {
            alert(this.id);
        }, false);
    

    上面代码为button添加了click事件的处理程序,在冒泡阶段触发,与上一种方法一样,这个程序也是在元素的作用域下运行,不过有一个好处,我们可以为click事件添加多个处理程序。
    通过addEventListener添加的事件处理程序只能通过removeEventListener移除,移除时参数与添加的时候相同。

    • 区别
      DOM0级:
      使用该方式指定的事件处理程序被认为是元素的方法。
      使用该方式添加的事件处理程序会在事件流的冒泡阶段被处理。
      一个元素上一个事件只能定义一个事件处理程序,多次定义前者会被覆盖。
      DOM2级:
      使用指定的两种方法添加和删除事件。
      可以定义事件在捕获阶段或是在冒泡阶段被处理。
      同样的一个事件可以定义多个事件处理程序。

    题目2: attachEvent与addEventListener的区别?

    • 参数个数不相同,这个最直观,addEventListener有三个参数,attachEvent只有两个,attachEvent添加的事件处理程序只能发生在冒泡阶段,addEventListener第三个参数可以决定添加的事件处理程序是在捕获阶段还是冒泡阶段处理(我们一般为了浏览器兼容性都设置为冒泡阶段)

    • 第一个参数意义不同,addEventListener第一个参数是事件类型(比如click,load),而attachEvent第一个参数指明的是事件处理函数名称(onclick,onload)

    • 事件处理程序的作用域不相同,addEventListener的作用域是元素本身,this是指的触发元素,而attachEvent事件处理程序会在全局变量内运行,this指向window。

    • 为一个事件添加多个事件处理程序时,执行顺序不同,addEventListener添加会按照添加顺序执行,而attachEvent添加多个事件处理程序时顺序无规律(添加的方法少的时候大多是按添加顺序的反顺序执行的,但是添加的多了就无规律了),所以添加多个的时候,不依赖执行顺序的还好,若是依赖于函数执行顺序,最好自己处理,不要指望浏览。

    题目3: 解释IE事件冒泡和DOM2事件传播机制?

    • IE的事件冒泡:
      事件开始时由最具体的元素接收,然后逐级向上传播到较为不具体的元素。IE不支持事件流,只支持事件冒泡。
    事件冒泡图解
    • DOM2事件流:
      DOM2级事件规定事件流包括三个阶段,事件捕获阶段,处于目标阶段,事件冒泡阶段,首先发生的是事件捕获,为截取事件提供机会,然后是实际目标接收事件,最后是冒泡阶段。
    DOM2事件流图解

    题目4:如何阻止事件冒泡? 如何阻止默认事件?

    • 阻止事件冒泡:
      stopPropagation()方法(适用于现代浏览器)
      cancelBubble属性(适用于IE)
    function stopPropagation(e) {
        if (e.stopPropagation)
            e.stopPropagation();
        else
            e.cancelBubble = true;
    }
    
    • 阻止默认事件:
      preventDefault()方法(适用于现代浏览器)
      returnValue属性(适用于IE)
    function preventDefault(e) {
        if (e.preventDefault)
            e.preventDefault();
        else
            e.returnValue = false;
    }
    

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

    <ul class="ct">
        <li>这里是</li>
        <li>饥人谷</li>
        <li>前端6班</li>
    </ul>
    <script>
    var list = document.querySelector(".ct");
    list.addEventListener("click",function(e){
      console.log(e.target.innerText);
    },false);
    </script>
    

    题目6: 补全代码,要求:

    • 当点击按钮开头添加时在<li>这里是</li>元素前添加一个新元素,内容为用户输入的非空字符串;当点击结尾添加时在最后一个 li 元素后添加用户输入的非空字符串.
    • 当点击每一个元素li时控制台展示该元素的文本内容。
    <ul class="ct">
        <li>这里是</li>
        <li>饥人谷</li>
        <li>任务班</li>
    </ul>
    <input class="ipt-add-content" placeholder="添加内容"/>
    <button id="btn-add-start">开头添加</button>
    <button id="btn-add-end">结尾添加</button>
    <script>
    var addStart = document.querySelector("#btn-add-start");
    var addEnd = document.querySelector("#btn-add-end");
    var content = document.querySelector(".ipt-add-content");
    var list = document.querySelector(".ct");
    
    addStart.addEventListener("click",function(){
      if(content.value !== ""){
        var newLi = document.createElement("li");
        newLi.innerText = content.value;
        list.insertBefore(newLi,list.firstChild);
      }
    });
    
    addEnd.addEventListener("click",function(){
      if(content.value !== ""){
        var newLi = document.createElement("li");
        newLi.innerText = content.value;
        list.appendChild(newLi);
      }
    });
    
    list.addEventListener("click",function(e){
      console.log(e.target.innerText);
    });
    </script>
    

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

    <ul class="ct">
        <li data-img="https://img.haomeiwen.com/i5197150/10626c1cd3c69f34.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240">鼠标放置查看图片1</li>
        <li data-img="https://img.haomeiwen.com/i5197150/45b12c1e785da832.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240">鼠标放置查看图片2</li>
        <li data-img="https://img.haomeiwen.com/i5197150/ec33c6d63888fd4e.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240">鼠标放置查看图片3</li>
    </ul>
    <div class="img-preview"></div>
    <script>
    var list = document.querySelector(".ct");
    var preview = document.querySelector(".img-preview");
    var newimg = document.createElement("img");
    
    list.addEventListener("mouseover",function(e){
      if(e.target.tagName.toLowerCase() === 'li'){
        newimg.src = e.target.getAttribute('data-img');
        preview.appendChild(newimg);
      }
    });
    
    list.addEventListener("mouseout",function(){
      preview.removeChild(newimg);
    });
    </script>
    

    相关文章

      网友评论

        本文标题:事件(进阶9作业)

        本文链接:https://www.haomeiwen.com/subject/fwbwfxtx.html