事件监听
js绑定事件方式1
var $btn1 = document.querySelector('#btn1');
$btn1.onclick = function (e) {
log('js绑定事件方式1');
}
document.querySelector('#btn1-unbind').onclick = function (e) {
if ($btn1.onclick) {
$btn1.onclick = null;
log('解绑成功');
}
}
js绑定事件方式2
var $btn2 = document.querySelector('#btn2');
var $bnt2Unbind = document.querySelector('#btn2-unbind');
var btn2EventHandler = function (e) {
log('js绑定事件方式2');
};
$btn2.addEventListener('click', btn2EventHandler);
$bnt2Unbind.addEventListener('click', function (e) {
$btn2.removeEventListener('click', btn2EventHandler);
log('解绑成功,像我这种匿名函数是没法解绑');
});
document.querySelector('#btn2-unbind-test').addEventListener('click', function (e) {
$bnt2Unbind.removeEventListener('click', function (e) {
$btn2.removeEventListener('click', btn2EventHandler);
log('解绑成功,像我这种匿名函数是没法解绑');
});
log('试了也不行,O(∩_∩)O~~');
});
事件阻止
1. preventDefault
var $ = document.querySelector.bind(document);
var a1EventHandler = function (e) {
e.preventDefault();
log('使用preventDefault阻止链接跳转, 双击可以移除该事件哦');
}
// 冒泡阶段触发
$('#a1').addEventListener('click', a1EventHandler, false);
$('#a1').addEventListener('dblclick', function (e) {
this.removeEventListener('click', a1EventHandler);
log('已经移除点击事件, 现在可以正常跳转了吧');
}, false);
// 捕获阶段触发
$('#parent1').addEventListener('click', function (e) {
log('a1的祖宗,我是红色框,我是在捕获阶段触发的');
}, true);
// 冒泡阶段触发
$('#child1').addEventListener('click', function (e) {
log('a1的父元素,我是绿色框,我是在冒泡阶段触发的');
}, false);
2. stopPropagation
var $ = document.querySelector.bind(document);
var a1EventHandler = function (e) {
e.stopPropagation();
log('使用stopPropagation阻止事件冒泡,但是不能阻止默认行为');
}
// 冒泡阶段触发
$('#a2').addEventListener('click', a1EventHandler, false);
$('#a2').addEventListener('click', function (e) {
e.stopPropagation();
log('使用stopPropagation阻止事件冒泡,测试多次绑定');
}, false);
// 捕获阶段触发
$('#parent2').addEventListener('click', function (e) {
log('a2的祖宗,我是红色框,我是在捕获阶段触发的');
}, true);
// 冒泡阶段触发
$('#child2').addEventListener('click', function (e) {
log('a2的父元素,我是绿色框,我是在冒泡阶段触发的');
}, false);
3. stopImmediatePropagation
var $ = document.querySelector.bind(document);
var a1EventHandler = function (e) {
e.stopImmediatePropagation();
log('使用stopImmediatePropagation阻止该元素的其他点击事件的执行而且也会阻止事件冒泡');
}
// 冒泡阶段触发
$('#a3').addEventListener('click', a1EventHandler, false);
$('#a3').addEventListener('click', function (e) {
log('使用stopImmediatePropagation阻止事件冒泡,测试多次绑定');
}, false);
// 捕获阶段触发
$('#parent3').addEventListener('click', function (e) {
log('a3的祖宗,我是红色框,我是在捕获阶段触发的');
}, true);
// 冒泡阶段触发
$('#child3').addEventListener('click', function (e) {
log('a3的父元素,我是绿色框,我是在冒泡阶段触发的');
}, false);
4. return false
var $ = document.querySelector.bind(document);
var a1EventHandler = function (e) {
log('使用return false');
return false;
}
// 冒泡阶段触发
$('#a4').addEventListener('click', a1EventHandler, false);
$('#a4').addEventListener('click', function (e) {
log('使用return false测试多次绑定');
return false;
}, false);
// 捕获阶段触发
$('#parent4').addEventListener('click', function (e) {
log('a4的祖宗,我是红色框,我是在捕获阶段触发的');
}, true);
// 冒泡阶段触发
$('#child4').addEventListener('click', function (e) {
log('a4的父元素,我是绿色框,我是在冒泡阶段触发的');
}, false);
据说 return false 在jQuery中是等价于preventDefault + stopPropagation,有时间再试