将Ajax与表排序/过滤相结合

时间:2012-02-14 12:05:40

标签: php javascript jquery

问题在于:我正在使用JQuery tablesorter对表进行分页。表行是从数据库中提取的,如下所示:

//list players by points (default listing)
$result=mysql_query("select * from players order by pts_total") or die(mysql_error());
echo "<table id='list_table' class='tablesorter'><thead><tr><th width='25px'>Pos</th><th width='200px'>Player</th><th width='25px'>Club</th><th width='25px'>Value</th><th width='25px'>Points</th></tr></thead><tbody>";
while($row=mysql_fetch_array($result)){
    //get team logo
    $result1=mysql_query("select amblem from real_teams where team_name='$row[team]' ") or die(mysql_error());
    $row1=mysql_fetch_array($result1);
    echo "<tr>";
    echo "<td>T</td>";
    echo "<td>".$row['name']."</td>";
    echo "<td style='text-align:center;'><img src='".$row1['amblem']."' height=16px title='".$row['team']."'></td>";
    echo "<td>".$row['current_value']."</td>";
    echo "<td>".$row['pts_total']."</td>";
    echo "</tr>";
}
echo "</tbody></table>";

一切正常,桌子是分页的,它列出了足球运动员。但问题是,我有一个下拉列表,用户应该可以选择只显示播放某个位置的玩家(该信息位于同一个数据库表中):

<select name="show_positions" id="show_positions" onChange="showPlayers(this.value)">
<option value="A">All Positions</option>
<option value="G">Goalkeepers</option>
<option value="D">Defenders</option>
<option value="M">Midfielders</option>
<option value="S">Strikers</option>
</select>

它调用一个Ajax函数,该函数显示一个只有播放某个位置的玩家的表,并且它会按预期执行,但该表不再是分页的。相反,它显示一个大表。我认为这是因为没有处理分页的Javascript,因为页面没有重新加载?有没有办法在Ajax调用期间再次调用Javascript函数?这是它调用的Ajax和PHP文件:

<script type="text/javascript">
function showPlayers(str)
{
if (str=="")
  {
  document.getElementById("inner_list").innerHTML="";
  return;
  }
if (window.XMLHttpRequest)
  {// code for IE7+, Firefox, Chrome, Opera, Safari
  xmlhttp=new XMLHttpRequest();
  }
else
  {// code for IE6, IE5
  xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
  }
xmlhttp.onreadystatechange=function()
  {
  if (xmlhttp.readyState==4 && xmlhttp.status==200)
    {
    document.getElementById("inner_list").innerHTML=xmlhttp.responseText;
    }
  }
xmlhttp.open("GET","listplayers.php?q="+str,true);
xmlhttp.send();
}
</script>

listplayers.php:

<?php
include('../include/db.php');
dbConnect('dbname');

$pos=$_GET['q'];
if ($pos=="A")
    $pos="";

//list players by points (default listing)
$result=mysql_query("select * from players where position LIKE '%$pos%' order by pts_total") or die(mysql_error());
echo "<table id='list_table' class='tablesorter'><thead><tr><th width='25px'>Pos</th><th width='200px'>Player</th><th width='25px'>Club</th><th width='25px'>Value</th><th width='25px'>Points</th></tr></thead><tbody>";
while($row=mysql_fetch_array($result)){
    //get team logo
    $result1=mysql_query("select amblem from real_teams where team_name='$row[team]' ") or die(mysql_error());
    $row1=mysql_fetch_array($result1);
    echo "<tr>";
    echo "<td>T</td>";
    echo "<td>".$row['name']."</td>";
    echo "<td style='text-align:center;'><img src='".$row1['amblem']."' height=16px title='".$row['team']."'></td>";
    echo "<td>".$row['current_value']."</td>";
    echo "<td>".$row['pts_total']."</td>";
    echo "</tr>";
}
echo "</tbody></table>";
?>

表格式的JQuery,它位于页面的头部:

<script type="text/javascript">
$(document).ready(function() { 
    $("table") 
    .tablesorter({widthFixed: true, widgets: ['zebra']}) 
    .tablesorterPager({container: $("#pager"), size: 20}); 
}); 
</script>

2 个答案:

答案 0 :(得分:1)

在回调处理程序中,如果你在DOM中插入表,你应该再次在表上调用tablesorter插件来重新初始化它

if (xmlhttp.readyState==4 && xmlhttp.status==200)
{
  document.getElementById("inner_list").innerHTML=xmlhttp.responseText;
  $("#list_table").tablesorter( );
}

为了确保始终使用相同的选项,您可以将它们保存在对象中

$(document).ready(function(){
   var list_table_options = {sortList: [[0,0], [1,0]]};
  $("#list_table").tablesorter( list_table_options );
});

答案 1 :(得分:0)

我认为如果你甚至使用jQuery会更好,所以使用它的.ajax()方法,而不是简单的XMLHttpRequest(),所以你可以使用成功或失败的处理程序,它是非常的有用的。