Немного поздно, но я думаю, что у меня есть надежное решение без необходимости setTimeout()
. После быстрого просмотра кода кажется, что JQM 1.2.0 выдает silentScroll(0)
на window.load
для просмотра без хрома на iOS. См. jquery.mobile-1.2.0.js
, строка 9145:
// window load event
// hide iOS browser chrome on load
$window.load( $.mobile.silentScroll );
Что происходит, так это то, что это противоречит аппликативным вызовам silentScroll()
. Вызывается слишком рано, рамки прокручиваются обратно вверх. Вызывается слишком поздно, пользовательский интерфейс мигает.
Решение состоит в том, чтобы привязать обработчик одноразового действия к событию 'silentscroll'
, которое вызывает window.scrollTo()
напрямую (silentScroll()
в любом случае немного больше, чем асинхронный window.scrollTo()
). Таким образом, мы фиксируем первый выданный JQM silentScroll(0)
и сразу же перемещаемся к нашей позиции.
Например, вот код, который я использую для глубокой связи с именованными элементами (обязательно отключите загрузку ajax для входящих ссылок с помощью data-ajax="false"
). Известны имена якорей #unread
и #p<ID>
. Заголовок исправлен и использует #header
ID.
$(document).bind('pageshow',function(e) {
var $anchor;
console.log("location.hash="+location.hash);
if (location.hash == "#unread" || location.hash.substr(0,2) == "#p") {
// Use anchor name as ID for the element to scroll to.
$anchor = $(location.hash);
}
if ($anchor) {
// Get y pos of anchor element.
var pos = $anchor.offset().top;
// Our header is fixed so offset pos by height.
pos -= $('#header').outerHeight();
// Don't use silentScroll() as it interferes with the automatic
// silentScroll(0) call done by JQM on page load. Instead, register
// a one-shot 'silentscroll' handler that performs a plain
// window.scrollTo() afterward.
$(document).bind('silentscroll',function(e,data) {
$(this).unbind(e);
window.scrollTo(0, pos);
});
}
});
Пользовательский интерфейс больше не мигает, и кажется, что он работает надежно.