position()
( документы ), как и другие функции в модуле offset
(и, в целом, в модулях css), зависит от фактического положения элементов в DOM после они оказаны.
$(document).ready()
, с другой стороны, срабатывает сразу после создания DOM.
В современных браузерах это соответствует DOMContentLoaded :
документ полностью загружен и проанализирован, не дожидаясь окончания загрузки таблиц стилей, изображений и подкадров
В ready
вы можете безопасно манипулировать DOM (прикреплять события и т. Д.), Но у вас могут быть проблемы, если вы «измеряете» его. Например, он не ожидает загрузки таблиц стилей или загрузки изображений и их визуализации.
Вы столкнулись с очень раздражающей проблемой, поскольку она сильно зависит от платформы (браузер + версия jQuery): в нашем случае она работала в двух браузерах из трех, и даже в третьем она работала в 99% случаев. время, которое указывает, что это, вероятно, условие гонки (JavaScript является однопоточным, а браузер - нет).
Если вам нужно измерить элементы, вам лучше использовать $(window).load()