博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JS事件总结--试验过的一些小经验
阅读量:5816 次
发布时间:2019-06-18

本文共 5358 字,大约阅读时间需要 17 分钟。

从IE9开始已经支持事件捕获了。

删除通过DOM0级方法指定的事件处理程序,只要将事件处理程序的属性值设置为null即可。
btn.οnclick=null;

attachEvent的事件名称是onclick,而addEventListener的事件名称是click

var btn = document.getElementById("btn");        btn.onclick = function () {            alert(this.id);        }                btn.addEventListener('click', function (e) {            alert("我是来测试chrome的");        }, false);        btn.attachEvent('onclick', function (e) {            alert("我是来测试ie的");        });

上述代码在ie9下居然三个alert都弹出来了,也就是说其实从ie9开始已经走的事件捕获模式了,趋向于dom标准,但是又没有完全废弃自己原先的一套规则,所以两种事件监听它都支持。

var btn = document.getElementById("btn");             btn.attachEvent('onclick', function (e) {            alert("1");        });        btn.attachEvent('onclick', function (e) {            alert("2");        });

上述代码在ie8及以下浏览器,弹出alert框的顺序为2,1,但在ie9下弹出alert框的顺序为1,2

var btn = document.getElementById("btn");         btn.addEventListener("click",function(e){            alert(1);        });        btn.addEventListener("click",function(e){            alert(2);        });

事实上DOM2级标准就是按照添加事件的顺序注册的,也就是说在firefox、chrome等浏览器下,弹出alert框的顺序是1,2

在ie下,事件处理程序是在全局作用域下运行的,所以事件处理程序中的this其实就是window(基于上面的经验,ie9开始趋向于DOM标准,我又特意做了测试,结果alert的也是true,我有点晕)

var btn = document.getElementById("btn");         btn.attachEvent('onclick', function (e) {            alert(this===window);   //true        });

在chrome等浏览器下,this指向的是当前对象

var btn = document.getElementById("btn");                btn.addEventListener("click",function(e){            alert(this===btn);    //true                });

在dom0级别的事件绑定中,ie8及以下浏览器中e输出的为undefined,而chrome下的e输出的对象跟dom2级别中的e完全一样

var btn = document.getElementById("btn");        btn.onclick = function (e) {            console.log(e);//此处在ie8及以下输出的是undefined而在ie9下输出的是object MouseEvent        }        btn.attachEvent('onclick', function (e) {            console.log(e);//在ie7下输出的是object,在ie8及以下输出的是object Event,而在ie9下输出的是object MSEventObj        });
var btn = document.getElementById("btn");        btn.onclick = function (e) {            console.log(e);//在chrome下,此处的e和下面的e输出的都是MouseEvent        }                btn.addEventListener("click", function (e) {            console.log(e);        });

看一下chome下输出的e是啥吧

图片描述

说说这里面有哪些重要的属性/方法吧

bubbles-->Boolean-->事件是否冒泡

cancelable-->Boolean-->是否可以取消事件的默认行为

currentTarget-->Boolean-->事件处理程序当前正在处理事件的那个元素

defaultPrevented-->Boolean-->为true 表示已经调用了preventDefault()

detail-->Integer-->与事件相关的细节信息

eventPhase-->Integer-->调用事件处理程序的阶段:1表示捕获阶段,2表示“处于目标”,3表示冒泡阶段

preventDefault()-->Function-->取消事件的默认行为。如果cancelable是true,则可以使用这个方法

stopImmediatePropagation()-->Function-->取消事件的进一步捕获或冒泡,同时阻止任何事件处理程序被调用

stopPropagation()-->Function-->取消事件的进一步捕获或冒泡。如果bubbles为true,则可以使用这个方法

target-->Element-->事件的目标

type-->String-->被触发的事件的类型

其实我自己也没有搞清楚stopImmediatePropagation和stopPropagation的区别,太多方法

需要理解currentTarget和target的区别及联系,在事件处理程序内部,this始终等于currentTarget值,即currentTarget是指当前被触发或者说正在处理事件的那个元素,而target是指当前的目标元素;看看代码具体解释一下:`

var btn = document.getElementById("btn");    btn.onclick = function (e) {        console.log(e.currentTarget == this); // true        console.log(e.target == this);  // true    }`

对btn按钮触发点击事件,那么e.currentTraget指向了this,e.target也指向了this

而如果是对body绑定事件处理程序,那么e.currentTarget就指向了document.body了,那么e.target 指向与 btn那个元素

document.body.onclick = function(e){    console.log(e.currentTarget === document.body); // true    console.log(document.body === this);  // true    console.log(e.target === document.getElementById("btn")); //true};

由于ie下事件处理程序的作用域是在全局使用域下,所以它的event对象也是通过window.event来

一般最简化的跨浏览器的事件通用js如下:

var EventUtil = {    addHandler: function(element,type,handler) {        if(element.addEventListener) {            element.addEventListener(type,handler,false);        }else if(element.attachEvent) {            element.attachEvent("on"+type,handler);        }else {            element["on" +type] = handler;        }    },    removeHandler: function(element,type,handler){        if(element.removeEventListener) {            element.removeEventListener(type,handler,false);        }else if(element.detachEvent) {            element.detachEvent("on"+type,handler);        }else {            element["on" +type] = null;        }    },    getEvent: function(event) {        return event ? event : window.event;    },    getTarget: function(event) {        return event.target || event.srcElement;    },    preventDefault: function(event){        if(event.preventDefault) {            event.preventDefault();        }else {            event.returnValue = false;        }    },    stopPropagation: function(event) {        if(event.stopPropagation) {            event.stopPropagation();        }else {            event.cancelBubble = true;        }    },    getRelatedTarget: function(event){        if (event.relatedTarget){            return event.relatedTarget;        } else if (event.toElement){            return event.toElement;        } else if (event.fromElement){            return event.fromElement;        } else {            return null;        }    },    getWheelDelta: function(event) {        if(event.wheelDelta) {            return event.wheelDelta;        }else {            return -event.detail * 40        }    },    getCharCode: function(event) {        if(typeof event.charCode == 'number') {            return event.charCode;        }else {            return event.keyCode;        }    }};

哪些事件不能冒泡:在我知晓的范围内有focus、blur、unload、load、mouseEnter、mouseLeave图片描述

转载地址:http://mdqbx.baihongyu.com/

你可能感兴趣的文章
ios xmpp demo
查看>>
python matplotlib 中文显示参数设置
查看>>
数据库事务隔离级别
查看>>
os模块大全详情
查看>>
【ros】Create a ROS package:package dependencies报错
查看>>
kali linux 更新问题
查看>>
HDU1576 A/B【扩展欧几里得算法】
查看>>
廖雪峰javascript教程学习记录
查看>>
WebApi系列~目录
查看>>
Java访问文件夹中文件的递归遍历代码Demo
查看>>
项目笔记:测试类的编写
查看>>
通过容器编排和服务网格来改进Java微服务的可测性
查看>>
re:Invent解读:没想到你是这样的AWS
查看>>
PyTips 0x02 - Python 中的函数式编程
查看>>
阿里云安全肖力:安全基础建设是企业数字化转型的基石 ...
查看>>
使用《Deep Image Prior》来做图像复原
查看>>
如何用纯 CSS 为母亲节创作一颗像素画风格的爱心
查看>>
Linux基础命令---rmdir
查看>>
iOS sqlite3(数据库)
查看>>
粤出"飞龙",打造新制造广东样本
查看>>