首页 技术 正文
技术 2022年11月17日
0 收藏 917 点赞 4,500 浏览 2542 个字

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

  

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:8,907
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,432
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,247
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,058
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,690
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,728