事件

2017-12-29  本文已影响0人  Tuuu

DOM0 事件和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>

上面代码为 button 添加了 click 事件的处理程序,在冒泡阶段触发,与上一种方法一样,这个程序也是在元素的作用域下运行,不过有一个好处,我们可以为 click 事件添加多个处理程序

<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);

    btnClick.addEventListener('click', function() {
        alert('Hello!');
    }, false);
</script>

这样两个事件处理程序会在用户点击 button 后按照添加顺序依次执行。

通过 addEventListener 添加的事件处理程序只能通过 removeEventListener 移除,移除时参数与添加的时候相同,这就意味着刚才我们添加的匿名函数无法移除,因为匿名函数虽然方法体一样,但是句柄却不相同,所以当我们有移除事件处理程序的时候可以这样写

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

<script type="text/javascript">
    var btnClick = document.getElementById('btnClick');

    var handler=function() {
        alert(this.id);
    }

    btnClick.addEventListener('click', handler, false);
    btnClick.removeEventListener('click', handler, false);
</script>

attachEvent与addEventListener的区别?

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

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

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

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

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

<!DOCTYPEhtml>
<html>
    <head>
        <metahttp-equiv="Content-type"content="text/html;charset=utf-8"/>
        <title>TestPage</title>
    </head>
    <body>
        <div>
            ClickHere
        </div>
    </body>
</html>

点击 div 区域后


事件冒泡模型.png

所有现代浏览器都支持事件冒泡,但IE5.5及更早版本中的事件冒泡会跳过<html>元素,从<body>直接到document,IE9、Firefox、Chrome、Safari则将事件一直冒泡到window对象。

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

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

<ul class="ct">
    <li>这里是</li>
    <li>饥人谷</li>
    <li>前端6班</li>
</ul>
<script>
// todo
</script>
<ul class="ct">
    <li>这里是</li>
    <li>饥人谷</li>
    <li>前端6班</li>
</ul>
<script>
  var ct= document.querySelector('ul');
  var showNode = document.querySelector('.showNode');
      ct.addEventListener('click', function(e){
          var target = e.target;
          if (target.tagName.toLowerCase() === 'li'){
            showNode.innerText = target.innerText;
          }
        })
</script>

补全代码,要求:

<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>
//你的代码
</script>

代码请点击

补全代码,要求:当鼠标放置在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>
//你的代码
</script>

代码请点击

上一篇 下一篇

猜你喜欢

热点阅读