javascript - JQuery 滚动操作重复了结果

标签 javascript jquery ajax

当页面到达末尾时,我必须通过 ajax 调用加载更多产品。

<script>
$(window).scroll(function() {

    if ($(document).height() <= ($(window).height() + $(window).scrollTop())) {
        var _token = '{{ csrf_token() }}';
        var theurl = 'homePaginate';
        console.log(skip_arr);
        $.ajax({
            type: 'post',
            url: theurl,
            data:{_token:_token,page:page,avoid:skip_arr},
            dataType: 'json',
            success: function (data) {
                page+=1;
                printProducts(data,false,true,true)

            }
        });
    }
});

我使用一个函数循环我的产品来打印它,在ajax调用中我发送号,有时我需要避免显示某些产品

function printProducts(data,is_ad,get_void,is_animate) {
    console.log(page);
    for (i=0;i< data.length;i++){
        var id = '#col'+columnIndex;

        columnIndex++;
        if (columnIndex == 6){
            columnIndex = 1;
        }
        var stars = '';

        for(star = 0 ;star < Math.floor(data[i]['rate']);star++){
            stars += '<i class="fas fa-star"></i>';
        }
        var fraction = data[i]['rate']%1;
        if (fraction > 0 ){
            stars += '<i class="fas fa-star-half-alt"></i>';
            for(star = 0 ;star < 4-data[i]['rate'];star++){
                stars += '<i class="far fa-star"></i>';
            }

        }else{
            for(star = 0 ;star < 5-data[i]['rate'];star++){
                stars += '<i class="far fa-star"></i>';
            }
        }
        var discount ='';
        if (data[i]['runningDiscount']){
            discount = '<span class="discount-tag">'+data[i]['discount']['valuePercentage']+'% Off</span>';
        }
        if(get_void){
            skip_arr.push(data[i]['id']);
        }

        var isFavorite = data[i]['isFavourite']?'fas':'far';

        var image = '{{ url('') }}'+'/'+data[i]["image"];

        var url = '{{ url('product') }}'+'/'+data[i]["id"];

        var quick_cart = '';
        if (data[i]["quickCart"] === true){
            quick_cart = 'class="quick-add" data-item-id="'+data[i]['item']["id"]+'"';
        }else{
            quick_cart = 'href="'+url+'"';
        }

        var ad = '';
        if (is_ad) ad = ' <span class="ad">Ad</span>';

        var animate = '';
        if(is_animate){
            animate = ' animated  fadeInDown ';
        }
        var product = '<div class="col-xs-12 product'+animate+'" data-id="'+id+'">\n' +
            '                                <div class="row product-body">\n' +ad+ // print ad tag
            '                                    <span class="actions">\n' +
            '                                        <a '+quick_cart+'>\n' +
            '                                            <img src="{{ asset("site_assets/img/cart.png") }}" class="product-cart">\n' +
            '                                        </a>\n' +
            '                                        <a>\n' +
            '                                            <i class="'+isFavorite+' fa-heart shoptizer-color" data-id="'+data[i]["id"]+'"></i>\n' +
            '                                        </a>\n' +
            '                                    </span>\n' +
            '                                    <span class="view-icon" data-id='+ data[i]["id"]+'>\n' +
            '                                            <img src="{{ asset("site_assets/img/eye.png") }}">\n' +
            '                                    </span>\n' +discount+
            '                                <img class="img-fluid" src="'+image+'">\n' +
            '                                <a href='+url+' class="product-link"></a>'+
            '                            </div>\n' +
            '                            <div class="col-sm-12">\n' +
            '                                <span>'+data[i]['name']+' </span>\n' +
            '                                <h6 class="shoptizer-color price">'+data[i]['price']+' EGP</h6>\n' +
            '                            </div>\n' +
            '                            <div class="col-xs-12 p-rate">\n' +stars+'</div>\n' +
            '                        </div>';
        $(id).append(product);
    }
}

所以当我到达最后时它工作正常,但是在测试客户端上下滚动时,所以我在两行中得到了重复的产品。这是为什么?我该如何预防?

我认为问题出在$(window).scroll()!!

最佳答案

问题出在我的ajax调用中,我在成功函数上更新页面,因此如果用户在请求响应之前两次到达底部,它会复制打印的数据,因为它发送相同的页面,因此相同的响应。

所以我的解决方案是更新页面

$(window).scroll(function() {
    if ($(document).height() <= ($(window).height() + $(window).scrollTop())) {
        var _token = '{{ csrf_token() }}';
        var theurl = 'homePaginate';
        $.ajax({
            type: 'post',
            url: theurl,

            data:{_token:_token,page:page,avoid:skip_arr},
            dataType: 'json',
            success: function (data) {         
                printProducts(data,false,true,true)
            }
        });
      page+=1;
    }
});

关于javascript - JQuery 滚动操作重复了结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51959925/

相关文章:

javascript - 构建 n 进制数字数组的通用公式

jquery - 更改 CSS Div 悬停区域

javascript - 单击后如何禁用标记上的单击事件

javascript - JS正则表达式匹配具有特定特殊字符且没有连续空格的用户名

javascript - 如何使用 JavaScript 打印对象数组

javascript - Angular 4 不向服务器发送 cookie

php - Laravel Chained Select 无法加载资源 : the server responded with a status of 500

javascript - 需要我的 jQuery 选项卡在事件且已经打开时不关闭

javascript - keyup(function()) ajax 请求延迟 - jQuery

jquery - 状态成功时的 Ajax 用户通知