首页 > 代码库 > 事件捕获、冒泡、绑定、赋值、委托、兼容、滚轮
事件捕获、冒泡、绑定、赋值、委托、兼容、滚轮
clientX/Y 可视区的鼠标坐标 全兼容
offsetX/Y 鼠标坐标到物体边框的距离 IE+Chrome
pageX/Y 页面 高级 浏览器
screenX/Y 屏幕 全兼容(没用)
var e = evt || window.event;
evt作为参数兼容高级浏览器,window.event兼容低版本IE;(此处注意属性和变量eg:window.a和a,亲着是undefined,后者是is no difined)
添加事件的方法:
1 赋值的方法 ---document.onclick = function(){}; --->缺点:会覆盖;
取消事件的方法 document.onclick = null;
2 事件绑定------addEventListener(evname,fn,false)/attachEvent(‘on‘+evname,fn);
兼容高级浏览器(false代表冒泡,true代表捕获) 兼容低版本IE(IE事件流只有冒泡)
取消绑定的方法 removeEventListener(evname,fn,false)/detachEvent(‘on‘+evname,fn);
DOM事件必须用时间绑定添加;
注意事件绑定的函数,不能作为匿名函数,而是用函数名来取消绑定
3 事件委托 利用事件冒泡,给父级加事件--->优点:1简化重复的函数代码2给未来的元素加事件
给父级添加事件委托,this变为父级,要通过var oSrc=http://www.mamicode.com/oEvent.srcElement||oEvent.target;来获取事件源,IE和Chrome兼容srcElement , Firefox Chrome兼容target;Chrome都行
setCapture(),将所有的事件归集捕获给obj
releaseCapture()
取消事件冒泡的方法:
evt.stopPropagation();//非IE
window.event.cancelBubble = true;//IE中
兼容写法: window.event ? window.event.cancelBubble = true : evt.stopPropagation();
取消默认事件的方法:
evt.preventDefault(); 非IE
window.event.returnValue = http://www.mamicode.com/false;/return false IE
return false阻止默认事件,遇到addEventListener会失效
*用preventDefault解决
ready事件
高级浏览器:
document.addEventListener(‘DOMContentLoaded‘, function (){
alert(‘ready‘);
}, false);
低版本IE:(有interactive 和complete)
document.attachEvent(‘onreadystatechange‘, function (){
if(document.readyState==‘complete‘){
alert(‘ready‘);
}
ready 的兼容写法:
function addReady(fn){
if(document.addEventListener){
document.addEventListener(‘DOMContentLoaded‘, fn, false);
}else{
document.attachEvent(‘onreadystatechange‘, function (){
if(document.readyState==‘complete‘){
fn();
}
});
}
}
滚轮事件:
wheelDelta IE、Chrome
上 正
下 负
detail Firefox
上 负
下 正
//IE、Chrome
/*oDiv.onmousewheel=function (){
alert(‘a‘);
};*/
//FireFox——DOMMouseScroll
oDiv.addEventListener(‘DOMMouseScroll‘, function (){
alert(‘a‘);
}, false); DOM事件必须用事件绑定
滚轮的兼容写法1
function wheel(ev){
var oEvent=ev||event;
var down;
if(oEvent.wheelDelta){
if(oEvent.wheelDelta<0){
down=true;
}else{
down=false;
}
}else{
if(oEvent.detail<0){
down=false;
}else{
down=true;
}
}
if(down){
alert(‘向下‘);
}else{
alert(‘向上‘);
}
}
if(window.navigator.userAgent.indexOf(‘Firefox‘)!=-1){
oDiv.addEventListener(‘DOMMouseScroll‘, wheel, false);
}else{
oDiv.onmousewheel=wheel;
}
}
//wheelDelta IE、Chrome
//上 正
//下 负
//detail Firefox
//上 负
//下 正
滚轮写法2 和3
function wheel(ev){
var oEvent=ev||event;
var down;
//down=oEvent.wheelDelta?oEvent.wheelDelta<0:oEvent.detail>0;
down=(oEvent.wheelDelta||-oEvent.detail)<0;
if(down){
alert(‘向下‘);
}else{
alert(‘向上‘);
}
}
if(window.navigator.userAgent.indexOf(‘Firefox‘)!=-1){
oDiv.addEventListener(‘DOMMouseScroll‘, wheel, false);
}else{
oDiv.onmousewheel=wheel;
}
关于相等的问题 -->只有字符串是静态的,不可变的;
//alert(12==12);
//alert(‘abc‘==‘abc‘);
//alert([1,2,3]==[1,2,3]);
//alert(new Array(1,2,3)==new Array(1,2,3));
//[1,2,3] => new Array(1,2,3)
//alert(12==12);
//alert(‘abc‘==‘abc‘);
alert({a: 12, b: 5}=={a: 12, b: 5});
//{a: 12, b: 5} => new Object()
//alert(12==12);
//alert(‘abc‘==‘abc‘);
/*var arr=[1,2,3];
arr[1]=4;
alert(arr);*/
var str=‘abc‘;
str[1]=‘d‘;
alert(str);
只有字符串是静态的,不可变的;
//alert(function (){alert(‘abc‘)}==function (){alert(‘abc‘)});
alert(new Function("alert(‘abc‘)")==new Function("alert(‘abc‘)"));
/*var show=function (){
alert(‘abc‘);
};*/
//var show=new Function("alert(‘abc‘);");
//show();
事件捕获、冒泡、绑定、赋值、委托、兼容、滚轮
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。