2012-05-08 60 views
0

好吧,我有鏈接的alist,我正在用for循環處理它們,附加事件。 鏈接會獲得一個調用函數的單擊事件。該函數需要對調用它的對象進行操作。像這樣:Javascript IE事件,這個

<ul><li id = 'myId'>Text</li> 
    <li id = 'myId'>Text</li> 
    <li id = 'myId'>Text</li> 
    <li id = 'myId'>Text</li> 
    </ul> 


    var grab = document.getElementsByTagName('li'); 
    for (var x =0;x<grab.length;x++){ 
     grab[x].attachEvent('onmouseover',doSomething); 
     } 

    function doSomething(){ 
     this.setAttribute('color','yellow'); 
    } 

這在所有的瀏覽器工作正常,但IE瀏覽器,我有這個問題似乎是IE想「這」是窗口,而不是調用該事件的對象。

我得到的JQuery很容易解決這個問題,它只是我沒有在這種情況下訪問JQuery。是否有一種方法,只是在正常的JavaScript,讓IE正確使用'this',或者如何近似其他人的行爲?

感謝,

回答

1

只需使用舊標準可靠on[event]處理程序。

for (var x = 0, len = grab.length; x < len; x++) { 
    grab[x].onmouseover = doSomething; 
} 

並確保您沒有實際上覆制問題中顯示的ID。

+0

感謝,他們是dummmy的ID,我想使用這種風格的事件註冊,但我也想註冊一個onmouseleave事件(或任何IE調用它)是可能的時使用這種類型的事件處理程序? – user173361

+0

@ user173361:是的,您可以爲任何類型的受支持事件綁定處理程序,但您應該使用'onmouseout'來補充'onmouseover'。 –

1

我認爲該事件被傳遞給函數,你應該能夠使用evt.srcElement

for (var x =0;x<grab.length;x++){ 
     grab[x].attachEvent('onmouseover', doSomething); 
} 

function doSomething(evt){ 
    evt.srcElement.setAttribute('color','yellow'); 
} 
+0

你需要'doSomething'返回一個函數。編輯:你的更新也不會工作,因爲你回到原來的問題,這不是一個參考接收事件的元素。 –

+0

@cliffsofinsanity感謝輸入懸崖。 – Magnus

+0

回到你的第一個答案,但在'doSomething'內,讓它返回函數(){sender.setAttribute('color','yellow'); };'所以你要返回一個關閉'sender'的函數。不確定在IE中是否有關閉泄漏,但它可以解決手頭的問題。 –

0

你也可以這樣做:

<ul><li id = 'myId'>Text</li> 
<li id = 'myId'>Text</li> 
<li id = 'myId'>Text</li> 
<li id = 'myId'>Text</li> 
</ul> 

var grab = document.getElementsByTagName('li'); 
for (var x =0;x<grab.length;x++){ 
    grab[x].attachEvent('onmouseover',function(){ 
     doSomething.call(grab[x]); 
    }); 
} 
function doSomething(){ 
    this.setAttribute('color','yellow'); 
} 
+0

這將無法正常工作,因爲JavaScript沒有塊範圍。每個處理程序都引用同一個'x'變量,因此每個處理程序都會引用循環後設置了'x'的最終值。您需要一個閉包來保留每個迭代值。 –