js如何实现事件监听和解决兼容性

一、为什么需要事件监听?

我们可不可以为同一对象的同一事件绑定多个事件处理程序呢?

通过行内绑定和动态绑定是不可以的,但是可以通过事件监听来实现。

window.onload = function() {
    // 动态绑定
    document.getElementById(‘btn‘).onclick = function() {
        alert(‘first‘);
    }
    // 动态绑定
    document.getElementById(‘btn‘).onclick = function() {
        alert(‘second‘);
    }
}

<input type="button" value="点击" id="btn">

二、如何实现事件监听?

由于Javascript属于客户端语言,又由于所有浏览器并不是同一厂家生产的,没有统一的标准,所以Javascript具有兼容性问题,同理,事件监听也具有兼容性问题,在不同浏览器下创建的方式也是不同的。

1. 基于IE内核的浏览器(IE8以下版本、360、搜狗、2345浏览器的兼容模式)

DOM对象.attachEvent(type,callback);

主要功能:为某个DOM对象的某个type事件绑定相关的事件处理程序(callback)

参数 说明
type 事件类型,如onclick,onkeydown
callback 事件的处理程序,通常是一个匿名函数

window.onload = function() {
    // 在IE浏览器下使用事件监听
    document.getElementById(‘btn‘).attachEvent(‘onclick‘,function(){
        alert(‘first‘);
    })
    // 在IE浏览器下使用事件监听
    document.getElementById(‘btn‘).attachEvent(‘onclick‘,function(){
        alert(‘second‘);
    })
}

2. 基于W3C内核的浏览器(IE9以上版本、火狐浏览器、谷歌浏览器、国内浏览器的极速模式)

DOM对象.addEventListener(type,callback,capture);

主要功能:为某个DOM对象的某个type事件绑定相关的事件处理程序(callback)

参数 说明
type 事件类型,不带on前缀,如click、keydown
callback 事件的处理程序,通常是一个匿名函数
capture 浏览器模型,true(捕获模型),false(冒泡模型),默认IE8以下浏览器只支持冒泡模型,所以其值默认为false。

window.onload = function() {
    // 在W3C浏览器下使用事件监听
    document.getElementById(‘btn‘).addEventListener(‘click‘,function(){
        alert(‘first‘);
    })
    // 在W3C浏览器下使用事件监听
    document.getElementById(‘btn‘).addEventListener(‘click‘,function(){
        alert(‘second‘);
    })
}

三、IE内核与W3C内核事件监听区别

1. 绑定语法不同

IE:attachEvent

W3C:addEventListener

2. type参数不同

IE:事件需要添加‘on‘前缀,如on+事件

W3C:事件不需要添加‘on‘前缀,如事件

3. 参数数量不同

IE:2个参数,type、callback

W3C:3个参数,type、callback、capture(浏览器模型)

4. 触发顺序不同

IE:倒序触发,先绑定后触发

W3C:正序触发,先绑定先触发

四、解决事件监听的兼容性

/**
 * 解决事件监听兼容性问题
 * @param {Object} obj对象
 * @param {String} type时间类型,不带‘on‘前缀
 * @param {Function} callback事件处理程序
 */
function addEvent(obj,type,callback) {
    if (obj.addEventListener) {
        // W3C内核
        obj.addEventListener(type,callback);
    } else {
        // IE内核
        obj.attachEvent(‘on‘+type,callback);
    }
}

window.onload = function() {
    // 为btn按钮绑定事件监听
    addEvent(document.getElementById(‘btn‘),‘click‘,function(){
        alert(‘first‘);
    })
    // 为btn按钮绑定事件监听
    addEvent(document.getElementById(‘btn‘),‘click‘,function(){
        alert(‘second‘);
    })
}

五、移除事件监听

在实际项目开发中,可能需要动态移除事件监听程序。

1. 基于IE内核浏览器

detachEvent(type,callback); // 移除事件监听

主要功能:在IE内核浏览器下移除事件监听程序

参数 说明
type 要移除的事件类型,如onclick、onmouseover
callback 要移除事件处理程序的名称,通常是函数名称

2. 基于W3C内核浏览器

removeEventListener(type,callback); // 移除事件监听

主要功能:在W3C内核浏览器下移除事件监听程序

参数 说明
type 要移除的事件类型,如click、mouseover
callback 要移除事件处理程序的名称,通常是函数名称

特别说明:如果一个对象向进行事件移除,那么其绑定事件监听时事件处理程序必须是有名函数,否则是无法进行移除的,谨记!!!

function fn1() {
    alert(‘first‘);
}

function fn2() {
    alert(‘second‘);
}

window.onload = function() {
    var btn = document.getElementById(‘btn‘);
    var del = document.getElementById(‘del‘);

    // 为btn按钮绑定事件监听
    addEvent(btn,‘click‘,fn1);
    // 为btn按钮绑定事件监听
    addEvent(btn,‘click‘,fn2);

    del.onclick = function() {
        // IE内核下移除fn1事件监听程序
        btn.detachEvent(‘onclick‘,fn1);
        // W3C内核下移除fn2事件监听程序
        btn.removeEventListener(‘click‘,fn2);
    }
}

<input type="button" value="点击" id="btn">
<input type="button" value="移除" id="del">

六、解决移除事件监听的兼容性问题

/**
 * 解决移除事件监听兼容性问题
 * @param {Object} obj对象
 * @param {String} type时间类型,不带‘on‘前缀
 * @param {Function} callback事件处理程序
 */
function removeEvent(obj,type,callback) {
    if (obj.removeEventListener) {
        // W3C内核
        obj.removeEventListener(type,callback);
    } else {
        // IE内核
        obj.detachEvent(‘on‘+type,callback);
    }
}

function fn1() {
    alert(‘first‘);
}

function fn2() {
    alert(‘second‘);
}

window.onload = function() {
    var btn = document.getElementById(‘btn‘);
    var del = document.getElementById(‘del‘);

    // 为btn按钮绑定事件监听
    addEvent(btn,‘click‘,fn1);
    // 为btn按钮绑定事件监听
    addEvent(btn,‘click‘,fn2);

    del.onclick = function() {
        // 兼容性移除
        removeEvent(btn,‘click‘,fn1);
        removeEvent(btn,‘click‘,fn2);
    }
}

原文地址:https://www.cnblogs.com/xiewangfei123/p/12117867.html

时间: 2024-10-08 04:14:32

js如何实现事件监听和解决兼容性的相关文章

JS中的事件监听与事件流

事件监听: 使用监听器(eventListener)来预定事件,在传统软件工程中称成为观察者模式 执行某种操作时(特定的交互瞬间),会产生对象,对象会沿事件流的方向传播. 事件流: 事件流有两种顺序,事件捕获流以及事件冒泡流 事件捕获是从大到小,事件冒泡是从小到大. <html> <body> <div> <a></a> </div> </body> </html> 如果你点了div,事件冒泡流的顺序就是div

Node.js自定义对象事件监听与发射

一.Node.js是以事件驱动的,那我们自定义的一些js对象就需要能监听事件以及发射事件.在Node.js中事件使用一个EventEmitter对象发出,该对象在events模块中.它应该是使用观察者设计模式来实现把事件监听器添加到对象以及移除,之前写OC那块的时候也有些观察者设计模式,在OC中也经常用到:通知中心.KVO,也很容易理解. .addListener(eventName,callback):将回调函数附加到对象的监听器中.当eventName的事件被触发时,回调函数被放置在事件队列

JS组合按键事件监听插件

[1].[代码] [JavaScript]代码 跳至 [1] ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 7

iOS中jQuery 的delegate 事件监听无效解决办法

前端的小朋友将原来 以下结构的代码 <a href="ssss"> <p>sssss</p> <p>dddddd</p> </a> 改成了 <div data-href="ssss"> <p>ssssss</p> <p>dddddd</p> </div> 因为涉及到一些异步加载的内容,所以使用如下代码来实现 a 标签的功能

JS浏览器关闭事件监听(http://pengjianbo1.iteye.com/blog/507569,http://bbs.csdn.net/topics/360152711)

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-

JS使用 popstate 事件监听物理返回键

pushHistory();        window.addEventListener("popstate", function (e) {            if (orderid != "") {                window.location.href = "/wap/self/orderinfo.aspx?id=" + orderid; //此处可改为任意地址            } else {         

js事件监听-addEventListener (w3c标准) 和 attachEvent(ie)

研究了一个小时,没看懂这两个属性 window.onload = function(){ var oDiv = document.getElementById("J_myDiv"); //找到对象 oDiv.onclick = function(){ //设置事件监听函数 alert("click"); }} 缺点:1.添加单一事件 2.不能删除事件 第二:IE中监听函数 var oDiv; function fnClick(){ alert("click

前端基本知识(四):JS的异步模式:1、回调函数;2、事件监听;3、观察者模式;4、promise对象

JavaScript语言将任务的执行模式可以分成两种:同步(Synchronous)和异步(Asychronous). “同步模式”就是一个任务完成之后,后边跟着一个任务接着执行:程序的执行顺序和排列顺序是一直的:”异步模式”则完全不同,每一个任务都有一个或者多个回调函数(callback),前一个任务结束的时候,不是执行下一个任务,二十执行回调函数,后一个任务则是不等前一个任务结束就执行,所以程序的执行顺序与任务顺序不一致的,异步的. 在浏览器端,耗时时间长的操作都应该异步执行,避免浏览器数去

js事件监听机制(事件捕获)总结

在前端开发过程中我们经常会遇到给页面元素添加事件的问题,添加事件的js方法也很多,有直接加到页面结构上的,有使用一些js事件监听的方法,由于各个浏览器对事件冒泡事件监听的机制不同,le浏览器只有事件冒泡,没有事件监听的机制,对于事件监听的兼容性问题是最大的难题: 1.直接把事件的方法写在页面结构上 function eventfun(){ //console.log(this); } <input type="button" onclick="eventfun()&qu