今天了解了js 的事件,以前寫代碼時并不會在意它的兼容問題,那么今天總結幾個關于事件的兼容寫法厦取。
1、js中經常用的就是點擊事件管搪,它在chrome 虾攻、火狐以及IE瀏覽器下的兼容寫法比較新奇,
document.onclik = function(e){
? ? ? ?var oEvent = e || event; ? ??
注意更鲁,不要將var e=e||event; 寫成 var e=event||e; 霎箍,這在FireFox下會提示錯誤,FireFox無法處理未聲明未賦值的變量event
? ? ? alert('x:'+oEvent.clientX + 'y:'+oEvent.clientY)
}
上述方式就是解決了兼容問題澡为, alert('x:'+e.clientX + 'y:'+e.clientY)? ? //兼容火狐
alert('x:'+event.clientX + 'y:'+event.clientY) ? ? ?//兼容chrome
2漂坏、鍵盤按下事件,它的兼容寫法:
document.onkeydown = function(e){
? ? ?if(e.keyCode){
? ? ? ? alert(e.keyCode)
? ? }else{
? ? ? ?alert(e.which)
? ? ?}
}
3媒至、阻止事件的冒泡顶别,我理解的就是父子級同時都綁定了點擊事件,如果執(zhí)行了其中一個事件拒啰,另外一個的事件也會被執(zhí)行驯绎,而且是從內往外執(zhí)行,也就是子級先執(zhí)行然后父級也被執(zhí)行谋旦,就造成了不必要的麻煩剩失,所以我們需要做的就是阻止事件的冒泡骗随。首先阻止事件的冒泡,暫時先寫兩個方式:
w3c 的方法是 e.stopPropagation()赴叹,
IE 則是使用 e.cancelBubble = true鸿染;
兼容寫法:
var e = e || window.event;? ? //這里一定寫成window.event,網上是說的是在IE(暫時僅限于8.0以下版本)下是行不通的,IE采用了一種非標準的方式乞巧,并不是將事件作為函數參數傳入涨椒,而是將事件作為window對象的event屬性:window.event、window.event.screenX...
if ( e && e.stopPropagation ){
? ? ?e.stopPropagation();
}else{
? ? ?e.cancelBubble = true;
}
4绽媒、取消默認 事件蚕冬,兼容寫法
e.preventDefault() ? ? ? // 火狐
?e.returnValue = false
var e = e||window.event;
if(e && e.preventDefault){
? ? ?e.preventDefault();
}else{
? ? ?e.returnValue = false;
}
5、事件的委托是辕,一般來說此類方法會涉及到循環(huán)囤热,用了事件委托之后,杜絕循環(huán)获三,執(zhí)行效率更高旁蔼,而且新創(chuàng)建的元素也可以執(zhí)行該事件。
事件的委托的兼容寫法:
oUl.onmouseover = function(e){
//為了兼容IE
? ? var oEvent = e||window.event;
? ? var target = oEvent.target|| oEvent.srcElement;
? ? if(target.nodeName.toLowerCase() == 'li'){
? ? ? ? target.style.background = 'red';
? ?}
}
6疙教、事件的捕獲棺聊,將其進行封裝:
function fun(ele,eve,handler,type){
? ? ?if(ele.attchEvent){
? ? ? ? ele.attachEvent("on"+eve,handler)
? ? ?}else{
? ? ? ? ele.addEventListener(eve,handler,type)
? ?}
}
ele:元素
eve:事件
handler:函數
type:值為false 或 true