端点在无限滚动中被调用两次
Endpoint being called twice in Infinite scroll
我正在使用 Meta Fizzy Infinite Scroll 将指定容器用作无限滚动容器。我有两个按钮,一个按钮的端点与第二个按钮不同。单击其中一个按钮时,无限滚动容器将填充。
<button data-api="/api/comments/1">First button</button>
<button data-api="/api/comments/2">Second button</button>
<div class="comments-container"></div>
假设用户点击了第一个按钮,然后又点击了第二个按钮。第一次正常调用infinitescroll函数。在第二次单击按钮时,我们销毁第一个实例并重置无限滚动容器,以销毁前一个实例的方式。
function CreateInfiniteScroll(endPoint) {
let $container = $(endPoint.getFeedContainer()).infiniteScroll({
path: function () {
return endPoint.getEndPoint();
},
// load response as flat text
responseType: 'text',
status: '.scroll-status',
history: false,
});
$container.on('load.infiniteScroll', function (event, response) {
let data = JSON.parse(response);
console.log(data);
}
}
当点击第二个按钮时,我运行下面的代码:
$(".comments-container").infiniteScroll('destroy');
$(".comments-container").removeData('infiniteScroll');
CreateInfiniteScroll(new EndPoints(buttonEndpoint, ".comments-container"));
但是,我在第二次单击按钮时收到了重复的帖子。控制台的输出发生了两次,即使我只调用了一次该函数。怎么了?我怎样才能使 infiniteScroll 重置 100%?
您正在订阅同一元素两次,请参阅这部分:
$container.on('load.infiniteScroll', function (event, response) {
let data = JSON.parse(response);
console.log(data);
});
这意味着每次调用 CreateInfiniteScroll
时,都会将 load.infiniteScroll
事件的事件处理程序添加到 div 和 class .comments-container
。
您可以在重新附加新的事件处理程序之前删除其他事件处理程序,就像在 CreateInfiniteScroll
函数中那样:
$container.off('load.infiniteScroll'); // Remove all event handlers first
$container.on('load.infiniteScroll', function (event, response) {
let data = JSON.parse(response);
console.log(data);
});
或者您可以将其添加到您的按钮点击代码中:
// Clean up
$(".comments-container").infiniteScroll('destroy');
$(".comments-container").removeData('infiniteScroll');
$(".comments-container").off('load.infiniteScroll'); // remove all other events handlers
// Reinstantiate infinite scroll
CreateInfiniteScroll(new EndPoints(buttonEndpoint, ".comments-container"));
详细了解 JQuery 的 .off
函数 here。
我正在使用 Meta Fizzy Infinite Scroll 将指定容器用作无限滚动容器。我有两个按钮,一个按钮的端点与第二个按钮不同。单击其中一个按钮时,无限滚动容器将填充。
<button data-api="/api/comments/1">First button</button>
<button data-api="/api/comments/2">Second button</button>
<div class="comments-container"></div>
假设用户点击了第一个按钮,然后又点击了第二个按钮。第一次正常调用infinitescroll函数。在第二次单击按钮时,我们销毁第一个实例并重置无限滚动容器,以销毁前一个实例的方式。
function CreateInfiniteScroll(endPoint) {
let $container = $(endPoint.getFeedContainer()).infiniteScroll({
path: function () {
return endPoint.getEndPoint();
},
// load response as flat text
responseType: 'text',
status: '.scroll-status',
history: false,
});
$container.on('load.infiniteScroll', function (event, response) {
let data = JSON.parse(response);
console.log(data);
}
}
当点击第二个按钮时,我运行下面的代码:
$(".comments-container").infiniteScroll('destroy');
$(".comments-container").removeData('infiniteScroll');
CreateInfiniteScroll(new EndPoints(buttonEndpoint, ".comments-container"));
但是,我在第二次单击按钮时收到了重复的帖子。控制台的输出发生了两次,即使我只调用了一次该函数。怎么了?我怎样才能使 infiniteScroll 重置 100%?
您正在订阅同一元素两次,请参阅这部分:
$container.on('load.infiniteScroll', function (event, response) {
let data = JSON.parse(response);
console.log(data);
});
这意味着每次调用 CreateInfiniteScroll
时,都会将 load.infiniteScroll
事件的事件处理程序添加到 div 和 class .comments-container
。
您可以在重新附加新的事件处理程序之前删除其他事件处理程序,就像在 CreateInfiniteScroll
函数中那样:
$container.off('load.infiniteScroll'); // Remove all event handlers first
$container.on('load.infiniteScroll', function (event, response) {
let data = JSON.parse(response);
console.log(data);
});
或者您可以将其添加到您的按钮点击代码中:
// Clean up
$(".comments-container").infiniteScroll('destroy');
$(".comments-container").removeData('infiniteScroll');
$(".comments-container").off('load.infiniteScroll'); // remove all other events handlers
// Reinstantiate infinite scroll
CreateInfiniteScroll(new EndPoints(buttonEndpoint, ".comments-container"));
详细了解 JQuery 的 .off
函数 here。