Свиток обнаружения JQuery в нижней части
Я хочу достичь загрузки контента, когда пользователь прокручивается в нижней части страницы.
У меня проблема. Он отлично работает на настольных браузерах, но не на мобильных устройствах. Я внедрил грязное исправление, чтобы заставить его работать на iPhone, но не оптимально, поскольку он не будет работать на мобильных устройствах другого размера.
Мой сайт www.cristianrgreco.com, прокрутите вниз, чтобы увидеть эффект в действии
Проблема заключается в добавлении прокрутки, а высота не равна высоте на мобильных устройствах, в то время как они работают на настольных браузерах.
Есть ли способ обнаружения для мобильных браузеров?
Спасибо заранее.
Ниже приведен код:
$(document).ready(function () {
$(".main").hide().filter(":lt(3)").show();
if ($(document).height() == $(window).height()) {
// Populate screen with content
}
else if (navigator.userAgent.match(/Android/i) || navigator.userAgent.match(/webOS/i) || navigator.userAgent.match(/iPhone/i) || navigator.userAgent.match(/iPod/i)) {
window.onscroll = function () {
if ($(document).height() - $(window).scrollTop() <= 1278) {
// At the moment only works on iPhone
}
}
}
else {
$(window).scroll(function () {
if ($(window).scrollTop() + $(window).height() >= $(document).height()) {
// Works perfect for desktop browsers
}
})
}
})
Ответы
Ответ 1
Для тех, кто смотрит здесь позже, я решил это, добавив height=device-height
в тег просмотра meta
:
<meta name="viewport" content="width=device-width, height=device-height, initial-scale=1.0">
Затем вы можете продолжить, используя $(document).scroll(function(){});
Это работало с iOS 5
Ответ 2
Если вы можете, вы действительно должны избегать попытки набрать точный номер.
Используя вышеописанную функцию Stelok, вы можете протестировать следующим образом:
if ($win.height() + $win.scrollTop() > (getDocumentHeight()-10)) {
Это немного мягче - пользователь может не иметь прокрутки до последнего последнего пикселя, но думает, что он внизу.
Ответ 3
Улучшенная версия кода jQuery для кода
var scrollRefresh = {
pastTop: false,
pastBottom: false,
previous: 0,
bottom: function(callback) {
var pBottom = $(window).height() + $(window).scrollTop() >= $(document).height();
if(!this.pastBottom && pBottom) {
callback($(window).height() + $(window).scrollTop());
this.pastBottom = true;
} else {
if(!pBottom) this.pastBottom = false;
}
this.previous = $(window).scrollTop();
},
top: function(callback) {
var pTop = $(window).scrollTop() < this.scrollPrevious && $(window).scrollTop <= 0;
if(!this.pastTop && pTop) {
callback($(window).scrollTop());
this.pastTop = true;
} else {
if(!pTop) this.pastTop = false;
}
this.previous = $(window).scrollTop();
}
}
$(window).scroll(function() {
scrollRefresh.top(function(pos) {
console.log("Loading top. " + pos);
alert("scrolled to top"); //You should delete this line
});
scrollRefresh.bottom(function(pos) {
console.log("Loading bottom. " + pos);
alert("scrolled to bottom"); //You should delete this line
});
});
Ответ 4
Пуленепробиваемый способ получения высоты документа во всех браузерах:
function getDocumentHeight() {
return Math.max(
Math.max(document.body.scrollHeight, document.documentElement.scrollHeight),
Math.max(document.body.offsetHeight, document.documentElement.offsetHeight),
Math.max(document.body.clientHeight, document.documentElement.clientHeight)
);
}
Ответ 5
Это то, что сработало для меня:
(window.innerHeight + window.scrollY) == $(document).height()
Найдено здесь:
Javascript: как определить, прокручивается ли окно браузера снизу?
Ответ 6
Использование jquery и Strelok getDocumentHeight()
ниже (приветствия!) Я обнаружил, что следующее работает очень хорошо. Тестирование на равенство не работало для меня, поскольку iPhone только зарегистрировал значение прокрутки в конце слайда, которое было на самом деле больше высоты документа:
$(window).scroll(function () {
var docHeight = getDocumentHeight();
if ($(window).scrollTop() + $(window).height() >= docHeight) {
// Do stuff
}
});
Ответ 7
Добавлен ли метатег для iphones, который устанавливает размер содержимого в область просмотра телефона?
<meta name="viewport" content="width=device-width; initial-scale=1.0; maximum-scale=1.0;">
EDIT:
Итак, я попробовал это на своем телефоне (андроид, пряники), и проблема была не столько в том, что код не работал, а в том, что отображаемый контент не заставляет прокручивать страницу. Как только я увеличил масштаб и прокрутил вниз более динамически загруженный контент. Вы можете попробовать добавить контент до тех пор, пока содержимое не будет больше $(window).height();
Ответ 8
вы также можете использовать бесконечный плагин прокрутки: https://github.com/fredwu/jquery-endless-scroll
https://github.com/paulirish/infinite-scroll
Я использую бесконечный свиток, и он отлично работает на моем ноутбуке и iphone.
Ответ 9
Вот совокупность других ответов, которые очень хорошо работают для меня. Он может быть написан как плагин jQuery когда-нибудь.
// Handles scrolling past the window up or down to refresh or load more data.
var scrolledPastTop = false;
var scrolledPastBottom = false;
var scrollPrevious = 0;
function getDocumentHeight() {
return Math.max(
Math.max(document.body.scrollHeight, document.documentElement.scrollHeight),
Math.max(document.body.offsetHeight, document.documentElement.offsetHeight),
Math.max(document.body.clientHeight, document.documentElement.clientHeight)
);
}
function bottomScrollRefresh(callback) {
var pastBottom = $window.height() + $window.scrollTop() > getDocumentHeight();
if(!scrolledPastBottom && pastBottom) {
callback($window.height() + $window.scrollTop());
scrolledPastBottom = true;
} else {
if(!pastBottom) scrolledPastBottom = false;
}
scrollPrevious = $window.scrollTop();
}
function topScrollRefresh(callback) {
var pastTop = $window.scrollTop() < scrollPrevious && $window.scrollTop() <= 0;
if(!scrolledPastTop && pastTop) {
callback($window.scrollTop());
scrolledPastTop = true;
} else {
if(!pastTop) scrolledPastTop = false;
}
scrollPrevious = $window.scrollTop();
}
Чтобы использовать это в своем коде, добавьте что-то вроде этого:
window.onscroll = function() {
topScrollRefresh(function(pos) {
console.log("Loading top. " + pos);
});
bottomScrollRefresh(function(pos) {
console.log("Loading bottom. " + pos);
});
};
Отлично подходит для моего приложения PhoneGap/Cordova.
Ответ 10
Хотя вопрос был задан 5 лет назад, все же это более чем актуально в сегодняшнем контексте UI/UX. И я хотел бы добавить свои два цента.
var element = document.getElementById('flux');
if (element.scrollHeight - element.scrollTop === element.clientHeight)
{
// element is at the end of its scroll, load more content
}
Источник: https://developer.mozilla.org/en-US/docs/Web/API/Element/scrollHeight#Determine_if_an_element_has_been_totally_scrolled