#javascript #php #jquery #ajax
#javascript #php #jquery #ajax
Вопрос:
Я пытаюсь выполнить загрузку содержимого ajax при прокрутке страницы и застреваю в некоторых частях.
Вот мой PHP-код:
//Fetch Total Record
$objDB = new DB;
$fetchCount = $objDB
->setStoredProc( 'petContestFetchImagesCount' )
->execStoredProc()
->parseXML();
$fetchCount = $fetchCount->data;
//Total number of results
$totalResults = $fetchCount->totalRecords;
//Records per page
$limit = 5;
//Total number of pages / calls we will make based on the results
$pages = ceil($totalResults/$limit);
//What page are we currently on?
$page = min($pages, filter_input(INPUT_GET, 'page', FILTER_VALIDATE_INT, array(
'options' => array(
'default' => 1,
'min_range' => 1,
),
)));
$offset = ($page - 1) * $limit;
// Some information to display to the user
$start = $offset 1;
$end = min(($offset $limit), $total);
$nextlink = ($page < $pages) ? '<nav id="page_nav"><a href="?page=' . ($page 1) . '"></a></nav>' : '';
//Fetch Entries
$objDB = new DB;
$submissions = $objDB
->setStoredProc( 'petContestFetchImages' )
->setParam("offset", $offset )
->setParam("rows", $limit )
->execStoredProc()
->parseXML();
С этого момента он знает количество сообщений, которые ему нужны, создает разбивку на страницы и т. Д.
Теперь я использую плагин infinateScroll и настраиваю его следующим образом:
var $container = $('[name=posts]')
$($container).isotope({
itemSelector: '.item',
layoutMode: 'masonry',
masonry: {
columnWidth: 10
}
})
$container.infinitescroll({
navSelector: '#page_nav',
nextSelector: '#page_nav a',
itemSelector: '.item',
pixelsFromNavToBottom: -Math.round($(window).height() * 0.9),
bufferPx: Math.round($(window).height() * 0.9),
loading: {
msgText: $container.attr("data-loading-message"),
finishedMsg: $container.attr("data-no-more-translators")
}
}, function(newElements) {
$container.isotope('appended', $(newElements))
})
})
Когда я прокручиваю страницу вниз, содержимое загружается нормально. Однако он переходит к последней записи и каждый раз продолжает загружать только последнюю запись. Если я прокручиваю вверх, а затем снова вниз, он загружает только последнюю запись.
Я протестировал свою хранимую процедуру, и она даже не выдает результатов, когда я говорю начать с записи 11 (последний результат) и даю мне еще 5, она не возвращает никаких данных.
Не уверен, чего мне здесь не хватает, но он не должен загружать больше записей после нажатия на последнюю.
Я использовал это для справки: http://blog .lingohub.com/developers/2013/09/endless-pages-scrolling-masonry /
Редактировать:
Это изменение на стороне клиента работает, однако оно не предотвращает запуск вызова ajax, просто добавляя любые результаты, которые он выполняет нормально.
var tmp = 1;
var pages = '<?php echo $pages; ?>
$container.infinitescroll({
navSelector: '#page_nav',
nextSelector: '#page_nav a',
itemSelector: '.item',
pixelsFromNavToBottom: -Math.round($(window).height() * 0.9),
bufferPx: Math.round($(window).height() * 0.9),
loading: {
msgText: $container.attr("data-loading-message"),
finishedMsg: $container.attr("data-no-more-translators")
}
}, function(newElements) {
if(tmp < pages){
$container.isotope('appended', $(newElements))
}
tmp ;
})
})
Комментарии:
1. Я думаю, что это обходное решение — лучшее, что вы можете получить. Причина в соответствии с документацией плагина. «В настоящее время нет возможности отменить или отказаться от такого поведения». Может быть, просто поставьте оповещение («Вы дошли до конца»), чтобы у пользователя была какая-то обратная связь, или создайте div, который вы $(‘#yourdiv’).show() if (tmp!<страницы)
2. Что ж, я ценю вашу помощь! Возможно, мне придется изучить другой метод выполнения этого или другого плагина, если на то пошло
Ответ №1:
Я бы подумал, что вы просто проверили, достигли ли вы максимального количества страниц?
if($page<$pages){
//Fetch Entries
$objDB = new DB;
$submissions = $objDB
->setStoredProc( 'petContestFetchImages' )
->setParam("offset", $offset )
->setParam("rows", $limit )
->execStoredProc()
->parseXML();
}
Затем измените nextlink, чтобы отобразить одну дополнительную ссылку выше переменной $pages. Вот так…
$nextlink = ($page <= $pages) ? '<nav id="page_nav"><a href="?page=' . ($page 1) . '"></a></nav>' : '';
Комментарии:
1. Это вроде как сработало, перестало показывать одну и ту же запись каждый раз, однако теперь последняя запись вообще не отображается. У меня есть 11 записей по 5 на страницу, которые приходят. Итак, всего 3 страницы. Он загружает 3 страницы, но на последней странице нет никакого содержимого, потому что этот вызов базы данных никогда не выполняется для извлечения содержимого
2. Хм…. ну, если вы поместите ($page<=$pages), это, вероятно, в конечном итоге будет делать то же самое, что и раньше. Поэтому вам, возможно, придется выполнить какую-то проверку на стороне клиента. Где вы храните количество страниц, а затем при прокрутке вы увеличиваете его и проверяете. Или что-то в этом роде
3. Да, я попробовал <=, чтобы увидеть, и он продолжал делать то же самое. Я попробую!
4. Попробуйте мою правку 🙂 Это может сделать это. Просто повторите одну дополнительную ссылку выше, чем $pages, с помощью $nextlink = ($page<=$pages)
5. Странно, та же проблема! Я понимаю, что вы думали по этому поводу. Он вызывает ajax-вызов страницы 3, но не загружает туда содержимое. Он всегда загружается
index.php
, но он добавляет к нему номер страницы, поэтому я думаю, что он попадаетindex.php?page=3
, а затем, посколькуif($page<$pages){
это неверно, он не извлекает содержимое страницы 3