开发手册 欢迎您!
软件开发者资料库

PHP 实例 AJAX 实时搜索

在使用PHP的时候,可以通过AJAX为用户提供更友好、交互性更强的搜索体验。本节给出了具体介绍!AJAXLiveSearch在下面的实例中,我们将演示一个实时的搜索,在您键入数据的同时即可得到搜索结果。实时的搜索与传统的搜索相比,具有很多优势:当键入数据时,就会显示出匹配的结果当继续键入数据时,对结

在使用 PHP 的时候,可以通过 AJAX 为用户提供更友好、交互性更强的搜索体验。本节给出了具体介绍!


AJAX Live Search

在下面的实例中,我们将演示一个实时的搜索,在您键入数据的同时即可得到搜索结果。

实时的搜索与传统的搜索相比,具有很多优势:

  • 当键入数据时,就会显示出匹配的结果
  • 当继续键入数据时,对结果进行过滤
  • 如果结果太少,删除字符就可以获得更宽的范围

在下面的文本框中搜索 W3CSchool 的页面

上面实例中的结果在一个 XML 文件(links.xml)中进行查找。为了让这个例子小而简单,我们只提供 6 个结果。


实例解释 - HTML 页面

当用户在上面的输入框中键入字符时,会执行 "showResult()" 函数。该函数由 "onkeyup" 事件触发:

 
 
 
 
 

 

源代码解释:

如果输入框是空的(str.length==0),该函数会清空 livesearch 占位符的内容,并退出该函数。

如果输入框不是空的,那么 showResult() 会执行以下步骤:

  • 创建 XMLHttpRequest 对象
  • 创建在服务器响应就绪时执行的函数
  • 向服务器上的文件发送请求
  • 请注意添加到 URL 末端的参数(q)(包含输入框的内容)

PHP 文件

上面这段通过 JavaScript 调用的服务器页面是名为 "livesearch.php" 的 PHP 文件。

"livesearch.php" 中的源代码会搜索 XML 文件中匹配搜索字符串的标题,并返回结果:

load("links.xml");

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

 //get the q parameter from URL
 $q=$_GET["q"];

 //lookup all links from the xml file if length of q>0
 if (strlen($q)>0)
 {
 $hint="";
 for($i=0; $i<($x->length); $i++)
 {
 $y=$x->item($i)->getElementsByTagName('title');
 $z=$x->item($i)->getElementsByTagName('url');
 if ($y->item(0)->nodeType==1)
 {
 //find a link matching the search text
 if (stristr($y->item(0)->childNodes->item(0)->nodeValue,$q))
 {
 if ($hint=="")
 {
 $hint="" . 
 $y->item(0)->childNodes->item(0)->nodeValue . "";
 }
 else
 {
 $hint=$hint . "
" . $y->item(0)->childNodes->item(0)->nodeValue . ""; } } } } } // Set output to "no suggestion" if no hint were found // or to the correct values if ($hint=="") { $response="no suggestion"; } else { $response=$hint; } //output the response echo $response; ?>

如果 JavaScript 发送了任何文本(即 strlen($q) > 0),则会发生:

  • 加载 XML 文件到新的 XML DOM 对象
  • 遍历所有的 元素,以便找到匹配 JavaScript 所传文本</li> <li>在 "$response" 变量中设置正确的 URL 和标题。如果找到多于一个匹配,所有的匹配都会添加到变量。</li> <li>如果没有找到匹配,则把 $response 变量设置为 "no suggestion"。</li></ul><p><br></p></div> </div> </article> </div> </div> </ggg> <aside class="d-none d-lg-block col-lg-2"> <section> <div class=""> <form action="/helpdoc/Search" target="_blank" autocomplete="off"> <div class="input-group"> <input type="text" name="kw" value="" class="form-control" placeholder="输入关键词搜索"> <button class="btn btn-outline-secondary" type="submit">搜索</button> </div> </form> </div> <div class="list-group-item-heading mt-2"> <h4>推荐阅读</h4> </div> <ul class="list-group mb-2 sticky-top"> <li class="list-group-item"> <a href="/detail/2022/1104/CE4FE620EE84367E" class="w-100 d-inline-block text-truncate" title="Java File文件处理 创建和写文件" target="_blank"> Java File文件处理 创建和写文件 </a> </li> <li class="list-group-item"> <a href="/detail/2022/1104/4D326283A8D680D7" class="w-100 d-inline-block text-truncate" title="Java 使用MD5、SHA1、SHA-256和SHA-512计算文件和字符串哈希值(hash checksum)" target="_blank"> Java 使用MD5、SHA1、SHA-256和SHA-512计算文件和字符串哈希值(hash checksum) </a> </li> <li class="list-group-item"> <a href="/detail/2022/1104/A81F96D4F35E402A" class="w-100 d-inline-block text-truncate" title="Python openpyxl和xlwings读取操作Excel的区别及使用示例" target="_blank"> Python openpyxl和xlwings读取操作Excel的区别及使用示例 </a> </li> <li class="list-group-item"> <a href="/detail/2022/1104/1E18D84EBFD928AE" class="w-100 d-inline-block text-truncate" title="PyTorch 卷积神经网络(Convents)的特征提取" target="_blank"> PyTorch 卷积神经网络(Convents)的特征提取 </a> </li> <li class="list-group-item"> <a href="/detail/2022/1108/07E087A8B35A24B0" class="w-100 d-inline-block text-truncate" title="Apache Xerces - XML概述" target="_blank"> Apache Xerces - XML概述 </a> </li> <li class="list-group-item"> <a href="/detail/2022/1108/FA0DA779A621D95E" class="w-100 d-inline-block text-truncate" title="JOGL - GLJPanel类" target="_blank"> JOGL - GLJPanel类 </a> </li> <li class="list-group-item"> <a href="/detail/2022/1108/B76BC900201BC906" class="w-100 d-inline-block text-truncate" title="log4j - 登录文件" target="_blank"> log4j - 登录文件 </a> </li> <li class="list-group-item"> <a href="/detail/2022/1108/5278C689B38CC0CA" class="w-100 d-inline-block text-truncate" title="TestLink - 库存" target="_blank"> TestLink - 库存 </a> </li> <li class="list-group-item"> <a href="/detail/2022/1108/5D6C64B3F1A52FFF" class="w-100 d-inline-block text-truncate" title="Drupal - 创建产品" target="_blank"> Drupal - 创建产品 </a> </li> <li class="list-group-item"> <a href="/detail/2022/1108/BE904531E398E466" class="w-100 d-inline-block text-truncate" title="Joomla - 工具栏" target="_blank"> Joomla - 工具栏 </a> </li> <li class="list-group-item"> <a href="/detail/2022/1108/C26EF942399EE9A8" class="w-100 d-inline-block text-truncate" title="亚马逊网络服务 - 弹性块存储" target="_blank"> 亚马逊网络服务 - 弹性块存储 </a> </li> <li class="list-group-item"> <a href="/detail/2022/1108/8A1C323CEDA6AE69" class="w-100 d-inline-block text-truncate" title="R - 矩阵" target="_blank"> R - 矩阵 </a> </li> <li class="list-group-item"> <a href="/detail/2022/1108/2EDC72409F4C4189" class="w-100 d-inline-block text-truncate" title="SAP SCM - 计划订单创建" target="_blank"> SAP SCM - 计划订单创建 </a> </li> <li class="list-group-item"> <a href="/detail/2022/1108/41AA6739ADBEF2F6" class="w-100 d-inline-block text-truncate" title="SAP QM - 批次检验" target="_blank"> SAP QM - 批次检验 </a> </li> <li class="list-group-item"> <a href="/detail/2022/1108/6B679A75F2965815" class="w-100 d-inline-block text-truncate" title="MariaDB - 有用的功能" target="_blank"> MariaDB - 有用的功能 </a> </li> <li class="list-group-item"> <a href="/detail/2022/1108/4216AB2A061414D9" class="w-100 d-inline-block text-truncate" title="Memcached - 获取CAS数据" target="_blank"> Memcached - 获取CAS数据 </a> </li> <li class="list-group-item"> <a href="/detail/2022/1108/FCDF33E298DEAC01" class="w-100 d-inline-block text-truncate" title="JCL - 条件处理" target="_blank"> JCL - 条件处理 </a> </li> <li class="list-group-item"> <a href="/detail/2022/1108/6A4C07D431FA7FEE" class="w-100 d-inline-block text-truncate" title="C - 错误处理" target="_blank"> C - 错误处理 </a> </li> <li class="list-group-item"> <a href="/detail/2022/1108/F2D77BD9F5CE80C0" class="w-100 d-inline-block text-truncate" title="A / B测试 - 创建变体" target="_blank"> A / B测试 - 创建变体 </a> </li> <li class="list-group-item"> <a href="/detail/2023/0413/107536FF5AA6F4D6" class="w-100 d-inline-block text-truncate" title="jQuery EasyUI 树形菜单 &#8211; 树形网格惰性加载节点" target="_blank"> jQuery EasyUI 树形菜单 – 树形网格惰性加载节点 </a> </li> </ul> </section> </aside> </article> </main> </section> <footer class="footer"> <div class="container-fluid footer-widget"> <div class="container"> <div class="row"> <div class="col-12 col-md-4 col-lg-4"> <h3 class="text-start">幻海十年,专注互联网</h3> <ul class="d-flex px-0" style="text-align: left; flex-wrap: wrap"> <li class="item-3 mb-1"> <a target="_blank" href="https://wx.jonvie.com" rel="noopener noreferrer" title="几微助手"> <span>几微助手</span> </a> </li> <li class="item-3"> <a target="_blank" href="http://www.wonhero.com/" rel="noopener noreferrer" title="幻海官网"> <span>幻海官网</span> </a> </li> <li class="item-3"> <a target="_blank" href="http://www.rssso.com/" rel="noopener noreferrer" title="幻海优品"> <span>幻海优品</span> </a> </li> <li class="item-3 mb-1"> <a target="_blank" href="http://www.xct.cn" rel="noopener noreferrer" title="新彩天"> <span>新彩天</span> </a> </li> </ul> </div> <div class="col-12 col-md-4 col-lg-4"> <h3 class="text-start">关于</h3> <div class="text-start"> <span> 幻海科技成立于2009年,是一家集互联网基础技术服务、网络平台运营服务、软件产品研发、行业软件定制、自营电商平台于一体的专业互联网公司 </span> </div> </div> <div class="col-12 col-md-4 col-lg-4"> <h3 class="text-center">联系</h3> <div> <img src="http://www.jonvie.com/static/images/rightbar/QRcode.png?v=23" width="80" height="80" alt="微信公众号" /> </div> </div> </div> </div> </div> <div class="container-fluid" style="margin-top: 10px;"> <div class="row"> <div class="col-12 site-info"> <div class="item"> <a href="https://beian.miit.gov.cn/" target="_blank" rel="noopener external nofollow noreferrer"> 粤ICP备09219857号 </a> </div> </div> <div class="item">2009-2025 Copyright Wonhero.Com All Rights Reserved</div> <div class="item">深圳幻海软件技术有限公司 版权所有</div> </div> </div> </footer> <div id="toTop" style="display: none">返回顶部</div> <script src="//static.jonvie.com/wonhero/jquery/jquery.min.js"></script> <script src="//static.jonvie.com/wonhero/bootstrap/bootstrap.min.js"></script> <script> document.querySelectorAll('pre.prettyprint').forEach(el => { hljs.highlightElement(el); }); </script> <script> const total = Number("109"); let loading = document.querySelector(".loading"); loading.style.display = "none"; let currentpage = 2; let limit = 50; let isMore = total > limit; // 用于计算当前元素距离浏览器顶部距离 function getElementTop(el) { if (el.offsetParent ) { return getElementTop(el.offsetParent ) + el.offsetTop } return el.offsetTop } // 监听滚动条 document.addEventListener("scroll",init); // 临界点判断 function init(){ let scrollTop = document.body.scrollTop || document.documentElement.scrollTop // 滚动条 let sidebarTop = getElementTop(document.querySelector(".sort-sidebar")); let sidebarHeight = document.querySelector(".classify").offsetHeight; if (sidebarTop + sidebarHeight < (scrollTop + document.documentElement.clientHeight) && isMore) { getSideBar(currentpage, limit) // 请求数据 } } init(); // 获取数据 function getSideBar(page, limit) { try { isMore = false; fetch(`/api/ManagerApi/GetPageArtitlesByCls?page=${page}&limit=${limit}&channel=devdoc&clsId=5D45CA68A29DDD9D`) .then(resp => resp.json()) .then(res => { if (res.Success) { isMore = (page - 1) * limit + res.Data.Item2.length < total; if (isMore) currentpage += 1; renderSidebar(res.Data.Item2); // 渲染列表 } }); } catch (e) { console.log(e, 23) } } // 渲染列表 function renderSidebar(list = []) { if (!list.length) return; let template = list.map(item => { return `<li class="list-group-item" style="border: 0px"> <a class="w-100 d-inline-block text-truncate" title="${item.ContentTitle}" href="/detail/${item.ContentID}" target="_blank"> ${item.ContentTitle} </a> </li>` }).join(""); document.querySelector(".classify").innerHTML = document.querySelector(".classify").innerHTML + template; } </script> <script> ;(()=>{ var height = $(window).height(); $(window).scroll(function() { if ($(window).scrollTop() > height) { $("#toTop").fadeIn(500); } else { $("#toTop").fadeOut(500); } }); $("#toTop").click(function() { $('body,html').animate({ scrollTop: 0 }, 500); return false; }); })(); </script> <script> var _hmt = _hmt || []; (function () { var hm = document.createElement("script"); hm.src = "https://hm.baidu.com/hm.js?843cad737da0ae856cb26e84eafcd9bb"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })(); </script> <script charset="UTF-8" id="LA_COLLECT" src="//sdk.51.la/js-sdk-pro.min.js"></script> <script>LA.init({ id: "Jzndc69N7BtnPgpT", ck: "Jzndc69N7BtnPgpT" })</script> </body> </html>