0

我的网站上有一个显示销售列表的页面,用户可以按原样向下滚动,也可以应用过滤器。如果用户选择不应用任何过滤器并按原样向下滚动,它就可以完美运行。当他们选择应用过滤器时,我会更新无限滚动实例的参数,以便加载更多过滤后的结果。然后,当他们第一次滚动时,插件尝试一次加载 2 个页面,然后它崩溃并自行解除绑定。

这是我最初用来应用无限滚动的函数:

function initInfiniteScroll( $container, flag ){

//Initialize the plugin
console.log('Initializing infinite scroll');
$container.infinitescroll({
    navSelector  : "#paginationControl",
    nextSelector : "#paginationControl a#next",
    itemSelector : "#json_pen",
    bufferPx : 200,
    animate : false,
    debug : true,
    loading : {
        img : "/includes/gif/loading.gif",
        finishedMsg : "No more stuff.",
        msgText : ""},
    errorCallback : function(){
        $("#loader.grid").fadeOut('normal');
    }
    },
    function( entry_json ){
    /* I'm loading a block of JSON to throw to Backbone instead of 
        grabbing html. */
        console.log( 'Adding more stuff' );

        //Parse the entries
        var entries = JSON.parse( $(entry_json).html() );

        //Throw them to the grid
        Grid.addPage( entries );

    });

//Mark it as having been applied
$container.addClass(flag);
}

这是更新无限滚动的代码:

//Replace the pagination controls
$("#main #paginationControl").html( $("#listing_pen #paginationControl").html() );
var nextPage = $('#main #paginationControl #next').attr('href');
var basePath = nextPage.slice( 0, nextPage.length - 2 ); //Cut off the last character

//Overwrite path
$("#grid").infinitescroll({ state : { currPage : 1 }, 
                            path : [ basePath+'/', ' #json_pen' ] }); 

调用此方法后,只要用户尝试滚动,接下来的两个页面就会尝试同时加载并使插件崩溃。我放入了一些日志语句以试图说明发生了什么。这是控制台日志:

loading /organize/10002/listings/all/10001/1001v/all/all/all 
Updating the page scheme 
initializing masonry 
["math:", 1274, 1635] 
in scroll calling the retrieve function 
defined begin ajax 
setting during ajax to true 
["heading into ajax", Array[2]]
retrieving /organize/10002/listings/all/10001/1001v/all/all/all/2 #json_pen
["Using HTML via .load() method"] 
["heading into ajax", Array[2]]
retrieving /organize/10002/listings/all/10001/1001v/all/all/all/3 #json_pen 
["Using HTML via .load() method"] 
["Error", "end"] 
["Binding", "unbind"]      

据我所知,插件中的滚动函数似乎调用了一次检索,但检索调用了两次 beginAjax。有谁知道这里会发生什么?

4

1 回答 1

0

该问题不是由插件本身引起的。定义函数后opts.loading.start,它会显示带有 jQ​​uery 函数调用的加载微调器,然后附加一个回调函数,该函数调用该beginAjax函数以检索下一页结果。我对此稍作修改,以:

opts.loading.start = opts.loading.start || function() {

            $(opts.navSelector).hide();
            $('#loader').show(opts.loading.speed, function () {
                beginAjax(opts);
            });
        };

当我抓取下一页结果时,它就发生了,我也在抓取它的加载器。我不知道这是可能的,但它$('#loader')与原始加载器和检索页面中的加载器匹配,因此回调执行了两次,每个加载器执行一次。我:first在选择器中添加了一个,现在它工作得很好。

我想出这一点的方法是用 console.log 语句混淆检索函数,然后以相同的方式记录滚动函数以发现两者都只被调用一次。从那里可以相对简单地确定是 beginAjax 函数被调用了两次,并且快速查看 jQuery 文档解释了原因。希望现在这个答案对其他人来说不会完全没用。

于 2013-09-24T14:56:56.080 回答