php - Mysql 无限页面滚动功能不起作用

标签 php jquery mysql ajax

我正在从 mysql 获取数据,但页面滚动不起作用。

它只显示 10 个结果(1-10),如果我向下滚动则不会得到任何结果。

这是我的 load.php 文件

<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" type="text/css" href="load_style.css">
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript">
 $(window).scroll(function ()
    {
      if($(body).height() <= $(window).scrollTop() + $(window).height())
      {
        loadmore();
      }
    });

    function loadmore()
    {
      var val = document.getElementById("row_no").value;
      $.ajax({
      type: 'post',
      url: 'get_resultts.php',
      data: {
       getresult:val
      },
      success: function (response) {
      var content = document.getElementById("all_rows");
      content.innerHTML = content.innerHTML+response;

      // We increase the value by 10 because we limit the results by 10
      document.getElementById("row_no").value = Number(val)+10;
      }
      });
    }
    </script>

    </head>

    <body>

      <h1>Load Results From Database On Page Scroll Using jQuery,Ajax And PHP</h1>
      <div id="all_rows">
        <?php

          $db = mysqli_connect("localhost", "root", "", "text");
          $sql="select text from text limit 0,10";
          $select = mysqli_query($db, $sql);
          while($row=mysqli_fetch_array($select))
          {
            echo "<p class='rows'>".$row['text']."</p>";
          }
        ?>
      </div>
      <input type="hidden" id="row_no" value="10">

    </body>
    </html>

这是 get_resultts.php

<?php

  if(isset($_POST['getresult']))
  {
    $db = mysqli_connect("localhost", "root", "", "text");

    $no = $_POST['getresult'];
    $sql = "select text from text limit $no,10";
    $select = mysqli_query($db, $sql);
    while($row = mysqli_fetch_array($select))
    {
      echo "<p class='rows'>".$row['text']."</p>";
    }
    exit();
  }

?>

任何提示/帮助表示赞赏。

最佳答案

您遇到了一些问题。首先是您没有正确引用 body 标记 - 您应该使用:

$("body")...

而不是像您在脚本中所做的那样 $(body) 。

第二个问题是内容可能无法填充可用空间 - 如果内容不够高而无法滚动,那么您的滚动事件将永远不会触发,因此即使 body 标记被更正,该事件可能永远不会尝试触发。您可以轻松地在文档就绪事件中放置某种循环:

$(document).ready(function() { 
   ... (repeat similar check until content fills space) ...
}

最后一个问题是,响应滚动,您可以轻松获得 loadmore() 函数的多个触发器。这将导致您的页面触发具有相同行号的多个并行 ajax 请求,并且您会收到按顺序出现的大量重复请求。

为了防止这种情况发生,您应该尝试在任何时候只运行一个这样的 ajax 查询。有多种方法可以做到这一点,但一种方法是跟踪您打开的事件 Ajax 查询的数量,并且仅在先前的查询已完成时才继续。例如:

var countAjax = 0;
function loadMore() {
    if (countAjax>0) return;
    $.ajax({
        beforeSend: function() {
            countAjax++;
        }, 
        ... (other settings) ...
        success: function(response) {
            countAjax--;
            ... (other success events) ...
        },
        error: function() {
            countAjax--;
            ... (other error events) ...
        }
    });
}

通过这样做,您可以确保页面一次只执行一个 ajax 请求,而不是并行执行多个 ajax 请求 - 查询必须成功完成或触发错误,计数器才会递减回零再次,并且在发生之前不会尝试另一个查询。

关于php - Mysql 无限页面滚动功能不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42609696/

相关文章:

php - 反转字符串中以空格分隔的单词的顺序

php - 从 PHP 链接访问 JavaScript 变量

javascript - 未捕获的类型错误 : undefined is not a function

MySQL:传递给具有多列和行的PROCEDURE查询结果

mysql - 如何从 UNION 查询中获取 "remove duplicates"

Php Mysql select查询问题和regexp

具有平衡元素数量的 php array_chunk

jQuery 插件 - 它是如何工作的?

javascript - 如何检测一个项目在 knockout observable 数组之间的移动

MySQL 自定义排序