【问题标题】:Ajax live search of xml documentxml文档的ajax实时搜索
【发布时间】:2013-12-06 16:18:06
【问题描述】:

我正在建立一个拥有超过 4k 名员工的员工目录。我使用的方法在数百人上效果很好,但搜索超过 4k 的员工需要很长时间。我正在寻找一种方法来加快这一速度,或者寻找一种更好的方法来完成搜索。

这是在主 php 页面上运行的 ajax。

<script type="text/javascript">
function showResult(str)
{
if (str.length==0)
  { 
  document.getElementById("livesearch").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("livesearch").innerHTML=xmlhttp.responseText;
    }
  }
xmlhttp.open("GET","empSearch.php?q="+str,true);
xmlhttp.send();
}
</script>

这是搜索 xml 文档并格式化结果的 php。

<?php
$xmlDoc=new DOMDocument();
$xmlDoc->load('find_search_inc.xml');

$x=$xmlDoc->getElementsByTagName('emp');

$q=$_GET["q"];

if (strlen($q)>=1)
{
$hint="";

for($i=0; $i<($x->length); $i++)
  {
  $y=$x->item($i)->getElementsByTagName('fname');
  $z=$x->item($i)->getElementsByTagName('lname');
  $w=$x->item($i)->getElementsByTagName('location');
  $p=$x->item($i)->getElementsByTagName('position');
  $id=$x->item($i)->getElementsByTagName('id');

  if ($y->item(0)->nodeType==1)
    {
    if (stristr($y->item(0)->childNodes->item(0)->nodeValue,$q)||stristr($z->item(0)->childNodes->item(0)->nodeValue,$q))
      {
      if ($hint=="")
        {   
        $hint="<div class='emp'> <dl class='empInfo'>
        <dd class='info'><strong>".$y->item(0)->childNodes->item(0)->nodeValue." ".$z->item(0)->childNodes->item(0)->nodeValue."</strong></dd>
        <dd class='info'><img src='images/emailIcon.png' />email@leprinofoods.com</dd>
        <dd class='info'><img src='images/phoneIcon.png' />". $p->item(0)->childNodes->item(0)->nodeValue . "</dd>
        <dd class='info'><img src='images/briefcaseIcon.png' />". $id->item(0)->childNodes->item(0)->nodeValue . "</dd>
        <dd class='info'><img src='images/locationIcon.png' />". $id->item(0)->childNodes->item(0)->nodeValue . "</dd>
        <dd class='empImage'><img src='images/default.png' /></dd>

        </dl></div>";
        }
      else
        {
         $hint=$hint ."<div class='emp'> <dl class='empInfo'>
        <dd class='info'><strong>".$y->item(0)->childNodes->item(0)->nodeValue." ".$z->item(0)->childNodes->item(0)->nodeValue."</strong></dd>
        <dd class='info'><img src='images/emailIcon.png' /> email@leprinofoods.com</dd>
        <dd class='info'><img src='images/phoneIcon.png' /> ". $p->item(0)->childNodes->item(0)->nodeValue . "</dd>
        <dd class='info'><img src='images/briefcaseIcon.png' />". $id->item(0)->childNodes->item(0)->nodeValue . "</dd>
        <dd class='info'><img src='images/locationIcon.png' />". $id->item(0)->childNodes->item(0)->nodeValue . "</dd>
        <dd class='empImage'><img src='images/default.png' /></dd>
        </dl></div>";
        }
      }
    }
  }
}
if ($hint=="")
  {
  $response="Sorry that employee was not found.";
  }
else
  {
  $response=$hint;
  }
echo $response;
?>

【问题讨论】:

  • 不要在此处粘贴实时代码。相反,从头开始重新编写一个代码示例,以尽可能少的代码和数据来演示孤立的、具体的问题,以便可以轻松地复制它。

标签: php ajax xml


【解决方案1】:

使用 XML

首先在ajax中使用X!所以不要发送隐藏在纯文本中的 HTML,而是发送 XML 中的数据

拆分 AJAX 请求

拆分 ajax 请求,可能使用页面来显示数据。因此传输的数据更少。

使用数据库

您最大的问题是您不使用数据库! XML 文件对于 100 个条目将很快,但与 MySQL 等真实数据库相比,速度非常慢。毕竟,您正在为每个请求读取该文件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-14
    相关资源
    最近更新 更多