InfiniteScroll + isotope : loadNextPage 直到项目计数大于 3
InfiniteScroll + isotope : loadNextPage until item count greater than 3
我试图在单击同位素过滤器按钮时执行 while 循环,一切正常,直到我将我的两个函数:loadNextPage 和 count items 放入 while 循环中,浏览器陷入无限循环,即使每次循环 运行s 时都应该更新 cnt 变量。
我希望这两个函数 运行 直到 cnt 变量达到 4
$('.filter-button-group').on('click', 'button', function () {
var filterValue = $(this).attr('data-filter');
$grid.isotope({filter: filterValue});
cnt = 0;
while ( cnt < 4 ) {
loadPageIso();
countIsoItems();
}
function loadPageIso() {
$grid.infiniteScroll('loadNextPage');
}
function countIsoItems() {
$grid.on( 'append.infiniteScroll', function() {
cnt = iso.filteredItems.length;
});
}
});
整个同位素+infiniteScroll代码都包裹在一个
里面
jQuery( document ).ready( function( $ ) {
//code is here
});
我猜这可能与问题有关,直到我在 while 循环中包装我的两个函数,一切都按预期工作。
我找到了一个更好的方法,而不是使用 while 循环,我使用了一个 self-call 函数循环并等待正确的回调,这里是完整的代码以防你偶然发现这个 post 并正在寻找完整的解决方案
jQuery( document ).ready( function( $ ) {
$('.grid').imagesLoaded(function () {
var $grid = $('.actus-grid');
$grid.isotope({
itemSelector: '.actus-grid-item',
percentPosition: true,
masonry: {
columnWidth: '.actus-grid-item',
}
});
var iso = $grid.data('isotope');
$grid.infiniteScroll({
path: '.nav-previous > a',
append: '.actus-grid-item',
outlayer: iso
});
// filter items on button click
$('.filter-button-group').on('click', 'button', function () {
var filterValue = $(this).attr('data-filter');
$grid.isotope({filter: filterValue});
//load next page if filtered items count is inferior to post per page setting
loadMoreLoop();
function loadMoreLoop() {
loadPageIso();
countIsoItems();
//wait for right callback
$grid.on( 'append.infiniteScroll', function() {
if (cnt < 3) loadMoreLoop();
});
}
//load next page
function loadPageIso() {
$grid.infiniteScroll('loadNextPage');
//decrement z-index property of items to prevent overlapping while isotope filtering
$('.actus-grid-item').each(function(i){
$(this).css('z-index', 999 - i);
});
}
// Count items visible in grid
function countIsoItems() {
cnt = iso.filteredItems.length;
}
});
function updateFilterCount() {
cnt = iso.filteredItems.length;
}
updateFilterCount();
});
});
我试图在单击同位素过滤器按钮时执行 while 循环,一切正常,直到我将我的两个函数:loadNextPage 和 count items 放入 while 循环中,浏览器陷入无限循环,即使每次循环 运行s 时都应该更新 cnt 变量。
我希望这两个函数 运行 直到 cnt 变量达到 4
$('.filter-button-group').on('click', 'button', function () {
var filterValue = $(this).attr('data-filter');
$grid.isotope({filter: filterValue});
cnt = 0;
while ( cnt < 4 ) {
loadPageIso();
countIsoItems();
}
function loadPageIso() {
$grid.infiniteScroll('loadNextPage');
}
function countIsoItems() {
$grid.on( 'append.infiniteScroll', function() {
cnt = iso.filteredItems.length;
});
}
});
整个同位素+infiniteScroll代码都包裹在一个
里面jQuery( document ).ready( function( $ ) {
//code is here
});
我猜这可能与问题有关,直到我在 while 循环中包装我的两个函数,一切都按预期工作。
我找到了一个更好的方法,而不是使用 while 循环,我使用了一个 self-call 函数循环并等待正确的回调,这里是完整的代码以防你偶然发现这个 post 并正在寻找完整的解决方案
jQuery( document ).ready( function( $ ) {
$('.grid').imagesLoaded(function () {
var $grid = $('.actus-grid');
$grid.isotope({
itemSelector: '.actus-grid-item',
percentPosition: true,
masonry: {
columnWidth: '.actus-grid-item',
}
});
var iso = $grid.data('isotope');
$grid.infiniteScroll({
path: '.nav-previous > a',
append: '.actus-grid-item',
outlayer: iso
});
// filter items on button click
$('.filter-button-group').on('click', 'button', function () {
var filterValue = $(this).attr('data-filter');
$grid.isotope({filter: filterValue});
//load next page if filtered items count is inferior to post per page setting
loadMoreLoop();
function loadMoreLoop() {
loadPageIso();
countIsoItems();
//wait for right callback
$grid.on( 'append.infiniteScroll', function() {
if (cnt < 3) loadMoreLoop();
});
}
//load next page
function loadPageIso() {
$grid.infiniteScroll('loadNextPage');
//decrement z-index property of items to prevent overlapping while isotope filtering
$('.actus-grid-item').each(function(i){
$(this).css('z-index', 999 - i);
});
}
// Count items visible in grid
function countIsoItems() {
cnt = iso.filteredItems.length;
}
});
function updateFilterCount() {
cnt = iso.filteredItems.length;
}
updateFilterCount();
});
});