事件的应用

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

  • DOM0级方法指定的事件处理程序被认为是元素的方法,就是将一个函数赋值给一个事件处理程序属性(每个元素包括window和document都有自己处理程序的属性)。例如:onclick、onmouseover、onmouseout等。因此,这时候的事件处理程序是在元素的作用域中执行的;例如DOM0级绑定事件的方法:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
    <div id="div1">点我</div>
</body>
<script type="text/javascript">
    var btn = document.getElementById('div1');
    btn.onclick = function(event){
        console.log(event);
        console.log(this.id); //div1
        console.log(this.innerHTML);//点我
    }
</script>
</html>

删除事件的方法是:

btn.onclick = null;
  • ’DOM2级事件’定义了两个方法,用于处理指定和删除事件处理程序的操作:addEventListener()和removeEventListener();所有的DOM节点都包含这两种方法。
    它们都接受3个参数:要处理的事件名,事件处理程序的函数,和一个布尔值。 最后一个参数:如果为true,表示在捕获阶段调用事件处理程序,如果是false,表示在冒泡阶段调用事件处理程序。例如:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
    <div id="div2">你可以改变世界!</div>
</body>
<script type="text/javascript">
    var btn2 = document.getElementById('div2');
    btn2.addEventListener('click', function(e){
        console.log(e);
        console.log(this);
        console.log(this.innerHTML);//你可以改变世界!
    }, false);
</script>
</html>

然后我们再给btn2添加一个事件:

    btn2.addEventListener('click', function(e){
        console.log(this.id) //div2
    }, false);

最后我们会看到,当点击div的时候,这两个事件都会发生,这就是DOM2级事件处理程序比DOM0级好的地方(DOM0级只能覆盖,不会连续触发!)。
  我们通过addEventListener()添加事件处理程序的程序只能使用removeEventListener()来移除。,这也意味着,通过addEventListener()添加的匿名函数无法移除:
接着以上的代码:

btn2.removeEventListener('click',function(e){
        console.log(this.id);
    },false); //虽然调用了移除函数,但是事件并没有移除

所以,我们必须使用这样的写法:

    function handler(){
        console.log('这次可以移除了!');
    }
    btn2.addEventListener('click',handler, false);
    btn2.removeEventListener('click',handler,false);

题目2: attachEvent与addEventListener的区别?

  • 参数个数不相同,addEventListener有三个参数,attachEvent只有两个,attachEvent添加的事件处理程序只能发生在冒泡阶段,addEventListener第三个参数可以决定添加的事件处理程序是在捕获阶段还是冒泡阶段处理(我们一般为了浏览器兼容性都设置为冒泡阶段)
  • 第一个参数意义不同,addEventListener第一个参数是事件类型(比如click,load),而attachEvent第一个参数指明的是事件处理函数名称(onclick,onload)
  • 事件处理程序的作用域不相同,addEventListener的作用域是元素本身,this是指的触发元素,而attachEvent事件处理程序会在全局变量内运行,this是window,所以会返回undefined,而不是元素id。
  • 为一个事件添加多个事件处理程序时,执行的顺序不同。 addEventListener 会按照添加的顺序执行。 attachEvent 添加多个事件处理程序时,顺序是无规律的。

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

  • IE事件冒泡是事件执行开始在具体元素,逐级向上执行
  • DOM2事件传播有三个阶段 事件捕获阶段、处于目标阶段、事件冒泡阶段 ,事件捕获阶段是从最上级window开始捕获事件,逐级向下传播到具体元素,执行事件后再逐级向上传播到window对象

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

  • 高版本浏览器方法
    stopPropagation()取消事件进一步捕获或冒泡
    preventDefault()取消事件默认行为
  • IE中 是属性
    cancelBubble默认为false,设置为true后可以取消事件冒泡
    returnValue默认为true,设为false可以取消事件默认行为

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

<ul class="ct">
    <li>这里是</li>
    <li>饥人谷</li>
    <li>前端6班</li>
</ul>
<script>
//todo ...
var Lis = document.querySelectorAll('li');
        Lis.forEach(function (li) {
            li.addEventListener('click',function () {
                console.log(this.innerText);
            })
        })
</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>
//你的代码
    function $(str) {
        return document.querySelector(str);
    }

    var ul = $('ul');
    var addStart = $('#btn-add-start');
    var addEnd = $('#btn-add-end');
    var inp = $('.ipt-add-content');

    addStart.addEventListener('click', function() {
              if(inp.value != ''){
        var newLi = document.createElement('li');
        newLi.innerText = inp.value;
        ul.insertBefore(newLi, ul.firstChild);
            }
    })

    addEnd.addEventListener('click', function() {
              if(inp.value != ''){
        var newLi = document.createElement('li');
        newLi.innerText = inp.value;
        ul.insertBefore(newLi, ul.lastChild);
              }
    })

    ul.addEventListener('click', function(e) {
        if(e.target.tagName.toLowerCase() === 'li') {
            console.log(e.target.innerText);
        }
    })
</script>

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

<ul class="ct">
    <li data-img="1.png">鼠标放置查看图片1</li>
    <li data-img="2.png">鼠标放置查看图片2</li>
    <li data-img="3.png">鼠标放置查看图片3</li>
</ul>
<div class="img-preview"></div>
<script>
//你的代码
var ct = document.querySelector('.ct');
    var imgPreview = document.querySelector('.img-preview');
    ct.addEventListener('mousemove', function(e) {
        if(e.target.tagName.toLowerCase() === 'li') {
            imgPreview.innerHTML = '<img src = "' + e.target.getAttribute('data-img') + '"/>';
        }
    })
</script>

推荐阅读更多精彩内容