AJAX实时搜索
AJAX 可为用户提供更友好、交互性更强的搜索体验。
实例
在下面的实例中,我们将演示一个实时的搜索,在您键入数据的同时即可得到搜索结果。
实时的搜索与传统的搜索相比,具有很多优势:
当键入数据时,就会显示出匹配的结果
当继续键入数据时,对结果进行过滤
如果结果太少,删除字符就可以获得更宽的范围
输出效果如右图所示
上面实例中的结果在一个 XML 文件(3.xml)中进行查找。为了让这个例子小而简单,我们只提供 6 个结果。
本实例包括三个部分
HTML表单页面
PHP文件
XML文件
HTML表单页面
源码1.php如下
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <script> function showResult(str) { //如果输入框是空的(str.length==0),该函数会清空 livesearch 占位符的内容,并退出该函数 if (str.length==0) { document.getElementById("livesearch").innerHTML=""; document.getElementById("livesearch").style.border="0px"; return; } //输入框不是空的,则showResult() 会执行以下代码 //创建 XMLHttpRequest 对象 if (window.XMLHttpRequest) {// IE7+, Firefox, Chrome, Opera, Safari 浏览器执行 xmlhttp=new XMLHttpRequest(); } else {// IE6, IE5 浏览器执行 xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); } //创建在服务器响应就绪时执行的函数 xmlhttp.onreadystatechange=function() { if (xmlhttp.readyState==4 && xmlhttp.status==200) { document.getElementById("livesearch").innerHTML=xmlhttp.responseText; document.getElementById("livesearch").style.border="1px solid #A5ACB2"; } } //向服务器上的文件发送请求 xmlhttp.open("GET","2.php?q="+str,true); xmlhttp.send(); } </script> </head> <body> <!-- 键盘按键被松开时onkeyup 事件发生 ,调用showResult()函数--> <form> <p>在下面的文本框中输入 "HTML",搜索包含 HTML 的页面:</p> <input type="text" size="30" onkeyup="showResult(this.value)"> <div id="livesearch"></div> </form> </body> </html>
源代码解释:
如果输入框是空的(str.length==0),该函数会清空 livesearch 占位符的内容,并退出该函数。
如果输入框不是空的,那么 showResult() 会执行以下步骤:
创建 XMLHttpRequest 对象
创建在服务器响应就绪时执行的函数
向服务器上的文件发送请求
请注意添加到 URL 末端的参数(q)(包含输入框的内容)
PHP文件
上面这段通过 JavaScript 调用的服务器页面是名为 "2.php" 的 PHP 文件。
"2.php" 中的源代码会搜索 XML 文件中匹配搜索字符串的标题,并返回结果:
源码见2.php
<?php //创建XML DOM对象 $xmlDoc=new DOMDocument(); //加载XML文件到新的XML DOM对象 $xmlDoc->load("3.xml"); //将标签名为“link”的对象的集合赋值给$x $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)//元素的节点类型,1:元素节点,2:属性节点 { // 找到匹配搜索的链接 if (stristr($y->item(0)->childNodes->item(0)->nodeValue,$q)) { if ($hint=="") { $hint="<a href='" . $z->item(0)->childNodes->item(0)->nodeValue . "' target='_blank'>" . $y->item(0)->childNodes->item(0)->nodeValue . "</a>"; } else { $hint=$hint . "<br /><a href='" . $z->item(0)->childNodes->item(0)->nodeValue . "' target='_blank'>" . $y->item(0)->childNodes->item(0)->nodeValue . "</a>"; } } } } } // 如果没找到则返回 "no suggestion" if ($hint=="") { $response="no suggestion"; } else { $response=$hint; } echo $response;// 输出结果 ?>
如果 JavaScript 发送了任何文本(即 strlen($q) > 0),则会发生:
PHP 创建 "links.xml" 文件的一个 XML DOM 对象
遍历所有的 <title> 元素 (nodetypes = 1),以便找到匹配 JavaScript 所传文本
找到包含正确 title 的 link,并设置为 "$response" 变量,如果找到多于一个匹配,所有的匹配都会添加到变量。
如果没有找到匹配,则把 $response 变量设置为 "no suggestion"。
$response 是送往 "livesearch" 占位符的输出
XML文件
源码见3.php
<?xml version="1.0" encoding="UTF-8"?> <pages> <link> <title>HTML a 标签</title> <url>http://www.php.cn/tags/tag-a.html</url> </link> <link> <title>HTML br 标签</title> <url>http://www.php.cn/tags/tag-br.html</url> </link> <link> <title>CSS background 属性</title> <url>http://www.php.cn/cssref/css3-pr-background.html</url> </link> <link> <title>CSS border 属性</title> <url>http://www.php.cn/cssref/pr-border.html</url> </link> <link> <title>JavaScript Date 对象</title> <url>http://www.php.cn/jsref/jsref-obj-date.html</url> </link> <link> <title>JavaScript Array 对象</title> <url>http://www.php.cn/jsref/jsref-obj-array.html</url> </link> </pages>
学习心得
本例子主要包括如下知识点:
表单基础
onkeyup事件:在键盘按键被松开时发生
函数调用、函数传值
AJAX XMLHttpRequest对象的创建、在服务器响应的时候执行的函数、向服务器上的文件发送请求:见1-5讲学习心得
HTML DOM getElementById()方法:返回对拥有指定 ID 的第一个对象的引用
l XML相关知识
创建XML DOM对象
加载XML文件到新的XML DOM对象
取出特定标签名的对象:getElementsByTagName()
获得特定元素的子节集合:HTML DOM childNodes
获得第一个 button 元素的节点值:HTML DOM nodeValue
返回元素的首个子节点:HTML DOM item() 方法
相关函数:
Strlen():返回字符串的长度
Stristr():搜索字符串在另一字符串中的第一次出现