2010-08-13 73 views
1

我們有一些基於父元素的尺寸<div/>元素(調整高度/寬度/填充/邊距等)的元素,我們在計算中使用的父級的寬度。父div的高度和寬度在外部CSS文件中定義,並且<link>用於在頁面的<head>部分中包含樣式表。所有樣式表都包含在javascripts之前。使用標準$(function() {}),JavaScript調整大小代碼在jQuery文檔準備事件內部被觸發。所有樣式表和JavaScripts都會自動附加時間戳(Rails應用程序),以確保它們不會被緩存(正在開發中)。Firefox和Safari樣式表加載時間,加載時觸發JavaScript事件

在Firefox 3.6中,每次都調整大小。但是在Safari 5中,偶爾調整大小會失敗,因爲父高度/寬度不正確,這似乎是因爲樣式表尚未在JavaScript之前加載。令人沮喪的是,這種情況每隔幾次就會發生一次,並且根據瀏覽器/機器的負載情況而有所不同。我可以將調整大小的代碼放在setTimeout()中,並將其延遲1秒左右,使其可靠工作,但這不是一個可以解除的解決方案,因爲它太慢了,而且仍然因機器而異。理想情況下,將有一種方式保證樣式表被下載,然後觸發JS調整大小的代碼。

首先,這是一個糟糕的設計,有JS調整基於從外部樣式表加載的CSS?我正在考慮嘗試將內聯高度和寬度設置爲內聯,以便從服務器進行渲染,但這需要重大的應用程序代碼更改以及與UI更緊密的耦合,並且如果可能,我想避免內聯樣式。樣式表加載時偶然會有webkit事件嗎?我不認爲有。除了超時以外的任何建議,以確保所有樣式表在加載JavaScript之前加載?其他任何人在Webkit和其他瀏覽器之間的樣式表加載順序/時間方面存在差異,並且有共享的解決方案?我可以對這個問題進行一些新的思考。

注意:通常對於圖像,我們使用圖像上的加載($(thing).load(fn(){}))事件來確保在對它們應用任何JavaScript之前加載它們。如果存在這樣的事情,那將是一個很好的模式。謝謝!

回答

1

同事(@ johnreilly)發現了幾個解決方案,其中一個在瀏覽器Safari正在查找complete的值時輪詢document.readyState屬性。

Get the real width and height of an image with JavaScript? (in Safari/Chrome)

另一個創建一個定製cssLoaded事件,並使用:after僞選擇,以避免輪詢。 http://stilbuero.de/demo/cssloaded/

所以第一個解決方案是可以接受的。我將它放在主JavaScript文件中,並使用$.trigger()向我們的處理程序發出定製事件,這些定製事件取決於Webkit完全下載了樣式表。