事件委托
利用事件冒泡机制,委托事件给父级元素,比监听每个子元素的事件性能好。
html
<div style="height: 100px;"> <ul> <li>1</li> <li>2</li> </ul> </div>
js
function foo(e) { if (e.target.nodeName.toLowerCase() === 'li') { e.target.style.background = '#000'; } } document.querySelector('div').addEventListener('click', foo)
监听div内容修改
1.DOM2级中的mutation(变动事件)里的 DOMSubtreeModified 可以监听div内容修改
document.querySelector('.element').addEventListener('DOMSubtreeModified', function(){ alert(this); });
2.MutationObserver构造函数可以监听div内容修改
//兼容性 var MutationObserver = window.MutationObserver || window.WebKitMutationObserver || window.MozMutationObserver; var node = document.getElementById('node'); //配置信息 var config = { subtree: true, //监听目标节点包括后代节点 childList: true, //监听目标节点的子节点是否增加或者移除 attributes: true, //监听目标节点的attributes属性的增删改 characterData: true //如果监听的目标节点是文本节点,同时监听节点的文本内容 } //回调函数 var func = function(re) { alert("success"); console.log(re); } //生成实例 var server = new MutationObserver(func); //调用配置信息和回调函数 server.observe(node, config);
事件监听会传入一个event对象。
1.当事件绑定在触发的元素上,触发元素时,event.currentTarget 和 event.target 和 this 都指向这个元素。
例:
var btn = document.getElementById("nowBtn"); btn.onclick = function(e) { console.log(e.currentTarget === this); //true console.log(e.target === this); //true }
如果绑定在当前元素的父级元素,触发元素时,event.currentTarget 和 this 都指向这个父级元素。 event.target 则指向触发的元素。
例:
document.body.onclick = function(e) { console.log(event.currentTarget === document.body); //true console.log(this === document.body); //true console.log(event.target === document.getElementById("nowBtn")); //true }
2.需要绑定多个事件时,可以利用event.type属性
var btn = document.getElementById('myBtn'); var handler = function(e) { switch(e.type) { case "click": console.log("click"); break; case "mouseover": event.target.style.backgroundColor = "#333"; break; case "mouseout": event.target.style.backgroundColor = "#000"; break; } } btn.onclick = handler; btn.addEventListener("mouseover",handler); btn.onmouseover = handler;
3.event.preventDefault()可以阻止元素的默认行为。
如<a>元素默认行为是导航到href的URL,用事件处理就可以取消它(需要event.cancelable为true,默认为true)。
var link = document.getElementById('myLink'); link.onclick = function(e) { e.preventDefault(); };
4.event.stopPropagation()用来阻止捕获及冒泡。
var btn = document.getElementById('myBtn'); btn.onclick = function(e) { console.log("click"); event.stopPropagation(); //执行完后阻止冒泡到body的click事件 }; document.body.onclick = function(e) { console.log('body click'); };
keyCode可以直接转换成大写字母和数字
回车等特殊键无法转换,符号转换错误。
var key; document.getElementById('element').addEventListener('keydown', function(e){ key = e.keyCode; }) key = String.fromCharCode(key);
HTML5事件
1.监听contextmenu事件用preventDefault()方法阻止冒泡后,可以阻止右键弹出的上下文菜单。这个事件是冒泡事件,监听document可以阻止所有元素的contextmenu事件。
2. haschange事件可以监听URL参数变化(主要用于Ajax),这个事件只能添加给window对象。此时的 event 会多出 oldURL 和 newURL,例:
window.addEventListener('haschange',function(e){ console.log(e.oldURL); console.log(e.newURL); })