2010-08-13 23 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完全下载了样式表。

相关问题