14

我正在为网站使用无限滚动 jquery 插件(https://github.com/paulirish/infinite-scroll

一切都很好,除了我的页面是搜索所以......发生的事情是:

1)您进入页面,浏览器会自动定位您并返回您周围的项目列表(例如条形图)......需要无限滚动以避免此列表分页。直到这里一切正常……除了我可以到达“无限页的末尾”和插件从滚动中“解除绑定”本身的事实。

2)现在....当您想在输入文本中手动插入地址时,您可以随意...您写下您的地址,然后按回车...并使用 ajax(无页面刷新).. .我会寻找纬度/经度,找到地址,更改无限滚动的导航链接....而且,我觉得很愚蠢,但我想不出“重新激活”或“重新绑定”的方法” 事件的插件......所以我的“新搜索结果”没有新的“无限滚动”实例......

(页面“拆分”正确并正确返回一个尝试更改“page = NUM​​BER”的json)

这是控制台中发生的事情:

["math:", 0, 468]
jquery.infinitescroll.min.js:20["heading into ajax", 
Array[2]
    0 : "/ajax/getCoworkings/?page="
    1 : "&latitude=52.5234051&longitude=13.4113999&distance=12"
    length : 2
    __proto__ : Array[0]
]
jquery.infinitescroll.min.js:20["Using JSON via $.ajax() method"]
jquery.infinitescroll.min.js:20["Error", "end"]
jquery.infinitescroll.min.js:20["Binding", "unbind"]

在“取消绑定”之后,我无法再次绑定它,因此在我的下一个搜索结果中无限滚动......

4

8 回答 8

28

无限滚动通过 将其所有实例数据存储在元素本身$.data,因此删除该实例数据是完全重置无限滚动的唯一可靠方法。

这两行应该可以彻底摧毁无限滚动。

$elem.infinitescroll('destroy');
$elem.data('infinitescroll', null);

// 现在无限滚动可以正常重新初始化,而不会与前一个实例产生任何冲突或杂乱无章。

请注意,截至 2012 年 6 月,最新版本的 jquery.infinitescroll (v2.0) 之前的答案都不适用于我

于 2012-06-22T07:29:37.997 回答
5

解决了。

我已经添加:

if (xhr == 'destroy') {
    $.removeData(this.element[0]);
}

在功能上

_error: function infscr_error(xhr) {

在第 228 行。

可能这不是最好的方法,但这正是我所需要的。

我现在所做的基本上就是您的建议:

1.

$("#myelement").infinitescroll("destroy");

2.

$("#myelement").infinitescroll(WHATEVER_SETTINGS);

...无需修改“pathParse”值
,但那是因为我
之前使用 jQuery 修改了选择器(next/nav)。

于 2011-10-29T15:15:59.850 回答
3

这里没有提到,但是(无论如何在我的 Infinite Scroll 版本中)您还必须设置两个变量以使 InfiniteScroll 的重新实例化才能工作。您还必须重新绑定它。这是代码:

$('#cardContainer').infinitescroll('destroy'); // Destroy

// Undestroy
$('#myContainer').infinitescroll({                      
    state: {                                              
        isDestroyed: false,
        isDone: false                           
}
});

InitInfiniteScroll(); // This is a wrapper for the standard initialization you need

// Re-initialize
$('#myContainer').infinitescroll('bind');
于 2012-03-21T16:46:45.023 回答
3

在尝试其他解决方案无济于事后,这对我有用:

$(window).unbind('.infscr');

参考文档的 1/4:http: //www.infinite-scroll.com/infinite-scroll-jquery-plugin/

于 2014-01-21T01:43:47.700 回答
2

我不得不做类似的事情,因为我的代码根据用户操作更新目标 url,而不仅仅是依靠计数器。

我最终实现了以下重置方法,然后我可以使用 $container('reset'); 调用它。

reset: function infrscr_reset() {
        this.options.state.isDone = false;
        this.options.state.isDuringAjax = false; // I needed this, others may not
        this._resetmsg();
        this._binding('bind');
    },

我还实现了一个私有方法来重置悬停消息,否则它将继续给出“没有更多页面”通知。

_resetmsg: function infscr_resetmsg() {
        var opts = this.options;
        opts.loading.msg = $('<div id="infscr-loading"><img alt="Loading..." src="' + opts.loading.img + '" /><div>' + opts.loading.msgText + '</div></div>');
        this._debug('Reset loading message');
    },
于 2012-05-17T21:44:02.930 回答
1

假设您创建了无限滚动,例如:

//This will initiate with default values for example purpose
$("#myelement").infinitescroll();

你能不能简单地完全销毁实例:

$("#myelement").infinitescroll("destroy");
//Reset anything else that may cause the page to blow up here
//And then create a new instance with different path variables:
//Note, obviously you'll be initializing it with custom selectors/settings etc so include those as well
$("#myelement").infinitescroll({pathParse:["/ajax/getCoworkings/?page=","&latitude=52.5234051&longitude=13.4113999&distance=12"]});

本质上,如果您不定义 pathParse,脚本会尝试自行解决。如果你这样做,那么它会使用你提供的东西。它不是很优雅,比任何东西都更像是一种黑客攻击,但目前无限滚动并不严格支持更改 pathParse。

于 2011-10-29T12:10:52.263 回答
1

第 3 项)

if (xhr == 'destroy') {
    $.removeData(this.element[0]);

}

也没有工作。至少使用最新版本。砌体抱怨“无法在初始化之前调用砌体上的方法;试图调用方法“重新加载”

$container.css('display','none');
$container.html(htmlOutput).imagesLoaded( function(){
             $container.css('display','block');
             $container.masonry('reload');
});

// I have to do this in order to "reset" the stage
$container.infinitescroll('destroy'); // Destroy

// Undestroy
$container.infinitescroll({                      
   state: {
      isDestroyed: false,
      isDone: false
   }
});

// Init.
$container.infinitescroll({
   navSelector  : '#page-nav',    // selector for the paged navigation 
   nextSelector : '#page-nav a',  // selector for the NEXT link (to page 2)
   itemSelector : '.tile',     // selector for all items you'll retrieve
   loading: {
     finishedMsg: '',
     msgText: '',
     img: url + 'img/ajax-loader.gif'
   }
},
// trigger Masonry as a callback
function( newElements ) {
    // hide new items while they are loading
    var $newElems = $( newElements ).css({ opacity: 0 });
    // ensure that images load before adding to masonry layout
    $newElems.imagesLoaded(function(){
        // show elems now they're ready
        $newElems.animate({ opacity: 1 });
        $container.append($newElems).masonry('appended', $newElems, true); 
    });
 }
);

// Re-initialize
$container.infinitescroll('bind');
于 2012-05-11T02:37:38.853 回答
0

您只需将以下代码添加到无限滚动声明中即可做到这一点。

errorCallback : function() {
    isc.getContainer().infinitescroll('destroy');
    $.removeData(this);
},

注意不在infinitescroll.js 文件中,它应该在您的自定义无限滚动声明中。

于 2014-01-13T08:26:08.343 回答