讀古今文學網 > 編寫高質量代碼:改善JavaScript程序的188個建議 > 建議162:關注各種引擎對Event解析的分歧 >

建議162:關注各種引擎對Event解析的分歧

1.Event使用

IE可以直接使用event對象,但其他引擎不可以直接使用。


<input type="button"onclick="doIt">

<script>

function doIt{

alert(event);

}

</script>


上面代碼在Firefox等瀏覽器中不能正常工作,這是因為Firefox瀏覽器中沒有默認的event對象,只能在事件發生的現場使用event對象。兼容的方法如下:


<input type="button"onclick="doIt(event)">

<script>

function doIt(oEvent){

alert(oEvent);

}

</script>


2.event.srcElement[IE]和event.target[Moz]

在Firefox等引擎下的event.target相當於IE下的event.srcElement,不過在細節上有區別,event.srcElement返回一個Html Element,而event.target返回的是個節點,該節點包括文本節點。比較下面示例代碼的區別和聯繫。

(1)IE使用event.srcElement


<table border="1"onclick="doIt">

<tr><td>1</td><td>2</td></tr>

<tr><td>3</td><td>4</td></tr>

</table>

<script>

function doIt{

alert(event.srcElement.tagName);

}

</script>


(2)非IE瀏覽器使用event.target


<table border="1"onclick="doIt">

<tr><td>1</td><td>2</td></tr>

<tr><td>3</td><td>4</td></tr>

</table>

<script>

function doIt(oEvent){

var Target=oEvent.target;

while(oTarget.nodeType!=1)

Target=oTarget.parentNode;

alert(oTarget.tagName);

}

</script>


3.獲取鍵盤值

不同引擎獲取鍵盤值的途徑和方法是不同的。

(1)IE使用event.keyCode


<input type="text"onkeypress="doIt">

<script>

function doIt{

alert(event.keyCode);

}

</script>


(2)非IE瀏覽器使用event.which


<input type="text"okeypress="doIt(event)">

<script>

function doIt(oEvent){

alert(oEvent.which)

}

</script>


4.獲取鼠標指針的絕對位置

IE通過event對象的event.x和event.y屬性獲取鼠標指針的絕對位置,而Firefox等引擎通過event對象的event.pageX和event.pageY獲取鼠標指針的絕對位置。例如,通過如下方法可以兼容不同引擎的用法。


<ponclick="doIt(event)">

<script>

function doIt(oEvent){

var posX=oEvent.x?oEvent.x:oEvent.pageX;

var posY=oEvent.y?oEvent.y:oEvent.pageY;

alert("X:"+posX+"\nY:"+posY)

}

</script>


5.獲取鼠標指針的相對位置

IE通過event對象的event.offsetX和event.offsetY屬性獲取鼠標指針的相對位置,而Firefox等引擎通過event對象的event.layerX和event.layerY獲取鼠標指針的相對位置。例如,通過如下方法可以兼容不同引擎的用法。


<ponclick="doIt(event)">

<script>

function doIt(oEvent){

var posX=oEvent.offsetX?oEvent.offsetX:oEvent.layerX;

var posY=oEvent.offsetY?oEvent.offsetY:oEvent.layerY;

alert("X:"+posX+"\nY:"+posY)

}

</script>


6.綁定事件

IE通過attachEvent、detachEvent方法為DOM對像綁定事件、註銷事件,而Firefox等引擎通過addEventListener、removeEventListener方法為DOM對像綁定事件、註銷事件。

(1)IE


<input type="button"id="testBT">

<script>

var oButton=document.getElementById("testBT");

oButton.attachEvent("onclick",clickEvent);

function clickEvent{

alert("Hello,World!");

}

</script>


(2)Firefox


<input type="button"id="testBT">

<script>

var oButton=document.getElementById("testBT");

oButton.addEventListener("click",clickEvent,true);

function clickEvent{

alert("Hello,World!");

}

</script>


注意,在IE中要在事件前加on前綴,而在Firefox等引擎中不用加。

7.獲取事件目標源

在IE下,event對像使用srcElement屬性獲取當前事件的目標元素,不支持target屬性。而其他引擎正好相反,event對像使用target屬性獲取當前事件的目標元素,不支持srcElement屬性。可以使用下面代碼進行兼容。


obj=event.srcElement?event.srcElement:event.target;