是从页面中接收事件的顺序
IE提出
是由具体的节点(触发事件的那个元素)至不具体的节点(document)
依次从弹出提示框从div
至window
<div id="myDiv">click mediv>
<script>
// 事件冒泡
window.onload = function () {
document.getElementById("myDiv").onclick = function () {
alert("div");
};
document.body.onclick = function () {
alert("body");
};
document.documentElement.onclick = function () {
alert("html");
};
document.onclick = function () {
alert("document");
};
window.onclick = function () {
alert("window");
};
};
script>
冒泡流程
Netscape提出
由不具体的节点(window)至具体的节点(事件触发源)
点击div,则事件从window一直捕获到div
window.onload=function(){
// 事件捕获
window.addEventListener(
"click",
function () {
alert("window");
},
true
);
document.addEventListener(
"click",
function () {
alert("document");
},
true
);
document.documentElement.addEventListener(
"click",
function () {
alert("html");
},
true
);
document.body.addEventListener(
"click",
function () {
alert("body");
},
true
);
}
捕获流程
DOM2级
规定三个阶段
整体流程图
<div id="div" onclick="alert("1"')">div>
<div id="myDiv" onclick="func(event)">div>
<script>
function func(event){
alert(1)
}
script>
添加
div.onclick=function(){}
移除
div.onclick=null
优点:
添加
div.addEventListener('事件名','事件处理函数','true/false')
接收三个参数:
true:
捕获/false:
冒泡)——默认false
移除
div.removeEventListener('事件名','事件处理函数名','true/false')
IE的事件名要加上on
添加
attachEvent('事件名','事件处理函数')
移除
detachEvent('事件名','事件处理函数名')
var eventUtil = {
addEventListener: function (element, type, handler) {
if (element.addEventListener) {
element.addEventListener(type, handler, false);
} else if (element.attachEvent) {
element.attachEvent("on" + type, handler);
} else {
element["on" + type] = handler;
}
},
removeEventListener: function (element, type, handler) {
if (element.removeEventListener) {
element.removeEventListener(type, handler, false);
} else if (element.detachEvent) {
element.detachEvent("on" + type, handler);
} else {
element["on" + type] = null;
}
},
};
event || window.event
属性
bubbles
——是否冒泡cancelable
——是否可取消默认行为currentTarget
——事件处理程序正在处理的那个节点defaultPrevented
——是否阻止了默认行为detail
——事件相关细节信息eventPhase
——事件阶段:1. 捕获 2. 事件处理 3. 冒泡target
——事件触发的节点(事件目标)isTrusted
——是否由浏览器生成type
——事件类型方法
preventDefault()
——阻止默认行为stopImmediatePropagation()
——取消进一步捕获、冒泡,同时阻止事件处理函数被调用stopPropagation()
——阻止冒泡或捕获事件处理函数的this指向
var div = document.getElemnetById('mydiv')
div.onclick=function(event){
console.log(event.currentTarget == this) // true
console.log(event.target == this) // true
}
document.body.onclick=function(){
console.log(event.currentTarget == this) // true
console.log(event.target == this) // false
}
this
指向事件处理函数的调用者event.currentTarget
指向事件处理函数的调用(处理)节点event.target
指向事件的触发节点,目标源IE中的event作为window对象中第一个属性window.event
属性
cancelBubble
——是否冒泡,event.cancelBubble = falsereturnValue
——是否触发默认事件,event.returnValue = falsesrcElement
——事件目标源(与target相同)type
——事件类型兼容处理IE的事件
// 事件属性兼容IE写法
var eventUtil = {
addEventListener,
removeEventListener,
getEvent: function (event) {
return event ? event : window.event;
},
getTarget: function (event) {
return event.target || event.srcElement;
},
preventDefault: function (event) {
if (event.preventDefault) {
event.preventDefault();
} else {
event.returnValue = false;
}
},
stopPropagation: function () {
if (event.stopPropagation) {
event.stopPropagation();
} else {
event.cancelable = false;
}
},
};
load
unload
resize
scroll
focus
blur
focusin
focusout
click
dbclick
mousedown
mousemove
移入移出,子元素不触发
mouseenter
mouseleave
移入移出,子元素也算触发
mouseout
mouseover
event.clientX
event.clientY
event.pageX
event.pageY
function(event){
var pageX=event.pageX;
if(pageX===undefined){
event.clientX + (document.body.scrollLeft) || document.documentElement.scrollLeft
}
var pageY=event.pageY;
if(pageY===undefined){
event.clientY + (docuemnt.body.scrollTop) || document.documentElement.scrollTop
}
}
兼容IE写法
event.screenX
event.screenY
keydown
——任意键按下,按住则会一直触发keypress
——字符键按下,按住则会一直触发keyup
——释放键盘上的按键键值
event.keycode
兼容写法
event.charcode
window.addEventListener('hashchange')
对DOM添加过多事件处理函数会占用过多内存,导致性能不佳,而事件委托可以解决
事件委托利用了事件冒泡,只指定一个事件处理程序,就可以管理同一类型的所有事件
<ul id="list">
<li id="item1">1li>
<li id="item2">2li>
<li id="item3">3li>
ul>
<script>
window.onload = function () {
document.getElementById("list").onclick = function (event) {
var event = event || window.event;
var target = event.target || event.srcElement;
switch (target.id) {
case "item1":
alert(1);
break;
case "item2":
alert(2);
break;
case "item3":
alert(3);
break;
}
};
};
script>