【问题标题】:increment counter not working after ajax callbackajax回调后增量计数器不起作用
【发布时间】:2021-04-07 21:36:11
【问题描述】:

我打算使用 Ajax 无限滚动从数据库中加载更多项目。当我使用 id=results 滚动到 div 的底部时,ajax 第一次工作正常,并从数据库中追加第 21-31 行。注意:offset = 20 和limit = 10。offset 设置为回调后变为30(即offset +=10)。 但是,在进一步滚动时,偏移值没有改变。相同的第 21-31 行被反复多次返回。 请问这个怎么解决?

index.php

<div class="row" id="result">
<?php 

$offset=0;
$limit = 20;

$query =$con->prepare("SELECT xxx FROM yyy LIMIT ? OFFSET ?");
$query->bind_param('ii', $limit, $offset);
$query->execute();
$result = $query->get_result();

while($row=$result->fetch_assoc()){
?>

    <div class="col-md-3 mb-4">  
        <div class="card-deck h-100">      
            <div class="card border-secondary">
                <img src="<?php echo $row['ppp']; ?>" class="card-img-top img-fluid">
                <div class="card-body">
                    <h6 class="font-weight-bold text-secondary text-center mt-1"><?= $row['mmm']; ?></h6>
                    <hr class="mt-1 mb-1">
                    <h6 class="card-title text-danger">NGN<?= number_format($row['nnn']); ?> /-
                    </h6>
                    <hr class="mt-1 mb-1">
                    <small class="text-secondary">Fabric Used: <?php echo $row['fff'];?>
                        <br>                                                
                    </small>
                            
                    <a href="product-details.php?ProductId=<?= $row['iii'] ?>" class="btn btn-info btn-block addItemBtn"><i class="fas fa-cart-plus"></i> Order Now</a>
                </div>
            </div>
        </div>
    </div>
<?php   
} // endwhile
?>
</div>

<div class="p-3 text-center" style="display: block" >
    <button class="btn btn-danger" type="button" disabled>
        <span class="spinner-grow spinner-grow-sm" role="status" aria-hidden="true"></span>
          Loading more items...
    </button>
</div>

<script type="text/javascript">
var flag = 20; //offset initial value 
$(window).scroll(function (){ //scroll function
    if($(window).scrollTop() >= $('#result').height() - $(window).height()){
         
        $.ajax({
              type: 'POST',
              url: 'results.php', //get result page
              data: {'offset': flag,'limit': 10},
              success: function(data){
                    $('#result').append(data);
                    flag +=10; //add 10 to last offset value after callback
           }
        }); //close ajax
    }
});
</script>

结果.php

<?php 

if(isset($_POST['offset']) && isset($_POST['limit'])){
    $offset = $_POST['offset'];
    $limit = $_POST['limit'];

    if($sql = "SELECT xxx FROM yyy LIMIT ? OFFSET ?"){
        $query = $con->prepare($sql);
        $query->bind_param('ii', $limit, $offset);
        $query->execute();
        $result = $query->get_result();
        while($row=$result->fetch_assoc()){
?>
            <div class="col-md-3 mb-4">         
                <div class="card-deck h-100">      
                    <div class="card border-secondary">
                       <img src="<?= $row["ppp"] ?>" class="card-img-top img-fluid">
                        <div class="card-body">
                            <h6 class="font-weight-bold text-secondary text-center mt-1"><?= $row["mmm"] ?></h6>
                            <hr class="mt-1 mb-1">
                            <h6 class="card-title text-danger">NGN <?= number_format($row["nnn"]) ?>
                            </h6>
                            <hr class="mt-1 mb-1">
                            <small class="text-secondary">Fabric Used: <?= $row["fff"] ?></small>
                            <br>
                            <a href="product-details.php?ProductId=<?= $row['iii'] ?>" class="btn btn-info btn-block addItemBtn"><i class="fas fa-cart-plus"></i> Order Now</a>
                        </div>
                    </div>
                </div>
            </div>
<?php
        } // endwhile
    }//end if query successfull
    else{
        echo "Query Failed";
    }
}//end isset 
?>

【问题讨论】:

  • 您可能应该解除滚动处理程序的抖动,这样它就不会在等待对当前请求的响应时发送另一个请求。
  • 不太熟悉节流和去抖动。你能帮忙写一些代码吗?谢谢@Barmer
  • 更令人困惑的@Barmar。请问你能给我上面的代码的例子吗?
  • 更令人困惑的@Barmar。请问你能给我上面的代码的例子吗?

标签: php jquery ajax mysqli


【解决方案1】:

使用变量来检测您是否处于 AJAX 请求的中间,因此您不会发送重复。

let in_ajax = false;

$(window).scroll(function() { //scroll function
  if (!in_ajax) {
    if ($(window).scrollTop() >= $('#result').height() - $(window).height()) {
      in_ajax = true;
      $.ajax({
        type: 'POST',
        url: 'results.php', //get result page
        data: {
          'offset': flag,
          'limit': 10
        },
        success: function(data) {
          $('#result').append(data);
          flag += 10; //add 10 to last offset value after callback
          in_ajax = false;
        }
      }); //close ajax
    }
  }
});

【讨论】:

  • 感谢@barmar。工作。现在我想添加引导微调器微调器但不工作。你能帮忙吗?看看我在编辑后的代码中做了什么。
  • 请不要更改问题以匹配答案。如果人们看不到您的原始代码,我的回答毫无意义。
  • 如果您有新问题,请发布另一个问题。
  • 我在这里提出了新问题。请帮忙。谢谢stackoverflow.com/questions/65582759/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-17
  • 2019-01-08
  • 1970-01-01
  • 1970-01-01
  • 2014-01-24
相关资源
最近更新 更多