美文网首页
详解js中on和addEventListener用法

详解js中on和addEventListener用法

作者: isSunny | 来源:发表于2019-07-21 16:03 被阅读0次

js中on和addEventListener都是用来做事件绑定。下面我们来看一下它们的用法和区别在哪里。

1.on的用法

这里面的on并不是jquery里面的on方法,而是on+“事件”。
如:onclick/ondbclick
onkeyup(是在用户放开任何先前按下的键盘键时发生 )
onkeydown(用户按下没有放开任何按键,包括系统键时发生)
onkeypress(按下并放开字母键,不包括系统键时发生)
onmousemove/onmouseover/ommousedown/onmouseout
/onmouseup(释放)
onchang
onsubmit

写法obj.onclick= function(){}

2.addEventListener的用法

写法:
addEventListener(event,funtionName,useCapture)
参数:
event:事件的类型,不加on
funtionName:方法名
useCapture(可选):布尔值,指定事件是否在捕获或冒泡阶段执行,默认冒泡。
false-代表在冒泡阶段
true - 代表在捕获阶段

举个🌰

<div id="warper">1
        <div id="inner">2
            <div id="content">
                3
            </div>
        </div>
</div>
function fn1(){alert(1);}
function fn2(){alert(2);}
function fn3(){alert(3);}
warper.addEventListener("click",fn1,false);
inner.addEventListener("click",fn2,false);
content.addEventListener("click",fn3,false);

由上面例子,点content弹出3、2、1

warper.addEventListener("click",fn1,false);
inner.addEventListener("click",fn2,true);
content.addEventListener("click",fn3,true);

如果把后两个false改成true,此时点content又会弹什么呢?
对这个时候页面弹的是2、3、1

总结一下,就是如果useCapture值是true,是在捕获阶段执行,我们都知道捕获行为是由上往下,而冒泡阶段是自下往上,当绑定的事件存在useCapture是true时,先执行是true的事件,然后按照捕获和冒泡行为的顺序。上面的代码很容易理解了吧~

事件流的三个阶段:冒泡阶段、捕获阶段、目标阶段

下图是事件流

image.png

document代表的是整个html页面,
document.documentElement代表是的<html>标签。
document.body代表的是<body>标签。

当ie9以下不支持addEventListener的时候,我们可以用attchEvent

obj.addEvent(event,funtionName);
参数:
event:事件类型(需要加on)
funtionName:方法名
ie不支持捕获
整合以下兼容代码

function addEvent(element,type,fn){   //绑定事件
        if(element.addEventListener){      // IE9以下不兼容
            element.addEventListener(type,fn,false)
        }else if(element.attachEvent){     //IE独有
            element.attachEvent('on' + type , function () {
            fn.call(element);
//因为attachEvent方法在使用时,内部的this指向的是window,不方便,所以有时候要把这里的this变成自身
        })
        }else{
            element['on'+type] = fn;    //一个元素只能绑定一个处理程序
        }
    }

    

3.解绑事件-removeEventListener/detachEvent

 function removeHandler(element,type,fn){   //移除事件
        if(element.removeEventListener){    
            element.removeEventListener(type,handler,fn)
        }else if(element.detachEvent){         
            element.detachEvent('on' + type,fn)
        }else{
            element['on' + type ] = null;

        }
    }

4.阻止事件冒泡和捕获-stopPropagation()

阻止事件的继续传播。
🌰

  function fn3(event){
        event.stopPropagation();
        alert(3);
    }
    warper.addEventListener("click",fn1,false);
    inner.addEventListener("click",fn2,true);
    content.addEventListener("click",fn3,true);

此时点击content,弹出的是2、3,后面的1由于被阻断了,所以后面的内容不会被弹出了。
不过event.stopPropagation()函数并不会阻止当前函数内部的执行。

IE下用:cancelBubble = true;

function stopProp(){
      var ev = event||window.event;
      if (ev.stopPropagation){  
          ev.stopPropagation();  
     }else{  
          ev.cancelBubble=true;  
     }  
}

这里在说一下"event.preventDefault"和"return false"
event.preventDefault:阻止事件的默认行为
IE下用:returnValue=false;

function stopDefault() {
      var ev = event||window.event;
      if (ev.preventDefault){  
             ev.preventDefault();  
      }else{  
              ev.returnValue=false;  
       }  
}

return false:相当于同时调用event.stopPropagation()event.preventDefault()

5.on和addEventListener区别:

1.一个元素绑定多个相同的事件,后面的事件会覆盖掉之前的事件。
2.addEventListener则不会覆盖。

6.加一个移动端禁止触发事件(这个在我们写移动端页面的时候,常会用到)

function preHandler(event){
    event.preventDefault();
}
function addTouch(){//禁止
    document.documentElement.addEventListener('touchmove',preHandler,false,{ passive: false });
}
function removeTouch(){//启用
    document.documentElement.removeEventListener('touchmove',preHandler,false,{ passive: false });
}

相关文章

  • 详解js中on和addEventListener用法

    js中on和addEventListener都是用来做事件绑定。下面我们来看一下它们的用法和区别在哪里。 1.on...

  • HTML5 轮播图

    效果图 ACTION HTML JS addEventListener用法:http://www.runoob.c...

  • call apply

    js基础知识---call,apply,bind的用法 call,apply详解 javascript中,call...

  • js事件

    行间事件 js中绑定 addEventListener注册

  • js 循环

    js中forEach,for in,for of循环的用法 js的 for...in 和 for...of的用法 ...

  • JS中this的用法详解

    关键词:JavaScript this 前言 本文总结了几类JavaScript中,this的用法,同大家一起分...

  • 面向对象继承中call和apply

    .apply()用法和call()的区别 Js apply方法详解我在一开始看到javascript的函数appl...

  • OpenCV Mat类详解和用法

    OpenCV Mat类详解和用法 OpenCV Mat类详解和用法 [图片上传失败...(image-74f519...

  • JS的捕获、绑定和冒泡

    JS的addEventListener方法 addEventListener方法是将监听器绑定到某个Documen...

  • JS事件机制----捕获和冒泡

    在工作学习中,事件绑定机制用到了addEventListener()绑定方法,其具体用法如下: element.a...

网友评论

      本文标题:详解js中on和addEventListener用法

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