JavaScript事件绑定

浏览器事件概述

  技术一般水平有限,有什么错的地方,望大家指正。

  当我们在浏览网页的时候,浏览器可以在视觉上为我们展示出页面还可以在行为上响应用户的操作,浏览器响应用户的操作就是通过事件来完成的,浏览器提供了事件注册接口和事件监听接口这样浏览器就可以接收用户的行为并且进行处理了。浏览器已经提供很多的事件包括页面加载、鼠标事件以及键盘事件等,我们只需要定义好事件处理函数即可,当用户的操作触发这些事件时就会执行我们预先定义好的处理函数。一个行为的完整过程如下:

  浏览器在交互的过程中基本的功能就是通过事件+AJAX来完成的,浏览器通过事件来响应用户的行为,如果是有关数据的操作在通过AJAX来与服务器完成交互。

事件的基本使用

  首先事件有三种不同的绑定方式,分别为在DOM元素中直接绑定、在JavaScript中绑定,绑定事件监听函数。

  在DOM元素中直接绑定形式如下:

<button id="demo" onclick="test(‘test‘)">button</div>

  在一般情况下这可以说是最不好的一种绑定方法了,首先表现层和行为层耦合在一起,对于后期的维护带来了极大的不便,其次必须使用全局函数,我们都知道要尽可能的减少全局变量的声明,而且这种绑定方式是可以被覆盖的,如果我们在JS中在为该元素绑定一个点击处理函数,那么在DOM元素中绑定的事件处理函数都不会执行。

function test(){
  console.log("DOM");
}
window.onload = function(){
  var demo = document.getElementById("demo");
  demo.onclick = function(){
      console.log("JS");
  }
}
//只打印JS

  在JavaScript中绑定形式如下:

window.onload = function(){
  var demo = document.getElementById("demo");
  demo.onclick = function(){
      console.log("JS");
  }
}

  这种绑定方式的缺点在于只能注册一个监听函数,后面的监听函数会覆盖前面的监听函数假如我们有如下的代码:

window.onload = function(){
  var demo = document.getElementById("demo");
  demo.onclick = function(){
      console.log("JS");
  }
  demo.onclick = function(){
      console.log("change");
  }
}
//打印change

  绑定事件监听函数形式如下:

window.onload = function(){
  var demo = document.getElementById("demo");
  demo.addEventListener("click",function(){console.log("handler1")},false);
  demo.addEventListener("click",function(){console.log("handler2")},false);
}
//打印handler1 handler2

  这种绑定方法可以满足我们的要求,表现层行为层分离,一个事件可以绑定多个处理函数,除了兼容方面的问题好像就没什么问题了,兼容问题后面再介绍首先看一下addEventListener的用法。

  addEventListener接收三个参数,第一个参数表示事件名称,第二个参数表示事件处理函数,第三个参数表示事件是捕获或冒泡。

  第一个参数表示事件名称在使用时就是"click"、"mousemove"不要带有on,第二个参数表示事件的处理函数,一般称为回调函数,可以是一个匿名函数表达式或者函数名称,第三个参数是一个布尔值为true时表示事件捕获为false表示事件冒泡,一般第三个参数我们都设置为false,因为在IE浏览器下只支持事件冒泡。

addEventListener兼容问题处理

  在非IE浏览器中addEventListener是可以正常使用的在IE9及以上的版本中也是可以使用的,IE提供了一个相同功能的API就是attachEvent来保证在IE8及以下可以正常使用。attachEvent接收两个参数第一个参数表示事件名称需要加上on比如"onclick"、"onmousemove",第二个参数表示事件处理函数可以是一个匿名函数表达式或者函数名称,基本使用方式如下:

window.onload = function(){
  var demo = document.getElementById("demo");
  demo.attachEvent("onclick",function(){console.log("handler1")});
  demo.attachEvent("onclick",function(){console.log("handler2")});
}

  所以在绑定事件时要同时考虑这两种情况,我们可以自行封装一个事件绑定函数(ele:DOM对象,e:事件名称,callback:事件处理函数):

window.onload = function(){
    var demo = document.getElementById("demo");
    addEvent(demo,"click",function(){console.log("兼容测试")});
    function addEvent(ele,e,callback){
        ele.addEventListener?ele.addEventListener(e,callback,false):ele.attachEvent("on"+e,callback);
    }
}

  也可扩展Element的原型函数:

window.onload = function(){
    var demo = document.getElementById("demo");
    demo.addEventListener("click",function(){console.log("handler test")},false);
}
Element.prototype.addEventListener = Element.prototype.addEventListener || function(e,cb){
    this.attachEvent("on"+e,cb)
}

取消事件绑定

  如果我们绑定事件函数之后想取消事件函数的绑定,实现起来也很简单,如果我们使用的是JavaScript的事件绑定方式,直接给事件处理函数设置为null即可:

window.onload = function(){
    var demo = document.getElementById("demo");
    demo.onclick = function(){
        console.log("11111")
    }
    demo.onclick = null;
}

  如果我们使用事件监听函数绑定的事件可以调用取消绑定的API每一种绑定方式都有它对应的解绑方式:

  addEventListener绑定的监听函数用removeEventListener来解除绑定,该函数接同样收三个参数第一个参数表示事件名称,第二个参数表示事件函数的名称,第三个参数是一个布尔值表示冒泡阶段或者捕获阶段。如果绑定事件函数时第二个参数是一个匿名函数表达式的话是不能解除绑定的,只有第二参数是一个以声明的函数的名称才可以使用removeEventListener来解除绑定。下面的这段代码的事件处理函数是不能解除绑定的:

window.onload = function(){
    var demo = document.getElementById("demo");
    demo.addEventListener("click",function(){console.log("aaaa")},false);
}

  要想移除事件处理函数必须使用函数声明:

window.onload = function(){
    var demo = document.getElementById("demo");
    demo.addEventListener("click",handler,false);
    demo.removeEventListener("click",handler);
    function handler(){
        console.log("aaaa");
    }
}

  attachEvent绑定的监听函数要使用detachEvent来解除绑定使用方式和addEventListener基本一致,不同点就是IE浏览器只支持事件冒泡所以省略了第三个参数,事件名称要加上on使用方式为:

window.onload = function(){
    var demo = document.getElementById("demo");
    demo.attachEvent("onclick",handler);
    demo.detachEvent("onclick",handler);
    function handler(){
        console.log("aaaa");
    }
}

访问事件对象

  在事件处理函数中,存在一个对象记录着事件的各种信息,这个对象只存在于事件函数执行的过程中,我们可以在事件处理函数中使用一个参数来代理事件对象,在非IE浏览器中我们可以直接使用参数作为事件对象,在IE浏览器中我们需要使用window.event来获取事件对象,使用方式如下:

window.onload = function(){
    var demo = document.getElementById("demo");
    demo.onclick = function(e){//事件处理函数是由浏览器来调用的,在调用时会把事件对象作为参数传递给事件处理函数
        var e = e || window.event;
        console.log(e);
    }
}

  我们在事件处理函数中如果需要阻止默认事件和停止冒泡就需要用到事件对象。

  在非IE浏览器中:

e.preventDefault();//阻止默认行为
e.stopPropagation();//停止冒泡

  在IE浏览器中:

e.returnValue = false;//阻止默认行为
e.cancelBubble = true;//停止冒泡
时间: 2024-08-03 15:39:37

JavaScript事件绑定的相关文章

原生js跨浏览事件绑定(移除)/javascript事件绑定(移除)

网上找了半天没看到,都是基于ie attachEvent(有诸多的问题存在)来写的,所以手动写了个js模拟绑定事件希望能帮到需要的童鞋 addEvent = function(obj,type,fn){  if(obj.addEventListener) {//W3C   obj.addEventListener(type,fn,false);  }else if (obj.attachEvent) {//ie(期待它的灭亡)   if(!obj.events) obj.events = {};

第一百二十一节,JavaScript事件绑定及深入

JavaScript事件绑定及深入 学习要点: 1.传统事件绑定的问题 2.W3C事件处理函数 3.IE事件处理函数 4.事件对象的其他补充

javascript 事件绑定

一.最简单和向后兼容性最好的事件绑定方法是把事件绑定到元素标识的属性.事件属性名称由事件类型外加一个“on”前缀构成.这些属性也被称为事件处理器 <INPUT TYPE="text" NAME="first_name" onChange="convertToUpper(this)"> 或者 <INPUT TYPE="text" NAME="first_name" onChange=&quo

详解javascript事件绑定使用方法

由于html是从上至下加载的,通常我们如果在head部分引入javascript文件,那么我们都会在javascript的开头添加window.onload事件,防止在文档问加载完成时进行DOM操作所出现的错误.如果有多个javascript文件,那么极有可能出现多个window.onload事件,但是最后起作用的只有一个,这时候就需要使用事件绑定来解决这个问题了. IE方式attachEvent(事件名称, 函数),绑定事件处理函数detachEvent(事件名称, 函数),解除绑定 DOM方

javascript事件绑定和普通事件的区别

区别就是:普通事件只支持单个事件,事件绑定可以添加多个事件. 代码: <!doctype html> <html lang="en"> <head> <meta charset="UTF-8" /> <title>Document</title> </head> <body> <button id="btn">button</butt

JavaScript事件绑定的常见方式

在Javascript中,事件绑定一共有3种方式: ① 行内绑定 ② 动态绑定 ③ 事件监听 原文: https://mbd.baidu.com/newspage/data/landingsuper?context=%7B%22nid%22%3A%22news_9649804010964222368%22%7D&n_type=1&p_from=4 原文地址:https://www.cnblogs.com/sangzs/p/9066556.html

Javascript事件绑定及深入

由于开学后的编程实验课,接触了海量字符换搜索的实验,所以好几天没有学习JS课程了,今天继续学习事件绑定. 传统事件绑定存在一些问题,如:同名事件函数都执行,第二个函数会覆盖第一个. 下面我们以事件切换器(传统绑定机制)为例. 实现box标签属性红绿互换.如下: window.onload=function(){ var box=document.getElementById('box'); box.onclick=toBlue; }; function toRed(){ this.classNa

JavaScript 事件绑定及深入

一.传统事件绑定的问题 解决覆盖问题,我们可以这样去解决:window.onload = function () { //第一个要执行的事件,会被覆盖 alert(1);};if (typeof window.onload == 'function') { //判断之前是否有 window.onload var saved = null; //创建一个保存器 saved = window.onload; //把之前的 window.onload 保存起来}window.onload = func

javascript——事件绑定第二种形式

 事件绑定第一种形式:obj.onclick = fn1; 给文档添加多个点击事件,后面会覆盖前面的事件,所以只有最后一个事件执行了. window.onload = function(){ function fn1(){alert('1');} function fn2(){alert('2');} function fn3(){alert('3');} document.onclick = fn1; document.onclick = fn2; document.onclick = fn3