2012-12-06 46 views
3


我有一個DOM appendChild()方法的麻煩。我創建一個節點,然後將此節點追加到父節點,然後我想讀取node.clientWidth屬性,但它返回0,因爲該節點尚未繪製。這裏是我的代碼:javascript:執行appendChild(節點),然後嘗試讀取node.clientWidth失敗

var node = document.createElement('div'); 
node.textContent = 'some text'; 
parent.appendChild(node); 
alert(node.clientWidth); //shows 0 

我試過的節點上onloadonshow事件,但他們甚至沒有觸發。我可以使用setTimeout,它可以工作,但這不是一個完美的解決方案。有沒有很好的解決方案 這個問題?
對不起,我的英語不好,非常感謝你!

UPDATE:好的,我看到我的問題。父母當時沒有附加到DOM。很抱歉,並感謝您的時間

+0

的onload必須是有益的,但DOM準備的事件是什麼,你居然需要嘗試,或者在父元素 – dmi3y

+0

後面嵌入代碼我很難重新創建這個。你使用的瀏覽器是什麼,這個腳本運行在什麼上下文(head,body,onload)?如果我把它放在頭部,它會因TypeError失敗,因爲document.body還不存在。如果我把它放在體內,它會按預期工作。 –

+0

好吧,我看到我的問題。父母當時沒有附加到DOM。對不起,感謝您的時間 – falouu

回答

0

如果你真的希望它給你clientWidth只要瀏覽器知道它,你可以這樣做:

var node = document.createElement('div'); 
node.textContent = 'some text'; 
parent.appendChild(node); 
var width = node.clientWidth; 
while (width == 0) { 
    width = node.clientWidth; 
} 
// stuff 
+0

不幸的是,這導致了一個無限循環。奇怪的是,沒有這個事件... – falouu

+0

通常你可以立即檢查它,你是否在等待DOM被加載之前追加節點? –

+0

是的,這個動作是在window.onload回調中執行的。奇怪的是,因爲2毫秒的setTimeout足夠了,但while循環永遠不會結束。恐怕我必須在循環中執行setTimeout ... – falouu

相關問題