2011-07-21 44 views
0

怎麼樣呢,未定義ParentNode DOM錯誤的onmouseout

[here is a small page illustrating my problem(問題出現在火狐)

所以我有一個功能onmouseout="regress(event, this)"其測試,如果鼠標實際上了當前元素和任何外這是孩子。 (more details on why I did this and what is the matter)。 如果鼠標確實在外面,我想停止按鈕上的動畫並重置一個計時器(我曾這樣做)。它的工作原理。

只有它沒有。在Firefox(測試v5.0)即是。我得到一個DOM相關的錯誤。觸發該函數的元素的「parentNode」是「」,然後它的父代將是「未定義」,然後出現錯誤並且代碼爆炸。

這是令人困惑的部分:只有當鼠標真正離開按鈕區域時纔會發生此錯誤。還有另一種情況,當onmouseout事件被觸發時(爲了避免使用這個函數)。這是按鈕的孩子從按鈕的另一個孩子。在這種情況下,parentNode工作正常,從buttonChild到按鈕到buttonParent到blabla到BODY,然後停止。

我的問題是,爲什麼未定義的錯誤出現在一種情況下,而不在其他。請注意,Chrome或IE9中沒有錯誤。另外我該如何解決它?

這讓我感到困惑。感謝您的任何幫助。

我很困惑。

另外這裏的JavaScript函數:

function regress(evt, x){ 
    //if (!e && window.event) 
    if (window.event) 
     var e = window.event; 
    else 
     var e = evt; //if we got here, you're using Firefox 
    var reltg = (e.relatedTarget) ? e.relatedTarget : e.toElement; 

    while (reltg.tagName != 'body') 
    { 
     //alert(reltg.id+" == " + x.id); 
     if (reltg.id == x.id) 
     { 

      return; 
     } 
     reltg = reltg.parentNode; 
     //alert(reltg.tagName); 
    } 
    // I'm on true mouseout, do stuff here: 
    $("#"+x.id+"ThickParent").stop(true, false); 
    $("#"+x.id+"ThickParent").width(0); 

    canStartAgain=true; 

    stopInterval = true; 
    timerValue = 1.50; 
    $("#"+x.id+"Timer").html(""); 
    //thanks to: http://www.webmasterworld.com/javascript/3752159.htm 
} 

取消註釋//alert(reltg.id+" == " + x.id);清楚地看到,當onmouseout得到觸發,哪些元素reltg.parentNode在什麼時候上。

+0

我在FF5的這條線上得到一個錯誤:'while(reltg.tagName!='body')' –

回答

2

幾個月前我也遇到了同樣的問題。你會注意到,從頂端退出錯誤不會發生。由於某種原因,「body」標籤被縮小以適應內部div並延伸到頂部,當移動到botton(或leff,或右)時,FF會觸發相關目標指向「html」標籤的事件,並在你的循環停止條件是標籤是「身體」的一個。 「html」標記的父項是文檔,文檔的父項爲null,並且在嘗試訪問nulltagName屬性時會拋出錯誤。要達到預期的結果,您必須將停止條件更改爲while (reltg.tagName != 'html'),或者甚至將最大錯誤更改爲while (reltg && (reltg.tagName != 'body'))

+0

爲什麼要謝謝Prusse。現在我知道會發生什麼。但爲什麼Mozilla會這麼做呢?它沒有任何意義... – Spectraljump

+0

這就是爲什麼我使用「某些原因」=)...也許它應該閱讀「沒有韻律或理由」,對不起英語不是我的第一語言。 – Prusse