事件的绑定
-
兼容性很好,但是一个元素的同一事件只能绑定一个,基本等同于写在HTML行间上
div.onclick = function ()
-
IE9以下不兼容,可以为一个事件绑定多个处理函数,不能同一个函数绑定多次 this指向div
div.addEventListener("click", function () {
console.log("a");
}, false);
-
ie9用的,可以绑定多个处理函数,或多个相同的处理函数 this指向window
div.attachEvent("onclick",function(){
console.log("a");
});
绑定事件兼容性封装
/**
* 给任意元素绑定事件
* @param {任意元素} elem
* @param {事件类型} type
* @param {处理函数} handle
*/
function addEvent(elem, type, handle) {
if (elem.addEventListener) {
elem.addEventListener(type, handle, false);
} else if (elem.attachEvent) {
elem.attachEvent('on' + type, function () {
//为了把this指向的window,改成this指向elem
handle.call(elem);
})
} else {
elem['on' + type] = handle;
}
}
事件的解除
- 直接赋值方法
div.οnclick=null;
- 方法解除
div.removeEventListener('click',函数写到外面可以清除,false);
- ie9的解除
div.detachEvent('onclick',fn);
事件解除的封装
/**
* 删除事件
* @param {*} elem
* @param {*} type
* @param {*} handle
*/
function removeEvent(elem, type, handle) {
if (elem.removeEventListener) {
elem.removeEventListener(type, handle, false);
} else if (elem.detachEvent) {
elem.detachEvent("on" + type, handle);
} else {
elem["on" + type] = null;
}
}
事件处理模型
- 事件冒泡:结构上(非视觉上)嵌套关系的元素,会存在冒泡的功能,即同一事件,自子元素冒向父元素 focus blur change submit reset select没有冒泡
<div class="wrapper">
<div class="content">
<div class="box"></div>
</div>
</div>
wrapper.addEventListener("click",function(){
console.log("wrapper");
},false);
content.addEventListener("click",function(){
console.log("content");
},false);
box.addEventListener("click",function(){
console.log("box");
},false);
- 事件捕获:结构上(非视觉上)嵌套关系的元素,会存在事件捕获事件,子父元素捕获至子元素 ie没有事件捕获
wrapper.addEventListener("click",function(){
console.log("wrapper");
},true);
content.addEventListener("click",function(){
console.log("content");
},true);
box.addEventListener("click",function(){
console.log("box");
},true);
触发顺寻 先捕获后冒泡 当前点击的为事件执行按照绑定顺序执行
取消事件冒泡
- w3c:e.stopPropagation();
- ie:e.cancelBubble=true;
默认事件
- 右键菜单事件
document.οncοntextmenu=function(e){
// 禁止右键菜单事件
1、return false;
2、e.preventDefault(); //w3c标准
}
- a href="javascript:void(0)" 相当于return false 禁止默认事件
事件源兼容性获取方法
事件兼容性写法 var event= e|| window.event;
事件源兼容性写法 var target = event.target || event.srcElement
事件委托机制
var ul = document.getElementsByTagName("ul")[0]; //事件委托机制 性能高
ul.onclick = function (e) {
var event = e || window.event;
var target = event.target || event.srcElement;
console.log(target.innerText);
}
拖拽事件封装
/**
* 拖拽实现
* @param {需要拖拽的元素} elem
*/
function drag(elem) {
var disX,
disY;
addEvent(elem, 'mousedown', function (e) {
var event = e || window.event;
disX = event.clientX - parseInt(getStyle(elem, 'left'));
disY = event.clientY - parseInt(getStyle(elem, 'top'));
addEvent(document, 'mousemove', mouseMove);
addEvent(document, 'mouseup', mouseUp);
stopBubble(event);
cancelHandler(event);
});
function mouseMove(e) {
var event = e || window.event;
elem.style.left = event.clientX - disX + "px";
elem.style.top = event.clientY - disY + "px";
}
function mouseUp(e) {
var event = e || window.event;
removeEvent(document, 'mousemove', mouseMove);
removeEvent(document, 'mouseup', mouseUp);
}
}
鼠标事件
click、mousedown、mouseup
click = mousedown+mouseup
mouseover、mouseout //进入区域 离开区域
mouseenter、mouseleave //进入区域 离开区域
区分左右键 mousedown mouseup e.button ==2 right e.button==0 left
dom3 click只监听左键
键盘事件
keydown、keyup、keypress
keydown > keypress > keyup
keydown 可以监测所有键
keypress 只返回有asii表的按键, (String.fromCharCode(e.charCode))
文本框事件
input 里面有变化就会触发
change 聚焦和失去焦点 变化触发
focus
blur
window事件
load
1、 浏览器渲染 过程 先domtree csstree rendertree
2、load 渲染过程完成执行 所有下载完成 尤其有大的图片下载的时候,load效率会很低 主程序不可以放load里面