JS:事件处理程序

在JQuery中有个toggle事件,可以绑定两个或多个函数,可以轮流相应click事件,这两天学习到原来javascript中有两个方法(也可以说是四个)同样可以实现这个功能。

#box{
        margin: 50px;
        width: 200px;
        height: 200px;
    }
.blue{
        background: blue;
    }
.red{
        background: red;
    }

1.W3C 下的事件处理:

  addEventListener() :用于处理指定的操作;

  removeEventListener():用于删除事件程序

这里两个方法都接受3个参数哦:要处理的事件名(click...),事件处理函数,一个布尔值(ture:表示捕获阶段调用事件处理程序,false表示:冒泡阶段调用)。

window.addEventListener("load", function(){
   var box = document.getElementById("box");
   box.addEventListener("click", toRed,false);
   box.addEventListener("click",function(){ //不会被误删,每次都执行
     this.innerHTML = "CCCCCCCCC";
   },false)

},false);

function toRed(){
    this.className = "red";
    // alert(this.tagName); this是事件目标(div)
    this.addEventListener("click",toBlue,false);
    this.removeEventListener("click",toRed,false);

}

function toBlue(){
      this.className = "blue";
      this.innerHTML = "NNNNNNN";
      this.addEventListener("click",toRed,false);
      this.removeEventListener("click",toBlue,false);

}

ps:通过addEventListener()添加的事件处理程序只能使用removeEventListener()来移除;移除是传入的参数与添加处理程序时使用的参数相同。这也意味着通过addEventListener()添加的匿名函数无法移除。

2.但是IE9以下的浏览器并不支持这两个方法,为此IE提供了另外两个方法:attachEvent()和detachEvent()

var btn = document.getElementById("box");

btn.attachEvent("onclick",function(){

  alert(this === window); //true ,这里的this是window对象

  alert(123);

});

btn.attachEvent("onclick",function(){

  alert(456);

});

这里调用了两次attachEvent(),为同一个按添加了两个不同的事件处理程序。但与DOM方法不同的是,这些事件处理程序不是以添加他们的顺序执行,而是以相反的顺序被触发。先弹“456”,然后是“123”。

ps:attachEvent()和detachEvent()也可以多次添加事件,通过attachEvent添加的匿名函数同样无法移除,参数处理事件名称之前要加“on”,没有布尔值.

3.跨浏览器的事件处理程序  

  

function addEvent(obj, type, fn){    //添加事件处理程序
    if (obj.addEventListener) {
      obj.addEventListener(type, fn, false);
    }else if (obj.attachEvent) {
       obj.attachEvent("on" + type, fn);
       }
   }

   function removeEvent(obj, type, fn){    //移除事件兼容
      if (obj.removeEventListener) {
        obj.removeEventListener(type, fn, false);
      }else if (obj.detachEvent) {
            obj.detachEvent("on" + type, fn);
          };
    }

    function getTarget(evt){    //跨浏览器获取目标对象
      if (evt.target) { //W3C
        return evt.target;
      }else if (window.event.srcElement) {
        return window.event.srcElement;
      }
    }

    addEvent(window, "load", function(){
      var btn = document.getElementById("box");
      addEvent(btn, "click", toRed);
    });

    function toRed(evt){
      var that = getTarget(evt);
      that.className = "red";
      addEvent(that, "click", toBlue);
      removeEvent(that,"click", toRed);
    }

    function toBlue(evt){
      var that = getTarget(evt);
      that.className = "blue";
      addEvent(that, "click", toRed);
      removeEvent(that, "click", toBlue);
    }

  

时间: 2024-11-06 13:39:39

JS:事件处理程序的相关文章

js事件处理程序学习与总结

(1)html事件处理程序,使用一个与相应事件处理程序同名的HTML特性来指定,可以定义事件处理程序是可以包含要执行的具体动作,也可以调用页面其他地方定义的脚本函数,但这种方法就是把javascript与html混写,一般开发,不建议使用,比如: <input type="button" value="提交" onsumit="alert(提交了?)"> (2)javascript指定事件处理程序 这种方法,必须先取得一个操作对象的引

js事件处理程序详解,html事件处理程序,dom0级事件处理程序,dom2级事件处理程序

博客搬迁,给你带来的不便,敬请谅解! http://www.suanliutudousi.com/2017/11/24/js%e4%ba%8b%e4%bb%b6%e5%a4%84%e7%90%86%e7%a8%8b%e5%ba%8f%e8%af%a6%e8%a7%a3%ef%bc%8chtml%e4%ba%8b%e4%bb%b6%e5%a4%84%e7%90%86%e7%a8%8b%e5%ba%8f%ef%bc%8cdom0%e7%ba%a7%e4%ba%8b%e4%bb%b6%e5%a4%84

js的事件处理程序

js事件处理程序一般有三种: 1.HTML事件处理程序 <body> <input type="button" value="点击" onclick="mes()" /> <!--js--> <script> function mes(){ document.write("hello world!"); } </script> </body> 这种事件方式

JS事件模型小结

08年年初的一篇blog,转到这个博客上,想想当年跨浏览器真是一座山: 前几天看dojo的文档,其中多次提到DOM2事件模型,以前学习这部分的内容,主要愤慨于IE的不兼容性了,现在对于DOM2事件模型的概念又有些模糊,所以翻出了js权威指南(V4)又复习了一下,简单作一小结.       JS权威指南中将JS事件模型分为四种            1.原始事件模型:属性事件处理模式            2.标准事件模型:DOM2对其作了标准化            3.IE事件模型(IE5.5

js跨浏览器事件对象、事件处理程序

项目中有时候会不用jquery这么好用的框架,需要自己封装一些事件对象和事件处理程序,像封装AJAX那样:这里面考虑最多的还是浏览器的兼容问题,原生js封装如下:var EventUtil={ //节点.事件名.事件处理函数 addHanler:function(element,type,handler){ if(element.addEventListener){ element.addEventListener(type,handler,false);//这里一个参数为false意为在事件冒

javascript将DOM事件处理程序封装为event.js 出现的低级错误记录

将 DOM 0级事件处理程序和DOM2级事件处理程序 IE事件处理程序封装为eventUtil对象,达到跨浏览器的效果.代码如下: var eventUtil = { // 添加事件句柄 addEventHandler:function (element,type,handler) { if (element.addEventListener) { element.addEventListener(type, handler,false); }else if(element.attachEven

js跨浏览器事件处理程序

<!DOCTYPE html> <html> <head> <meta charset="utf-8"/> </head> <body> <div id="myDiv"> aaaaaaaaaaaaaaaaaaa </div> <ul id="myMenu" style="position:absolute;visibility:hidd

JS:Html事件处理程序 vs DOM0级事件处理程序 vs DOM2级事件处理程序

1.HTML事件处理程序 某个元素支持的某种事件,可以通过一个与相应事件处理程序同名的HTML特性指定.这个特性的值应该是能够执行的JS代码.例如:按钮单击是要执行一些js代码,可以像下面: <input type="button" value="click me" onclick="showMessage()" /> 在js中就可以像下面一样处理: <script> function showMessage(){ ale

JS 关于事件处理程序机制

关于这个问题,自己也做了一下测试,算了,直接粘贴代码吧,若有问题,欢迎指出! <!DOCTYPE html><html><head lang="en"> <meta charset="UTF-8"> <title>JS DOM2事件处理程序</title></head><body> <input id="btn" type="butto

深入理解js Dom事件机制(二)——添加事件处理程序

深入理解js Dom事件机制(一)--事件流 事件就是当用户或者浏览器自身执行的某种动作,诸如 click.mouseover等都是事件的名称,那响应个事件的函数就称为事件处理程序(事件处理函数.事件句柄). 事件处理程序的名字都是以on+事件名称命名,比如 click事件的事件处理程序就是onclick, 为某个事件指定事件处理程序的方式大致分为三种. 1.HTML事件处理程序 这个很简单,大家基本初学js的时候都应该用过,就不再赘述,直接看实例代码 <!DOCTYPE html> <