近来一直忙着一些有得没得的杂事,疏于打理个人博客,眨眼马上就要晃了两个月了,今天正好碰到一个问题,记录下来。
事情是这样的,对于JS的事件传播和事件默认行为的阻止一直像是隔着一层纱看风景,模模糊糊的。之前也碰到过几次类似的情况,由于强大的惰性,一直也没去彻底的追究一下传播的具体细节,今天呢,借着下面这个小例子,来学习一下事件的传播。
HTML
<!DOCTYPE html>
<html>
<head>
<script src="http://code.jquery.com/jquery-1.11.0.min.js"></script>
<meta charset="utf-8">
<title>JS Bin</title>
</head>
<body>
<input id="input" />
<br/><br/>
<div id="outer">
<div id="inner">
testline
</div>
</div>
</body>
</html>
CSS
#outer{
background: #FEDDDD none;
border: 1px solid #F30;
padding: 20px;
}
#inner{
background: #EEFF99 none;
padding: 20px;
}
js
$(function(){
var method1 = function(){
$('#input').on('focus', function(){
console.info('input focus')
}).on('blur', function(){
console.info('input blur')
})
$('#outer').click(function(e){
console.info('outer clicked')
})
$('#outer').on('mousedown', function(e){
console.info('outer mousedown')
})
$('#inner').on('click', function(e){
console.info('inner clicked')
e.stopPropagation();
})
$('#inner').on('mousedown', function(e){
console.info('inner mousedown')
e.preventDefault();
e.stopPropagation();
});
}
var method2 = function(){
var outer = document.getElementById('outer');
var inner = document.getElementById('inner');
outer.addEventListener('mousedown', function(e){
console.info('outer mousedown capture')
}, true)
outer.addEventListener('mousedown', function(e){
console.info('outer mousedown bubble')
}, false)
inner.addEventListener('mousedown', function(e){
console.info('inner mousedown capture')
e.stopPropagation()
}, true)
inner.addEventListener('mousedown', function(e){
console.info('inner mousedown bubble')
}, false)
}
method2();
})
代码差不多就这些了,可以点击这里在线看看效果(注意打开console)。
假设你是了解一些JS的事件基本理论,比如事件的传播机制,冒泡和捕获等。
结论:
题图来自 http://www.desktopwallpapers4.me/abstract/bubbles-20647/