宜信同城网交流论坛

 找回密码
 立即注册
开启左侧

PHP 实例 - AJAX 实时搜索

[复制链接]
发表于 2023-2-16 18:54:45 | 显示全部楼层 |阅读模式 来自 LAN

AJAX 可为用户提供更友好、交互性更强的搜索体验。


AJAX Live Search

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

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

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

在下面的文本框中输入 "HTML",搜索包含 HTML 的页面:

HTML a 标签
CSS background 属性
JavaScript Date 对象
JavaScript Array 对象

上面实例中的结果在一个 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');

// 从 URL 中获取参数 q 的值
$q=$_GET["q"];

// 如果 q 参数存在则从 xml 文件中查找数据
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)
        {
            // 找到匹配搜索的链接
            if (stristr($y->item(0)->childNodes->item(0)->nodeValue,$q))
            {
                if ($hint=="")
                {
                    $hint="item(0)->childNodes->item(0)->nodeValue . 
                    "' target='_blank'>" . 
                    $y->item(0)->childNodes->item(0)->nodeValue . "";
                }
                else
                {
                    $hint=$hint . "
item(0)->childNodes->item(0)->nodeValue .                     "' target='_blank'>" .                     $y->item(0)->childNodes->item(0)->nodeValue . "";                 }             }         }     } } // 如果没找到则返回 "no suggestion" if ($hint=="") {     $response="no suggestion"; } else {     $response=$hint; } // 输出结果 echo $response; ?>

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

  • 加载 XML 文件到新的 XML DOM 对象
  • 遍历所有的 元素,以便找到匹配 JavaScript 所传文本</li><li>在 "$response" 变量中设置正确的 URL 和标题。如果找到多于一个匹配,所有的匹配都会添加到变量。</li><li>如果没有找到匹配,则把 $response 变量设置为 "no suggestion"。</li></ul> </div> </div> <div id="treeSkill"></div></td></tr></table> </div> <div id="comment_152675" class="cm"> </div> <div id="post_rate_div_152675"></div> <style type="text/css">.t_f{overflow: hidden;}</style><script type="text/javascript">function freeaddon_zoom(o){var zoom=parseInt(o.style.zoom, 10)||100;zoom+=event.wheelDelta/12;if (zoom>0) o.style.zoom=zoom+'%';return false;}</script><fieldset style="border:1px dashed #cccccc;padding:10px;border-radius:8px;-moz-border-radius:8px;-webkit-border-radius:8px;"> <legend align="center" style="color:#00000;width:156px;text-align:center;">宜信网交流论坛 - 版权声明</legend> 1、在发表言论时,请遵守当地法律法规。主题所有言论纯属个人意见,与本站立场无关。<br> 2、本站所有主题由作者发表,作者享有帖子相关版权,其他单位或个人使用、转载或引用本文时必须征得作者同意并注明来源于<a href="https://www.fjmh.net/"><font color="#FF6600">宜信网</font></a>。<br> 3、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除并致以最深的歉意。<br> 4、帖子不遵守当地法律法规、广告、人身攻击等情况时,<a href="https://www.fjmh.net/"><font color="#FF6600">宜信网</font></a>管理人员有权不事先通知发贴者而删除本文。</fieldset></div> </div> </td></tr> <tr><td class="plc plm"> </td> </tr> <tr id="_postposition152675"></tr> <tr> <td class="plc" style="overflow:visible; width:100%"> <div class="po hin"> <div class="pob cl"> <em> <a class="fastre" href="forum.php?mod=post&action=reply&fid=2&tid=152561&reppost=152675&extra=page%3D1&page=1" onclick="showWindow('reply', this.href)">回复</a> </em> <p> <a href="javascript:;" id="mgc_post_152675" onmouseover="showMenu(this.id)" class="showmenu">使用道具</a> <a href="javascript:;" onclick="showWindow('miscreport152675', 'misc.php?mod=report&rtype=post&rid=152675&tid=152561&fid=2', 'get', -1);return false;">举报</a> </p> <ul id="mgc_post_152675_menu" class="p_pop mgcmn" style="display: none;"> <li><a href="home.php?mod=magic&mid=bump&idtype=tid&id=152561" id="a_bump" onclick="showWindow(this.id, this.href)"><img src="static/image/magic/bump.small.gif" />提升卡</a></li> <li><a href="home.php?mod=magic&mid=stick&idtype=tid&id=152561" id="a_stick" onclick="showWindow(this.id, this.href)"><img src="static/image/magic/stick.small.gif" />置顶卡</a></li> <li><a href="home.php?mod=magic&mid=close&idtype=tid&id=152561" id="a_stick" onclick="showWindow(this.id, this.href)"><img src="static/image/magic/close.small.gif" />沉默卡</a></li> <li><a href="home.php?mod=magic&mid=open&idtype=tid&id=152561" id="a_stick" onclick="showWindow(this.id, this.href)"><img src="static/image/magic/open.small.gif" />喧嚣卡</a></li> <li><a href="home.php?mod=magic&mid=highlight&idtype=tid&id=152561" id="a_stick" onclick="showWindow(this.id, this.href)"><img src="static/image/magic/highlight.small.gif" />变色卡</a></li> <li><a href="home.php?mod=magic&mid=jack&idtype=tid&id=152561" id="a_jack" onclick="showWindow(this.id, this.href)"><img src="static/image/magic/jack.small.gif" />千斤顶</a></li> <li><a href="home.php?mod=magic&mid=namepost&idtype=pid&id=152675:152561" id="a_namepost_152675" onclick="showWindow(this.id, this.href)"><img src="static/image/magic/namepost.small.gif" />照妖镜</a><li> </ul> <script type="text/javascript" reload="1">checkmgcmn('post_152675')</script> </div> </div> </td> </tr> <tr class="ad"> <td class="pls"> </td> </tr> </table> </div><div id="postlistreply" class="pl"><div id="post_new" class="viewthread_table" style="display: none"></div></div> </div> <form method="post" autocomplete="off" name="modactions" id="modactions"> <input type="hidden" name="formhash" value="98136b86" /> <input type="hidden" name="optgroup" /> <input type="hidden" name="operation" /> <input type="hidden" name="listextra" value="page%3D1" /> <input type="hidden" name="page" value="1" /> </form> <div class="pgs mtm mbm cl"> <span class="pgb y"><a href="forum-2-1.html">返回列表</a></span> <a id="newspecialtmp" onmouseover="$('newspecial').id = 'newspecialtmp';this.id = 'newspecial';showMenu({'ctrlid':this.id})" onclick="showWindow('newthread', 'forum.php?mod=post&action=newthread&fid=2')" href="javascript:;" title="发新帖"><img src="static/image/common/pn_post.png" alt="发新帖" /></a> </div> <!--[diy=diyfastposttop]--><div id="diyfastposttop" class="area"></div><!--[/diy]--> <script type="text/javascript"> var postminchars = parseInt('0'); var postmaxchars = parseInt('1000000'); var disablepostctrl = parseInt('0'); </script> <div id="f_pst" class="pl bm bmw"> <form method="post" autocomplete="off" id="fastpostform" action="forum.php?mod=post&action=reply&fid=2&tid=152561&extra=page%3D1&replysubmit=yes&infloat=yes&handlekey=fastpost" onSubmit="return fastpostvalidate(this)"> <table cellspacing="0" cellpadding="0"> <tr> <td class="pls"> </td> <td class="plc"> <span id="fastpostreturn"></span> <div class="cl"> <div id="fastsmiliesdiv" class="y"><div id="fastsmiliesdiv_data"><div id="fastsmilies"></div></div></div><div class="hasfsl" id="fastposteditor"> <div class="tedt mtn"> <div class="bar"> <span class="y"> <a href="forum.php?mod=post&action=reply&fid=2&tid=152561" onclick="return switchAdvanceMode(this.href)">高级模式</a> </span><script src="data/cache/seditor.js?C1i" type="text/javascript"></script> <div class="fpd"> <a href="javascript:;" title="文字加粗" class="fbld">B</a> <a href="javascript:;" title="设置文字颜色" class="fclr" id="fastpostforecolor">Color</a> <a id="fastpostimg" href="javascript:;" title="图片" class="fmg">Image</a> <a id="fastposturl" href="javascript:;" title="添加链接" class="flnk">Link</a> <a id="fastpostquote" href="javascript:;" title="引用" class="fqt">Quote</a> <a id="fastpostcode" href="javascript:;" title="代码" class="fcd">Code</a> <a href="javascript:;" class="fsml" id="fastpostsml">Smilies</a> </div></div> <div class="area"> <div class="pt hm"> 您需要登录后才可以回帖 <a href="member.php?mod=logging&action=login" onclick="showWindow('login', this.href)" class="xi2">登录</a> | <a href="member.php?mod=register" class="xi2">立即注册</a> </div> </div> </div> </div> </div> <div id="seccheck_fastpost"> </div> <input type="hidden" name="formhash" value="98136b86" /> <input type="hidden" name="usesig" value="" /> <input type="hidden" name="subject" value=" " /> <p class="ptm pnpost"> <a href="home.php?mod=spacecp&ac=credit&op=rule&fid=2" class="y" target="_blank">本版积分规则</a> <button type="button" onclick="showWindow('login', 'member.php?mod=logging&action=login&guestmessage=yes')" onmouseover="checkpostrule('seccheck_fastpost', 'ac=reply');this.onmouseover=null" name="replysubmit" id="fastpostsubmit" class="pn pnc vm" value="replysubmit" tabindex="5"><strong>发表回复</strong></button> <label for="fastpostrefresh"><input id="fastpostrefresh" type="checkbox" class="pc" />回帖后跳转到最后一页</label> <script type="text/javascript">if(getcookie('fastpostrefresh') == 1) {$('fastpostrefresh').checked=true;}</script> </p> </td> </tr> </table> </form> </div> <script> function boan_video_auto(){ boan_jq('.boan_video').each(function(el,index){ if(boan_jq(this).width()>boan_jq(this).parent().width()){ boan_jq(this).attr('width','100%'); } }) } setTimeout('boan_video_auto()',200); </script> </div> <div class="wp mtn"> <!--[diy=diy3]--><div id="diy3" class="area"></div><!--[/diy]--> </div> <script type="text/javascript"> function succeedhandle_followmod(url, msg, values) { var fObj = $('followmod_'+values['fuid']); if(values['type'] == 'add') { fObj.innerHTML = '不收听'; fObj.href = 'home.php?mod=spacecp&ac=follow&op=del&fuid='+values['fuid']; } else if(values['type'] == 'del') { fObj.innerHTML = '收听TA'; fObj.href = 'home.php?mod=spacecp&ac=follow&op=add&hash=98136b86&fuid='+values['fuid']; } } fixed_avatar([152675], 1); </script> </div> <style> /* * html, * html body{background-image:url(about:blank);background-attachment:fixed}*/ .flflfl {float: left;} .close {position: absolute;top: 4px;right: 10px;padding-top: 15px;width: 26px;height: 28px;background: url(https://bbs.26x.net/source/plugin/crx_visitor/static/img/guanbi.png) no-repeat scroll 0 0 transparent;overflow: hidden;z - index: 9;cursor: pointer;} .login-arrow{width:30px;height:15px;} .login-wrap{position:fixed;left:0;bottom:0;width:100%;_position:absolute;z-index:999;_top:expression(eval(document.documentElement.scrollTop+document.documentElement.clientHeight-this.offsetHeight-(parseInt(this.currentStyle.marginTop,10)||0)-(parseInt(this.currentStyle.marginBottom,10)||0)));} .login-ie6-fixed{bottom:0;} .login-box{padding:18px 0 7px;border-top:1px solid #D2E0B1;border-bottom:1px solid #D2E0B1;box-shadow:2px 2px 6px #8CA226;background:#D9E6BB;filter:progid:DXImageTransform.Microsoft.gradient(enabled=true,startColorstr=#E5D9E6BB,endColorstr=#E5D9E6BB);background:rgba(217,230,187,0.9);} .login-user{position:relative;margin:0 auto;width:980px;height:70px;} .login-user a,.login-user a:visited{color:#666;}.login-user a:hover{color:#0657B2;} .login-user .txt{padding:3px;border:1px solid #D8D8D8;color:#333;} .login-user .txt:hover,.login-user .txt:focus{border-color:#7DBDE2;} .login-title,.login-cont,.login-ft{display:inline;position:relative;} .login-title{color:#8CA226;margin-bottom:14px;margin-right:10px;} .login-title h3{margin-top:3px;height:30px;font:400 24px/30px 'Microsoft YaHei',SimHei;} .login-cont{height:63px;}.login-cont .mg0{margin:0;} .login-cont .txt{float:left;margin-bottom:10px;width:140px;height:25px;line-height:25px;color:#999;font-size:14px;zoom:1;} .login-cont .login-captcha{width:112px;}.login-cont .login-captcha .txt{margin-bottom:0;} .login-cont ul{position:absolute;top:0;left:0;width:850px;} .login-cont li{display:inline;float:left;margin-right:10px;height:80px;overflow:hidden;} .login-cont .login-item{color:#666;clear:both;}.login-cont .login-item input{margin-top:-2px;} .login-cont .login-button,.login-cont .login-button:visited{display:block;float:left;width:64px;color:#fff;border:1px solid #b9c97d;border-radius:6px;font-size:14px;font-weight:700;height:33px;line-height:33px;margin-right:10px;text-align:center;background:#7f9c14;background:-moz-linear-gradient(top,#abbf42,#8ea423);background:-webkit-linear-gradient(top,#abbf42,#8ea423);} .login-cont .login-button:hover{border:1px solid #b9c97d;border-radius:6px;text-decoration:none;color:#fff;background-position:0 -108px;background:#a8b748;background:-moz-linear-gradient(top,#c4d323,#a8b748);background:-webkit-linear-gradient(top,#c4d323,#a8b748);} .login-cont .login-label{float:left;font-size:14px;width:112px;display:none;}.login-cont .login-qt{width:77px;height:60px;border-right:1px solid #b9c97d;}#J_loginGuide .login-shortcut{margin-top:20px;} </style> <script> function login(op) { var op = !op ? 0 : op; if(op) { $('loginlsform').cookietime.value = 2592000; } if($('19login_username').value == ""|| $('19login_password').value == "") { showWindow('login', 'member.php?mod=logging&action=login' + (op ? '&cookietime=1' : "")); } else { ajaxpost('loginlsform', 'return_ls', 'return_ls'); } return false;} function close_login(){ $('J_loginGuide').style.display="none"; } </script> <div id="J_loginGuide" class="login-wrap" style=""><div class="login-box"> <div class="login-user clearall"> <div class="login-title flflfl clearall"><h3 class="flflfl">您看了很久哦,登陆下吧!</h3> <span class="login-arrow flflfl"><img src="https://bbs.26x.net/source/plugin/crx_visitor/static/img/view_bg.png" class="vm" /></span></div> <div class="login-cont flflfl"> <ul> <form method="post" autocomplete="off" id="loginlsform" action="https://bbs.26x.net/member.php?mod=logging&action=login&loginsubmit=yes&infloat=yes&lssubmit=yes" onsubmit="pwmd5('ls_password');return login();"> <span id="return_ls" style="display:none"></span> <input type="hidden" name="quickforward" value="yes" /> <input type="hidden" name="handlekey" value="ls" /> <li> <input name="username" id="19login_username" class="txt" tabindex="1" value="请输入用户名" onclick="this.value = ''" placeholder="用户名"> <div class="login-item"> <label> <input id="uauto" name="cookietime" id="ls_cookietime" value="2592000" class="checkbox" checked="checked" tabindex="4" type="checkbox"> 下次自动登录</label></div> </li> <li> <input name="password" id="19login_password" class="txt" tabindex="2" placeholder="请输入密码" type="password"> <div class="login-item"> <a href="javascript:void(0);" onclick="showWindow('login', 'member.php?mod=logging&action=login&viewlostpw=1')">忘记密码?点此找回!</a> </div> </li> <li class="login-qt"> <button id="J_loginBtn" type="submit" class="login-button" tabindex="904"><em>登陆</em></button> <div class="login-item"><a href="member.php?mod=register" target="_blank">新用户注册</a></div> </li> <li class="login-shortcut color6"><span class="flflfl">用其它账号登录:</span> <a href="connect.php?mod=login&op=init&referer=index.php&statfrom=login_simple" target="_top" rel="nofollow"><img src="static/image/common/qq_login.gif" class="vm" alt="使用QQ号登录" /></a> </li> </form> </ul> <div id="J_loginGuidePopo" class="popo-id" style="display:none"> <div class="popo-bd popo-mod"> <p id="J_loginGuideTip"></p> <a href="javascript:void(0);" class="close" title="关闭">关闭</a> <p class="popo-aw"></p> </div> </div> </div> </div> <a href="javascript:void(0);" id="J_loginGuideClose" class="close" title="关闭" onclick="close_login()"></a> </div> </div> <script type="text/javascript"> var mw_brush = eval({"applescript":["AppleScript","true"],"actionscript3":["Actionscript3","true"],"bash":["Bash shell","true"],"coldfusion":["ColdFusion","true"],"c":["C","true"],"cpp":["C++","true"],"csharp":["C#","true"],"css":["CSS","true"],"delphi":["Delphi","true"],"diff":["Diff","true"],"erlang":["Erlang","true"],"groovy":["Groovy","true"],"html":["HTML","true"],"java":["Java","true"],"javafx":["JavaFX","true"],"javascript":["JavaScript","true"],"pascal":["Pascal","true"],"patch":["Patch","true"],"perl":["Perl","true"],"php":["PHP","true"],"text":["Plain Text","true"],"powershell":["PowerShell","true"],"python":["Python","true"],"ruby":["Ruby","true"],"rails":["Ruby on Rails","true"],"sass":["Sass","true"],"scala":["Scala","true"],"scss":["Scss","true"],"shell":["Shell","true"],"sql":["SQL","true"],"vb":["Visual Basic","true"],"vbnet":["Visual Basic .NET","true"],"xhtml":["XHTML","true"],"xml":["XML","true"],"xslt":["XSLT","true"],"objc":["Objective-C","true"],"asm":["Asm","true"],"aauto":["AAuto","true"],"golang":["Golang","true"],"lua":["Lua","true"],"typescript":["TypeScript","true"],"haxe":["Haxe","true"],"il":["IL","true"]}); var mw_gutter = 1; var mw_lang_codebox = { 'select_lang': '请输入要插入的代码<br>选择语言:', 'show_gutter': '显示行号:', 'your_code': '你的代码:', 'close': '关闭', 'submit': '提交', 'cancle': '取消' }; </script> <script type="text/javascript" src="https://bbs.26x.net/source/plugin/mw_syntaxhighlighter/static/js/mw_syntaxhighlighter.js?C1i"></script><script type="text/javascript" reload="1">mw_syntaxhighlighter("fastpost");</script><div id="ft" class="wp cl"> <div id="flk" class="y"> <p> <a href="//wpa.qq.com/msgrd?v=3&uin=1259812119&site=宜信同城网交流论坛&menu=yes&from=discuz" target="_blank" title="QQ"><img src="static/image/common/site_qq.jpg" alt="QQ" /></a><span class="pipe">|</span><a href="archiver/" >Archiver</a><span class="pipe">|</span><a href="forum.php?mobile=yes" >手机版</a><span class="pipe">|</span><a href="forum.php?mod=misc&action=showdarkroom" >小黑屋</a><span class="pipe">|</span><strong><a href="https://bbs.26x.net/" target="_blank">宜信同城网交流论坛</a></strong> ( <a href="https://beian.miit.gov.cn/" target="_blank">闽ICP备19021048号</a> )<span class="pipe">|</span><a href="habuluo_seo-sitemap.html" >站点地图</a><script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> <script>(function(){ var src = (document.location.protocol == "http:") ? "http://js.passport.qihucdn.com/11.0.1.js?3c78c49cf51a0802e9561f3b32b30d61":"https://jspassport.ssl.qhimg.com/11.0.1.js?3c78c49cf51a0802e9561f3b32b30d61"; document.write('<script src="' + src + '" id="sozz"><\/script>'); })(); </script></p> <p class="xs0"> GMT+8, 2026-3-28 02:13<span id="debuginfo"> , Processed in 0.424895 second(s), 11 queries , Redis On. </span> </p> </div> <div id="frt"> <p>Powered by <strong><a href="http://www.discuz.net" target="_blank">Discuz!</a></strong> <em>X3.4</em></p> <p class="xs0">Copyright © 2001-2020, Tencent Cloud.</p> </div></div> <script src="home.php?mod=misc&ac=sendmail&rand=1774635188" type="text/javascript"></script> <div id="scrolltop"> <span><a href="forum.php?mod=post&action=reply&fid=2&tid=152561&extra=page%3D1&page=1" onclick="showWindow('reply', this.href)" class="replyfast" title="快速回复"><b>快速回复</b></a></span> <span hidefocus="true"><a title="返回顶部" onclick="window.scrollTo('0','0')" class="scrolltopa" ><b>返回顶部</b></a></span> <span> <a href="forum-2-1.html" hidefocus="true" class="returnlist" title="返回列表"><b>返回列表</b></a> </span> </div> <script type="text/javascript">_attachEvent(window, 'scroll', function () { showTopLink(); });checkBlind();</script> </body> </html>