Время загрузки таблиц стилей Firefox и Safari, запуск события JavaScript при загрузке - PullRequest
1 голос
/ 13 августа 2010

У нас есть некоторый код JavaScript, который изменяет размеры элементов <div/> (корректирует высоту / ширину / отступы / поля и т. Д.) В зависимости от размеров родительского элемента <div/>, в частности высоты и ширины родительского элемента, который мы используем врасчет.Высота и ширина родительского элемента определяется во внешнем файле CSS, и <link> используется для включения таблицы стилей в раздел <head> страницы.Все таблицы стилей включены перед javascript.Код изменения размера JavaScript запускается внутри события готовности документа jQuery с использованием стандарта $(function() {}).Ко всем таблицам стилей и javascripts автоматически добавляются временные метки (приложение Rails), чтобы гарантировать, что они не кэшируются (в разработке).

В Firefox 3.6 изменение размера работает каждый раз.Однако в Safari 5 иногда изменение размера завершается неудачей, потому что родительская высота / ширина неверна, что, по-видимому, связано с тем, что таблица стилей не загружалась до JavaScript.К сожалению, это происходит каждые несколько раз и отличается в зависимости от загрузки браузера / компьютера.Я могу поместить код изменения размера в setTimeout() и задержать его примерно на 1 секунду или около того, чтобы заставить его работать надежно, но это не выполнимое решение, потому что оно слишком медленное и все еще зависит от машины.В идеале должен быть способ гарантировать , чтобы таблица стилей была загружена, а затем запустить код изменения размера JS.

Прежде всего, это плохой дизайн, когда изменение размера JS на основе CSS загружается из внешней таблицы стилей?Я подумываю о том, чтобы попытаться разместить высоту и ширину встроенными, чтобы они отображались с сервера, но это требует значительного изменения кода приложения и более тесной связи с пользовательским интерфейсом, и я хотел бы по возможности избежать встроенного стиля.Случайно ли происходит событие webkit при загрузке таблиц стилей?Я не думаю, что есть.Какие-нибудь предложения относительно метода кроме тайм-аута, чтобы гарантировать, что все таблицы стилей загружены перед запуском JavaScript?Кто-нибудь еще испытывал различия в порядке и времени загрузки таблиц стилей между Webkit и другими браузерами, и есть решение, которым можно поделиться?Я мог бы по-новому взглянуть на эту проблему.

Примечание: в целом для изображений мы используем событие load ($(thing).load(fn(){})) для изображений, чтобы убедиться, что они загружаются перед применением к ним любого JavaScript.Это было бы хорошим примером для подражания, если бы такая вещь существовала.Спасибо!

1 Ответ

1 голос
/ 13 августа 2010

Сотрудник (@johnreilly) нашел пару решений, одно из которых опрашивает свойство document.readyState, когда браузер Safari ищет значение complete.

Получить реальную ширину и высоту изображения с помощью JavaScript? (в Safari / Chrome)

Другой создает пользовательское событие cssLoaded и использует псевдоселектор :after, чтобы избежать опроса. http://stilbuero.de/demo/cssloaded/

Итак, первое решение приемлемо. Я помещаю его в основной файл javascript и использую $.trigger() для отправки настраиваемого события нашим обработчикам, которые зависят от того, что Webkit полностью загрузил таблицы стилей.

...