2010-11-11 82 views
0

使用JavaScript,我創建了一些html內容 - 一些嵌套的div,通過樣式表進行樣式設計。safari/chrome dom更新滯後jquery dhtml?

在致電$(container).html(dhtmlString)之後,我嘗試爲佈局目的做一些計算。但是,我在jQuery中取回的值與在Safari和Chrome中運行時的預期值不匹配。

在代碼:

var someHtml = ...; 
$(".Container").html(someHtml); 

var containerWidth = $(".Container").width(); // properly reports 800 
var nestedDivWidth = $(".NestedDiv").width(); // incorrectly reports 800 

我期待NestedDiv是大約450像素(那它是什麼樣式表)。在FF和IE上,這可以正常工作,但在Safari和Chrome瀏覽器中並沒有。

我懷疑在safari/chrome中如何更新DOM。

當內容實際呈現給瀏覽器時,開發人員元素檢查器確實顯示適當的寬度。

我正在使用jquery 1.4.2(我已經嘗試1.4.3以及),沒有運氣。

回答

1

如果碰上這種事情,它可能是值得給瀏覽器中的時刻來處理HTML變化:

var someHtml = ...; 
$(".Container").html(someHtml); 

setTimeout(function() { 
    var containerWidth = $(".Container").width(); // properly reports 800 
    var nestedDivWidth = $(".NestedDiv").width(); // incorrectly reports 800 
}, 0); 

,基本上做一個線程產量到瀏覽器的渲染引擎。更具體地說,它調度一個計時器,以便儘快回調(大多數瀏覽器的回調速度不會超過10毫秒,但這取決於它們),這會給出渲染線程(如果有的話,某些瀏覽器使用一個線程對於一切,在這種情況下你真的需要)有機會趕上。由於該函數關閉了封閉範圍內的任何數據,因此從編碼的角度來說,在函數內部而不是在函數之後進行邏輯是非常容易的。 (請注意,任何陳述setTimeout會在你給setTimeout功能的代碼之前發生的;這就是邏輯移動到函數的整點)。

0

這聽起來像一個時機的問題對我來說太。您是否在函數上使用$(document).ready()來確保文檔已完成加載?