Ни одно из этих решений не помогло мне, потому что моя модель DOM сложна и у меня есть динамические страницы с бесконечной прокруткой, поэтому мне пришлось создать свою собственную.
Предыстория: я использую фиксированный заголовок и элемент ниже, который остается под ним, когда пользователь прокручивает так далеко вниз. Этот элемент имеет поле ввода для поиска. Кроме того, у меня есть динамические страницы, добавленные во время прокрутки вперед и назад.
Проблема: в iOS каждый раз, когда пользователь нажимал на ввод в фиксированном элементе, браузер прокручивал страницу до самого верха. Это не только вызвало нежелательное поведение, но и привело к добавлению моей динамической страницы вверху страницы.
Ожидаемое решение: в iOS нет прокрутки (вообще нет), когда пользователь нажимает на ввод в липком элементе.
Решение:
/*Returns a function, that, as long as it continues to be invoked, will not
be triggered. The function will be called after it stops being called for
N milliseconds. If `immediate` is passed, trigger the function on the
leading edge, instead of the trailing.*/
function debounce(func, wait, immediate) {
var timeout;
return function () {
var context = this, args = arguments;
var later = function () {
timeout = null;
if (!immediate) func.apply(context, args);
};
var callNow = immediate && !timeout;
clearTimeout(timeout);
timeout = setTimeout(later, wait);
if (callNow) func.apply(context, args);
};
};
function is_iOS() {
var iDevices = [
'iPad Simulator',
'iPhone Simulator',
'iPod Simulator',
'iPad',
'iPhone',
'iPod'
];
while (iDevices.length) {
if (navigator.platform === iDevices.pop()) { return true; }
}
return false;
}
$(document).on("scrollstop", debounce(function () {
//console.log("Stopped scrolling!");
if (is_iOS()) {
var yScrollPos = $(document).scrollTop();
if (yScrollPos > 200) { //200 here to offset my fixed header (50px) and top banner (150px)
$('#searchBarDiv').css('position', 'absolute');
$('#searchBarDiv').css('top', yScrollPos + 50 + 'px'); //50 for fixed header
}
else {
$('#searchBarDiv').css('position', 'inherit');
}
}
},250,true));
$(document).on("scrollstart", debounce(function () {
//console.log("Started scrolling!");
if (is_iOS()) {
var yScrollPos = $(document).scrollTop();
if (yScrollPos > 200) { //200 here to offset my fixed header (50px) and top banner (150px)
$('#searchBarDiv').css('position', 'fixed');
$('#searchBarDiv').css('width', '100%');
$('#searchBarDiv').css('top', '50px'); //50 for fixed header
}
}
},250,true));
Требования: JQuery mobile необходим для работы функций startroll и stopcroll.
Debounce включен, чтобы сгладить любую задержку, создаваемую липким элементом.
Проверено в iOS10.