“更多”按钮使用AJAX和PHP

“更多”按钮使用AJAX和PHP

问题描述:

我使用PHP创建活动网站。我有一个“events”表的数据库,其中包含id标题日期(Y-m-d)。“更多”按钮使用AJAX和PHP

我的索引页面按日期顺序显示从今天开始的前30个事件。当您点击“更多”时,通过AJAX显示30个更多事件。 AJAX加载more.phpindex.php,并且index.php通过PHP会话将最新的id/date传递给more.php。

我希望能够一次又一次地显示“更多”,以便每次用户点击它时,会在之前的事件下显示30个事件(例如当您在Twitter上一直向下滚动时会发生的情况) 。

不幸的是,我的“更多”按钮第一次工作(当从index.php点击时),但在more.php中单击时,通过id/date变量快速循环一次又一次,直到没有任何还有更多的事件。

如何通过AJAX创建我想要的更多按钮?

下面是相关的代码的index.php

<!-- "More" button JavaScript. Loads 10 more events when clicked --> 
<script type="text/javascript" src="ajax.js"></script> 
<script type="text/javascript"> 
    $(document).ready(function(){ 
    $("more").click(function(){ 
     $("more").load('more.php'); 
    }); 
    }); 
</script> 

<?php 
    session_start(); 
    $today = date('Y-m-d'); 
    $result = mysql_query("SELECT * FROM events WHERE date>='$today' ORDER BY date LIMIT 0, 30"); 
    while($row = mysql_fetch_array($result)) 
    { 
    echo $row['id']; 
    echo $row['title']; 
    echo $row['date']; 
    echo "<br />"; 
    // Grabs date/id of last event echoed 
$nId = $row['id']; 
$nDate = $row['date']; 
    } 
    // Sends last date/id echoed to more.php 
    $_SESSION['nDate']=$nDate; 
    $_SESSION['nId']=$nId;  
?> 
<!-- This more tag seems to work with my JavaScript --> 
<more>More</more> 

而且more.php

<!-- "More" button JavaScript. Loads 30 more events when clicked --> 
<script type="text/javascript" src="ajax.js"></script> 
<script type="text/javascript"> 
    $(document).ready(function(){ 
    $("more").click(function(){ 
     $("more").load('more.php'); 
    }); 
    }); 
</script> 

<?php 
    session_start(); 
    $nId = $_SESSION['nId']; 
    $nDate = $_SESSION['nDate']; 
    $result = mysql_query("SELECT * FROM events WHERE date>='$nDate' && id>='$nId' ORDER BY date LIMIT 1, 30"); 
    while($row = mysql_fetch_array($result)) 
    { 
    echo $row['id']; 
    echo $row['title']; 
    echo $row['date']; 
    echo "<br />"; 
    $nId = $row['id']; 
    $nDate = $row['date']; 
    } 
    $_SESSION['nDate']=$nDate; 
    $_SESSION['nId']=$nId;  
?> 
<more>More</more> 

非常感谢提前,球员:)

你有这里额外的不需要的数据。试试这个例子。

的index.php:

<?php 
// THAT SHOULD BE BEFORE ANY OUTPUT IS SENT TO THE BROWSER 
    session_start(); 
?> 
<!-- "More" button JavaScript. Loads 10 more events when clicked --> 
<script type="text/javascript" src="ajax.js"></script> 
<script type="text/javascript"> 
    $(document).ready(function(){ 
    $("more").click(function(){ 
     $('<div style="display:none;"/>').insertBefore($(this)) 
       .load('more.php', function(){$(this).slideDown();}); 
    }); 
    }); 
</script> 

<?php 
include('more.php'); 
?> 
<!-- This more tag seems to work with my JavaScript --> 
<more>More</more> 

而且more.php:

<?php 
    // include here some code for connection to DB 
    if (!isset($_SESSION)) 
    { 
     session_start(); 
     $nId = $_SESSION['nId']; 
     $nDate = $_SESSION['nDate']; 
     $result = mysql_query("SELECT * FROM events WHERE date>='$nDate' && 
          id>='$nId' ORDER BY date LIMIT 1, 30");  
    } 
    else 
    { 
     $today = date('Y-m-d'); 
     $result = mysql_query("SELECT * FROM events WHERE date>='$today' 
         ORDER BY date LIMIT 0, 30"); 
    } 

    while($row = mysql_fetch_array($result)) 
    { 
    echo $row['id']; 
    echo $row['title']; 
    echo $row['date']; 
    echo "<br />"; 
    $nId = $row['id']; 
    $nDate = $row['date']; 
    } 
    $_SESSION['nDate']=$nDate; 
    $_SESSION['nId']=$nId;  
?> 

而且,很可能,当有数据库没有记录,你应该添加的方式来阻止这种扩张。

ps:为什么你需要非标准标签more?例如使用<div id='more'>More</div>。然后您的$("more")将更改为$("#more")

+0

你是个怪胎男人。而且这个slideDown函数是这个代码顶部的樱桃工作得很好。一旦我获得了足够的声望点数,您将被投票。我也要更改我的标签。感谢您的帮助:) – AnnaBlabber 2012-01-30 03:48:47

+0

@AnnaBlabber欢迎您:)应该有,可能还有一个增强 - 第二次点击'更多'应该被禁用,直到内容加载完成。否则,连接速度慢的人可能不会理解正在发生的事情,并会第二次点击它。或者应该显示任何“行动中的阿贾克斯”指示。 – Cheery 2012-01-30 03:57:40

当你使用jQuery的加载函数时,你只能替换元素和它的结束标记之间的内容。在您的AJAX加载后,您在index.php文档中设置的JavaScript仍然存在。所以每次你点击你的按钮时,你都会得到一个重复执行的JavaScript代码。当来自more.php的新javascript被加载时,你会得到另一个$(document).ready(),它将另一个点击事件绑定到与“more”匹配的所有标签,所以现在当你再次点击时你加载的比你想象的要多得多。

你应该做的第一件事就是不要在你的more.php中包含javascript。如果我明白你要完成的任务,那么你需要改变你的点击事件来创建一个新的<div>,调用jQuery的加载函数,并将它附加到你的文档中。它可能是这个样子:

$("more").click(function() { 
    $("body").append($("<div>").load("mode.php")); 
}); 

我也强烈建议不要做了一个新的标签一样<更多>。浏览器不知道如何处理它,所以你不能确定它将如何呈现,如果有的话。您可以在这些情况下只使用<div>,并根据需要为其提供ID或课程。

此外,如果您在同一天有多个事件,则选择下一个要显示的事件的算法将失败。你真正想要做的只是跟踪你想用作查询中LIMIT子句的一部分的偏移值。

+0

我要将我的标记更改为div。感谢提示:) – AnnaBlabber 2012-01-30 03:49:29