juquery源码研究:addEventListener与attachEvent区别

简介: 先测试下: debugger if(!window.attachEvent && window.addEventListener) { Window.prototype.attachEvent = HTMLDocument.prototype.attachEvent= HTMLElement.prototype.attachEvent=fu

先测试下:

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.onload=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" + "<br>"; }, false);
   middleDiv.addEventListener("click", function () { info.innerHTML += "middleDiv" + "<br>"; }, false);
   inDiv.addEventListener("click", function () { info.innerHTML += "inDiv" + "<br>"; }, false); */
   
    outDiv.attachEvent("onclick", function () { info.innerHTML += "outDiv" + "<br>"; }, false);
   middleDiv.attachEvent("onclick", function () { info.innerHTML += "middleDiv" + "<br>"; }, false);
   inDiv.attachEvent("onclick", function () { info.innerHTML += "inDiv" + "<br>"; }, false);
    
   }

<div id="outDiv">
   <div id="middleDiv">
     <div id="inDiv">请在此点击鼠标。</div>
   </div>
</div>


<div id="info"></div>


结果:inDiv
middleDiv
outDiv


区别说明

1、
cancelBubble=false
 addEventListener执行事件冒泡顺序由内到外。
<span style="line-height: 1.5; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 12pt;">true 的触发顺序总是在 false 之前;</span><br style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;font-size:12px; line-height: 19.5px;" /><span style="line-height: 1.5; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 12pt;">如果多个均为 true,则外层的触发先于内层;</span><br style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;font-size:12px; line-height: 19.5px;" /><span style="line-height: 1.5; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 12pt;">如果多个均为 false,则内层的触发先于外层。</span>
<span style="font-size: 12pt; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; line-height: 19.5px; background-color: rgb(255, 255, 255);">
</span>
<span style="font-size: 12pt; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; line-height: 19.5px; background-color: rgb(255, 255, 255);">2、适应的浏览器版本不同</span>

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 Explorer
function doScrollCheck() {
<span style="white-space:pre">	</span>if ( jQuery.isReady ) {
<span style="white-space:pre">		</span>return;
<span style="white-space:pre">	</span>}


<span style="white-space:pre">	</span>try {
<span style="white-space:pre">		</span>// If IE is used, use the trick by Diego Perini
<span style="white-space:pre">		</span>// http://javascript.nwbox.com/IEContentLoaded/
<span style="white-space:pre">		</span>document.documentElement.doScroll("left");
<span style="white-space:pre">	</span>} catch(e) {
<span style="white-space:pre">		</span>setTimeout( doScrollCheck, 1 );
<span style="white-space:pre">		</span>return;
<span style="white-space:pre">	</span>}


<span style="white-space:pre">	</span>// and execute any waiting functions
<span style="white-space:pre">	</span>jQuery.ready();
}
 
 

这里 bindReady

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

目录
相关文章
|
7月前
|
设计模式 缓存 JavaScript
JavaScript 简单实现观察者模式和发布-订阅模式
JavaScript 简单实现观察者模式和发布-订阅模式
32 0
|
2月前
|
移动开发 JavaScript 前端开发
游戏框架 - 描述Phaser、Three.js等JavaScript游戏框架的核心功能和使用场景。
Phaser是开源2D游戏引擎,适合HTML5游戏,内置物理引擎和强大的图形渲染功能,适用于2D游戏,如消消乐。Three.js是基于WebGL的3D库,用于创建和显示3D图形,支持交互和多种3D效果,广泛应用在游戏、可视化等多个领域。两者各有侧重,选择取决于项目需求和图形交互要求。
44 3
|
9月前
|
前端开发 JavaScript
简述下 React 的事件代理机制?
简述下 React 的事件代理机制?
|
数据可视化 Java
Java中的事件监听知识点&动作监听简单实现(含源码阅读)
监听分为三类:键盘监听、鼠标监听 和 动作监听,看到这些名词可能有点懵,监听是个啥,那么首先我们来理解一下绑定监听:当事件源(按钮)上发生了某个事件(单击),就执行某段代码(输出“您已点击按钮”)
279 0
Java中的事件监听知识点&动作监听简单实现(含源码阅读)
|
JavaScript API
如何使用jQuery处理事件?底层原理是什么?
如何使用jQuery处理事件?底层原理是什么?
|
JavaScript API 开发者
科普一个监听DOM的对象-MutationObserver
科普一个监听DOM的对象-MutationObserver
169 0
科普一个监听DOM的对象-MutationObserver
|
前端开发
react 事件机制04-事件触发原理(完结)
本文继续接上一篇 react 事件机制03-事件注册 来说下 react 事件机制的事件触发过程,一起研究下在这个过程中主要经过了哪些关键步骤,本文也是react 事件机制的完结篇,希望本文可以让你对 react 事件触发的原理有一定的理解。
125 0
react 事件机制04-事件触发原理(完结)
|
Java 开发者 容器
事件监听机制相关测试|学习笔记
快速学习事件监听机制相关测试
52 0
|
JavaScript 前端开发
web前端学习(四十一)——JavaScript DOM EventListener(添加与移除监听事件)
web前端学习(四十一)——JavaScript DOM EventListener(添加与移除监听事件)
web前端学习(四十一)——JavaScript DOM EventListener(添加与移除监听事件)