博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
juquery源码研究:addEventListener与attachEvent区别
阅读量:4337 次
发布时间:2019-06-07

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

先测试下:

debugger   if(!window.attachEvent && window.addEventListener)    {    Window.prototype.attachEvent = HTMLDocument.prototype.attachEvent=    HTMLElement.prototype.attachEvent=function(en, func, cancelBubble)    {    var cb = cancelBubble ? true : false;    this.addEventListener(en.toLowerCase().substr(2), func, cb);    };    }   window.οnlοad=function(){    var outDiv = document.getElementById("outDiv");   var middleDiv = document.getElementById("middleDiv");   var inDiv = document.getElementById("inDiv");   var info = document.getElementById("info");    /* outDiv.addEventListener("click", function () { info.innerHTML += "outDiv" + "
"; }, false);   middleDiv.addEventListener("click", function () { info.innerHTML += "middleDiv" + "
"; }, false);   inDiv.addEventListener("click", function () { info.innerHTML += "inDiv" + "
"; }, false); */
   
outDiv.attachEvent("onclick", function () { info.innerHTML += "outDiv" + "
"; }, false);   middleDiv.attachEvent("onclick", function () { info.innerHTML += "middleDiv" + "
"; }, false);   inDiv.attachEvent("onclick", function () { info.innerHTML += "inDiv" + "
"; }, false);
}
<div id="outDiv">
   <div id="middleDiv">
     <div id="inDiv">请在此点击鼠标。</div>
   </div>
</div>
<div id="info"></div>

结果:inDiv
middleDiv
outDiv

区别说明

1、
cancelBubble=false
addEventListener执行事件冒泡顺序由内到外。
true 的触发顺序总是在 false 之前;
如果多个均为 true,则外层的触发先于内层;
如果多个均为 false,则内层的触发先于外层。
2、适应的浏览器版本不同

attachEvent方法适用于IE    addEventListener方法适用于FF

3、针对的事件不同

attachEvent中的事件带on   而addEventListener中的事件不带on

那么jquery源码这2个事件又如何兼容的呢?

bindReady: function() {		if ( readyList ) {			return;		}		readyList = jQuery.Callbacks( "once memory" );		// Catch cases where $(document).ready() is called after the		// browser event has already occurred.		if ( document.readyState === "complete" ) {			// Handle it asynchronously to allow scripts the opportunity to delay ready			return setTimeout( jQuery.ready, 1 );		}		// Mozilla, Opera and webkit nightlies currently support this event		if ( document.addEventListener ) {			// Use the handy event callback			document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false );			// A fallback to window.onload, that will always work			window.addEventListener( "load", jQuery.ready, false );		// If IE event model is used		} else if ( document.attachEvent ) {			// ensure firing before onload,			// maybe late but safe also for iframes			document.attachEvent( "onreadystatechange", DOMContentLoaded );			// A fallback to window.onload, that will always work			window.attachEvent( "onload", jQuery.ready );			// If IE and not a frame			// continually check to see if the document is ready			var toplevel = false;			try {				toplevel = window.frameElement == null;			} catch(e) {}			if ( document.documentElement.doScroll && toplevel ) {				doScrollCheck();			}		}	}
// The DOM ready check for Internet Explorerfunction doScrollCheck() {	if ( jQuery.isReady ) {		return;	}	try {		// If IE is used, use the trick by Diego Perini		// http://javascript.nwbox.com/IEContentLoaded/		document.documentElement.doScroll("left");	} catch(e) {		setTimeout( doScrollCheck, 1 );		return;	}	// and execute any waiting functions	jQuery.ready();}
 
 
这里
bindReady

作为事件绑定对象进行处理了。。。。。

转载于:https://www.cnblogs.com/kool/p/6695669.html

你可能感兴趣的文章
vs无法加载项目
查看>>
Beanutils基本用法
查看>>
玉伯的一道课后题题解(关于 IEEE 754 双精度浮点型精度损失)
查看>>
《BI那点儿事》数据流转换——百分比抽样、行抽样
查看>>
哈希(1) hash的基本知识回顾
查看>>
Leetcode 6——ZigZag Conversion
查看>>
dockerfile_nginx+PHP+mongo数据库_完美搭建
查看>>
Http协议的学习
查看>>
【转】轻松记住大端小端的含义(附对大端和小端的解释)
查看>>
设计模式那点事读书笔记(3)----建造者模式
查看>>
ActiveMQ学习笔记(1)----初识ActiveMQ
查看>>
Java与算法之(2) - 快速排序
查看>>
Windows之IOCP
查看>>
机器学习降维之主成分分析
查看>>
WebSocket & websockets
查看>>
openssl 升级
查看>>
ASP.NET MVC:通过 FileResult 向 浏览器 发送文件
查看>>
CVE-2010-2883Adobe Reader和Acrobat CoolType.dll栈缓冲区溢出漏洞分析
查看>>
使用正确的姿势跨域
查看>>
AccountManager教程
查看>>