本文链接:https://blog.csdn.net/qq_41348029/article/details/81288481

e = e || window.event 在做事件处理时,用于区分IE和其他浏览器事件对象。

下面链接为事件对象的参考资料:

  http://wenku.baidu.com/view/400a89f4f61fb7360b4c65ca.html

<!DOCTYPE HTML>
<html>

<head>
<title></title>
<style type="text/css">
#aa {
border: 1px solid #000;
width: 100px;
height: 40px;
margin-top: 50px;
}

#bb {
border: 1px solid #000;
width: 500px;
height: 40px;
margin-top: 50px;
}

#cc {
border: 1px solid #000;
width: 500px;
height: 40px;
}
</style>
</head>

<body>
<div id="aa"></div>
<div id="bb">dfdfddfsd</div>
<div id="cc">gregreger</div>

<script type="text/javascript">
/*JS的event.srcElement与event.target(触发事件对象)
IE下,event对象有srcElement属性,但是没有target属性;
Firefox下,event对象有target属性,但是没有srcElement属性.但他们的作用是相当的,即:
firefox 下的 event.target = IE 下的 event.srcElement
解决方法:使用obj = event.srcElement ? event.srcElement : event.target;
或:var evtTarget = event.target || event.srcElement;
*/

//event.srcElement:表示的当前的这个事件源。
//
//event.srcElement.parentNode:表示当前事件源的父节点。
//
// parentNode:父节点,也就是上一层的节点。可以是任何一个标签。
//
//event.srcElement.firstChild:当前事件的第一个节点,如果节点是input,通过event.srcElement.firstChild.value就可以获取此input的值。
//
//event.srcElement.parentElement:是指在鼠标所在对象的上一个对象。
//
//event.srcElement.children:当前节点下对象的个数,有多个的话就是个数组,如当前节点下有2个input的对象,要获取这两个可以用event.srcElement.children[0] 与 event.srcElement.children[1]分别获取。
//

document.getElementById("aa").onclick = function(e) {
if(e) console.log(e.toString()); // IE6/7/8 e为undefined IE9中e为W3标准事件对象。
//e = window.event;
console.log(e.srcElement.tagName || e.currentTarget.tagName);
};
/* element.onXXX方式(比较古老,不推荐使用)
这种方式添加事件IE6/7/8只支持window.event不支持参数传入,
Firefox只支持参数传入不支持其它方式。
IE9/Opera/Safari/Chrome 两种方式都支持。
*/

var d4 = document.getElementById('bb');

function clk(e) {
alert(e); // 所有浏览器弹出的信息框显示都是事件对象。
alert(e.srcElement.tagName || e.currentTarget.tagName);
e = e || window.event;
alert(e); // IE6/7/8中和上个e弹出相同的对象。
};

//addEventListener() 用于向指定元素添加事件。
// 参数说明:tr件,比如 click mouseenter mouseleave
//fn 回调函数
//useCaption 用于描述是冒泡还是捕获。默认值是false,即冒泡传递。
//当值为true,就是捕获传递。
if(d4.addEventListener) {
d4.addEventListener('click', clk, false);
alert("addEventListener");
};
if(d4.attachEvent) {
d4.attachEvent('onclick', clk);
alert("attachEvent");
};
/* addEventListener、attachEvent方式(推荐使用)

结论:
通常事件句柄里有这句话:e = e || window.event;
但是在这种调用方式(addEventListener、attachEvent方式)中没什么作用,
这是什么原因呢?上边参考文章的总结里指出了原因,即:
“IE6/7/8支持通过window.event获取对象,
通过attachEvent方式添加事件时也支持事件对象作为句柄第一个参数传入”
因为IE6/7/8在attachEvent方式添加事件时同时支持两种方式,所以事件句柄中的参数e在
IE6/7/8中会自动转换为window.event。
这么以来,这句e = e || window.event;在此处就不需要了(个人结论)。

*/

/*
在编写跨浏览器的函数库时,IE和标准事件对象的属性的差异的问题需要解决。
下边抽出相关代码,讨论这个问题在这里的体现。
*/
var _E = {
BindEvent: function(object, fun) {
if(arguments.length == 1) {
fun = arguments[0];
object = null;
}
var args = Array.prototype.slice.call(arguments, 2);
return function(event) {
return fun.apply(object, [fixEvent(event)].concat(args));
}
}
};

function fixEvent(event) { // 统一不同浏览器的event对象
if(event) return event;
event = window.event;
event.pageX = event.clientX + getScrollLeft(event.srcElement);
event.pageY = event.clientY + getScrollTop(event.srcElement);
event.target = event.srcElement;
event.stopPropagation = stopPropagation;
event.preventDefault = preventDefault;
var relatedTarget = {
"mouseout": event.toElement,
"mouseover": event.fromElement
}[event.type];
if(relatedTarget) {
event.relatedTarget = relatedTarget;
}

return event;
};

function stopPropagation() {
this.cancelBubble = true;
};

function preventDefault() {
this.returnValue = false;
};

// 测试代码如下
function get(ev) {
alert(ev.pageX);
}
var cc = document.getElementById("cc");
var clickHandler = _E.BindEvent(get);
// cc.attachEvent('onclick', clickHandler); // IE6/7/8下测试
/*
结果点击id为cc的div元素后,弹出undefined。说明ev.pageX根本不存在。
可是我们在fixEvent()里已经做了事件对象的统一工作。
调试会发现:fixEvent()里if (event) return event;这句是执行后就直接return了,
这里的event按照道理说应该是undefined,但是事实并不是。

//
至于原因个人觉得就是这里:因为IE6/7/8在attachEvent方式添加事件时同时支持两种方式,
所以事件句柄中的参数会自动转换为window.event。也就是说参数不是undefined

//
所以在这里用if (event) return event;判断事件对象不妥。
(说明:fixEvent()这段代码参考自博客园里cloudgamer的函数库,
他里边就是这种写法,个人觉得有错误,希望有兴趣的朋友也做做验证)
*/
</script>
</body>

</html>

e = e || window.event的区别及用法的更多相关文章

  1. ev=ev || window.event 与 ev = window.event || ev 区别

    event是事件对象(也是window的属性),但不是标准的,只有IE支持.在W3C标准支持的浏览器下事件对象是引发事件函数的第一个参数,参数名随意.var oEvent = ev || event; ...

  2. Angular JS中$timeout的用法及其与window.setTimeout的区别

    $timeout的用法 angular.js的$timeout指令对window.setTimeout做了一个封装,它的返回值是一个promise对象.当定义的时间到了以后,这个promise对象就会 ...

  3. javascript中window.event事件用法详解

    转自http://www.jb51.net/article/32564.htm描述 event代表事件的状态,例如触发event对象的元素.鼠标的位置及状态.按下的键等等. event对象只在事件发生 ...

  4. e = e || window.event用法细节讨论

    e = e || window.event是我们在做事件处理时候区分IE和其他浏览器事件对象时常用的写法.但是这行兼容性代码有没有必要出现在所有的事件句柄中呢?标准事件调用方式需要这行代码吗?下边我们 ...

  5. 火狐和IE的window.event对象详解(转载)

    FF的FIREBUG,不仅能测试JS还能检查CSS错误,是一般常用的. 但它主要检查FF方面的错误,对IE就无能为力了. 要测试IE,就用ieTester,它可以测试IE几乎所有版本(1.0恐怕也用不 ...

  6. JS控制键盘录入 和 window.event.keycode对照

    一.只允许录入整数 1.不允许录入非数字(按下字母键就会提示并清空) function intOnly() { if (!(window.event.keyCode >= 48 &&am ...

  7. JavaScript 中的window.event代表的是事件的状态,jquery事件对象属性,jquery中如何使用event.target

    http://wenda.haosou.com/q/1373868839069215 http://kylines.iteye.com/blog/1660236 http://www.cnblogs. ...

  8. 转载jquery $(document).ready() 与window.onload的区别

    jquery $(document).ready() 与window.onload的区别 投稿:mdxy-dxy 字体:[增加 减小] 类型:转载 时间:2009-12-28我要评论 Jquery中$ ...

  9. window.event对象详细介绍

    1.event代表事件的状态,例如触发event对象的元素.鼠标的位置及状态.按下的键等等.event对象只在事件发生的过程中才有效.event的某些属性只对特定的事件有意义.比如,fromEleme ...

随机推荐

  1. Java后端开发工作 - 写接口

    我在公司的工作内容是,对于一个BS应用,负责服务器端开发工作,Java语言.与前端开发人员合作,最终提供给前端RESTFUL接口,保证页面正常响应. 经验之谈 一个接口可以理解为一个业务逻辑,一个业务 ...

  2. 利用python的requests和BeautifulSoup库爬取小说网站内容

    1. 什么是Requests? Requests是用Python语言编写的,基于urllib3来改写的,采用Apache2 Licensed 来源协议的HTTP库. 它比urllib更加方便,可以节约 ...

  3. P2860()

    题目描述: 为了从F(1≤F≤5000)个草场中的一个走到另一个,贝茜和她的同伴们有时不得不路过一些她们讨厌的可怕的树.奶牛们已经厌倦了被迫走某一条路,所以她们想建一些新路,使每一对草场之间都会至少有 ...

  4. JDK下载安装配置教程(详细)

    JDK下载安装配置教程(详细) 版权声明:本文为原创文章,转载请附上原文出处链接和本声明.https://www.cnblogs.com/mxxbc/p/11844885.html 因为最近需要在Wi ...

  5. 用Vsftpd服务传输文件(铺垫篇)

    文件传输协议 文件传输协议(FTP,File Transfer Protocol),即能够让用户在互联网中上传.下载文件的文件协议,而FTP服务器就是支持FTP传输协议的主机,要想完成文件传输则需要F ...

  6. PyCharm安装及使用教程

    1  PyCharm下载 PyCharm的下载安装非常简单,可以直接到Jetbrains公司官网下载,具体步骤如下: (1)打开Pycharm官网http://www.jetbrains.com,选择 ...

  7. day1-习题

    # 1.使用while循环输入 1 2 3 4 5 6 8 9 10 count = 1 while count<11 : #使用while语句循环输入123...10 if count == ...

  8. 多线程之美1一volatile

    目录 一.java内存模型 1.1.抽象结构图 1.2.概念介绍 二.volatile详解 2.1.概念 2.2.保证内存可见性 2.3.不保证原子性 2.4.有序性 一.java内存模型 1.1.抽 ...

  9. 019.Kubernetes二进制部署插件dashboard

    一 修改配置文件 1.1 下载解压 [root@k8smaster01 ~]# cd /opt/k8s/work/kubernetes/ [root@k8smaster01 kubernetes]# ...

  10. linux日常笔记(1)

    1.SELlinux SELinux是 美国国家安全局 (NSA) 对于 强制访问控制的实现 =>可以使root受限的权限 关闭SELinux=>修改配置文件,永久生效; sed -i ' ...