天天看點

JavaScript 相容性處理積累一

JavaScript 事件相容性處理

1、event

火狐、IE 7和8不支援

window.event

事件,需要把事件作為形參帶到函數體中才能有效果。是以當需要擷取滑鼠點選事件時,需要做相容處理。(2018-04-03)

document.onclick = function(ev){
    var oEvent = ev || window.event;
    alert(oEvent.clientX + ',' + oEvent.clientY);
}
           

2、阻止冒泡事件

JavaScript 執行事件的時候,一般遵循兩個事件階段,一個是捕獲階段,事件從根節點開始,逐級派送到子節點,若節點綁定了事件動作,則執行動作,然後繼續走。另一個是冒泡階段,執行完捕獲階段後,事件由子節點往根節點派送,若節點綁定了事件動作,則執行動作,然後繼續走。

·針對不同的浏覽器,通常需要對事件

cancelBubble

進行相容性處理。(2018-04-03)

<style type="text/css">
    .div1{
        width: px;
        height: px;
        background-color: red;
    }
    .div2{
        width: px;
        height: px;
        background-color: green;
    }
    .div3{
        width: px;
        height: px;
        background-color: yellow;
    }
</style>
<div class="div1" id="div1">
    <div class="div2" id="div2">
        <div class="div3" id="div3"></div>
    </div>
</div>
<script type="text/javascript">
window.onload = function(){
    var div1 = document.getElementById('div1');
    var div2 = document.getElementById('div2');
    var div3 = document.getElementById('div3');

    div3.onclick = function(ev){
        var oEvent = ev || window.event;
        alert('333');
        oEvent.cancelBubble = true;
    }
    div2.onclick = function(ev){
        var oEvent = ev || window.event;
        alert('222');
        oEvent.cancelBubble = true;
    }
    div1.onclick = function(ev){
        var oEvent = ev || window.event;
        alert('111');
        oEvent.cancelBubble = true;
    }
}
</script>
           

3、scrollTop

IE 7,8,Firefox:

對于沒有

<!DOCTYPE html>

聲明的頁面裡可以使用

document.body.scrollTop

來擷取

scrollTop

高度。

對于有

<!DOCTYPE html>

聲明的頁面裡可以使用

document.documentElement.scrollTop

來擷取

scrollTop

高度。

Safari:

safari有自己擷取scrollTop的函數,

window.pageYOffset

Google:

直接使用

document.documentElement.scrollTop

4、

attachEvent

addEventListener

相容性

attachEvent

是IE浏覽器的IE7,8浏覽器專門識别的事件,其他浏覽器或者版本(IE9及以上),使用

addEventListener

來擷取事件,是以需要做相容性處理

<input type="button" name="button" id="btn1" value="按鈕">
var btn = document.getElementById('btn1');
           
<script type="text/javascript">
if(window.attachEvent){
    btn.attachEvent('onclick', function(){
    alert('a');
   });
   btn.attachEvent('onclick', function(){
    alert('b');
   });
}else{
    btn.addEventListener('click',function(){
    alert('a');
    },false);
    btn.addEventListener('click',function(){
    alert('b');
    },false);
}
</script>
           

寫一個通用函數來處理類似問題;

function myAddEvent(obj,ev,fn){
  if(obj.attachEvent){
    obj.attachEvent('on' + ev,fn);
  }else{
    obj.addEveventListener(ev,fn,false);
  }
}
myAddEvent(btn,click,function(){
  alert('a');
})
myAddEvent(btn,click,function(){
  alert('b');
})
           

PS:attachEvent在IE7,8浏覽器中,因為浏覽器的曆史原因,

a

b

的出現次數會相反,會先出來

b

,而後出來

a

繼續閱讀