2017-02-19 88 views
2

我有兩個函數,第一個函數是createTables用於生成不同的div,第二個函數是compare用於比較這些表。 這兩個函數是「doIT」函數的一部分,但我需要執行兩次函數「doIT」。第一次它說「不能讀取屬性'isEqualNode'未定義」。任何方式來解決它?需要執行兩次函數才能獲得結果

function compare() 
{ 
    var elems = document.getElementsByClassName("rtables"); 
    if (elems[0].isEqualNode(elems[1])) { 
    alert("Elements are equal"); 
    } else { 
    alert("Elements are NOT equal"); 
    } 
} 
+0

顯然,當調用compare時,沒有類'rtables'的元素。 – Ryan

+0

在HTML呈現之前你是否調用了你的函數? –

+0

這兩個函數都是同時調用的。 –

回答

1

當您比較函數在第一次嘗試時運行時,DOM樹還沒有用您的新表進行更新;因此沒有rtables的元素。

第二次調用它時,第一部分不需要完成,因爲DOM已經更新,這就是爲什麼您的compare方法在第二次嘗試中有效。

這是因爲瀏覽器必須等待javascript完成才能呈現任何DOM更新(大多數瀏覽器在單線程實現中更新DOM)。

最簡單的方法是將你的函數分成兩部分,然後調用第二部分(compare),讓瀏覽器有機會更新DOM。

另一種方法是將您的比較調用包裝在setTimeout中,這會使瀏覽器有機會更新DOM緩存。

這應該解決你的問題,也是一個很好的編程習慣 - 一個函數應該只做一件特定的事情,這使得調試更容易。如果你有一個功能執行三種不同的事情,那麼它就很難追蹤錯誤,很快你就會有多線怪物。

+0

我雖然因爲這個,但問題是我需要調用它時點擊按鈕,所以這就是爲什麼這兩個在相同的功能..當我試圖在這些功能之間的輸入等待其延遲的主要功能,當按鈕被點擊時調用.. –

+0

另一種方式(並不那麼簡單)是在與調用者的「compare」上實現一個'setTimeout'。 –

+0

好的,我會在晚些時候嘗試它實際上在牀上.. 5月.. IT生活無論如何感謝您的幫助。 –

相關問題