Когда я предупреждаю о значении .position().left
, оно возвращает 0 в Chrome. В других браузерах он возвращает фактический номер. Почему это происходит?
Проблема с положением jQuery в Chrome
Ответы (8)
Браузеры на основе Webkit (например, Chrome и Safari) могут получить доступ к свойствам изображений width
и height
только после полной загрузки изображений. Другие браузеры могут получить доступ к этой информации, как только загрузится только DOM (им не нужно полностью загружать изображения, чтобы узнать их размер).
Таким образом, если на вашей странице есть изображения, в браузерах на основе Webkit вы должны получить доступ к информации offset
после срабатывания события $(window).load
, а не после события $(document).ready
.
Читая комментарии с http://api.jquery.com/position/, вы можете почини это. Тот, который я нашел работающим,
Ajaho [Moderator]: эта функция плагина исправляет проблемы с неправильным положением в Chrome.
jQuery.fn.aPosition = function() {
thisLeft = this.offset().left;
thisTop = this.offset().top;
thisParent = this.parent();
parentLeft = thisParent.offset().left;
parentTop = thisParent.offset().top;
return {
left: thisLeft-parentLeft,
top: thisTop-parentTop
};
};
Иногда Webkit может быть слишком быстрым, но об этом часто заботятся в jQuery. Вы можете отлаживать, используя что-то вроде:
var v, elem = $('.myElement');
window.setTimeout(function() {
v = elem.position().left;
console.log(v);
if (v) {
return false;
}
window.setTimeout(arguments.callee, 1);
}, 1);
Это проверит, доступна ли позиция и когда. Если вы записываете «0» в бесконечность, position().left
«никогда» недоступно, и вам нужно отлаживать в другом месте.
jQuery.offset()
возвращал неверные (ненулевые) значения - похоже, мое позиционирование CSS заставляло Chrome дважды размещать документ (или что-то в этом роде). Вызов offset
слишком рано вернул положение элементов, как если бы они были без CSS.
- person Justin; 27.01.2011
$(function(){console.log($('img').position().top);});
, но была правильной при использовании того же кода в событии щелчка позже.
- person andyb; 27.03.2011
У меня такая же проблема..
Я исправил это, используя: .offset().left
вместо этого. Но имейте в виду, что это не одно и то же: http://api.jquery.com/offset/
.position().left
работало в Chrome в некоторых тестах, которые я проводил, используя тот же подход, что и Дэвид (значение было доступно с первой попытки).
В моем «настоящем» приложении не удалось даже прочитать позицию по событию щелчка (что может устранить любую проблему со скоростью загрузки). В некоторых комментариях (на другом форуме) говорится, что это может быть связано с использованием display:inline-block
. Однако я не смог воспроизвести проблему, используя inline-block
. Так что может дело в другом.
Возможно, это немного устарело, поскольку вопросы датируются 2010 годом, но это решило мои проблемы с позиционированием в Chrome:
$(window).load(function(){
p = $('element').offset();
// et cetera
});
используйте jQuery(window).load() вместо jQuery(document).ready()
Для меня это сработало, поместив код javascript в документ, готовый непосредственно перед закрытием тега body.
Таким образом, он выполняет код после того, как все загрузит.
<body>
<div>content</div>
<div class='footer'>footer</div>
.
.
.
<script type='text/javascript>
$(document).ready(function(){
var footer_position = $(".footer").offset().top;
console.log(footer_position);
});
</script>
</body>
Я использую эту функцию, чтобы исправить это.
function getElementPosition(id) {
var offsetTrail = document.getElementById(id);
var offsetBottom = 0;
var offsetTop = 0;
while (offsetTrail) {
offsetBottom += offsetTrail.offsetBottom;
offsetTop += offsetTrail.offsetTop;
offsetTrail = offsetTrail.offsetParent;
}
return {
bottom: offsetBottom,
toppos: offsetTop
};
}
position
, и, возможно, немного HTML/CSS, чтобы увидеть, что может пойти не так. - person Doug Neiner   schedule 31.01.2010