利用Ajax技術來檢測用戶名是否存在的原理流程圖:javascript
最終結果截圖:php
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Ajax檢測用戶名</title> <script type="text/javascript" src="ajax.js"></script> </head> <body> <form name="myform"> 用戶名:<input type="text" name="user" onblur="checkname();"> <span id="checkbox"></span> </form> </body> </html>
代碼解釋:
①實現該功能的核心代碼在ajax.js,須要另外引進
②給form命名,由於後面咱們須要利用JS來取得input框中的value
③給input框添加一個「onblur」事件,即當「焦點」失去時觸發該事件(即流程圖的「觸發控件」)
④<span id="checkbox"></span>用來放從服務器發送回來的數據(即「用戶名已存在」等)html
<?php mysql_connect("localhost",'root',''); mysql_select_db('test'); $sql="select * from ajax where name='$_GET[id]'"; $query=mysql_query($sql); if(is_array(mysql_fetch_array($query))){ echo "<font color=red>用戶名已存在</font>"; }else{ echo "<font color=green>用戶名可使用</font>"; } ?>
代碼解釋:
經過ajax的open方法,將用戶輸入」用戶名「經過id傳遞給進來(即$_GET[id]),此時將對指定的數據庫表中進行查詢,檢查是否有存在該「用戶名」
ajax.jsjava
// JavaScript Document var XHR; //定義一個全局對象 function createXHR(){ //首先咱們得建立一個XMLHttpRequest對象 if(window.ActiveXObject){//IE的低版本系類 XHR=new ActiveXObject('Microsoft.XMLHTTP');//以前IE壟斷了整個瀏覽器市場,沒遵循W3C標準,因此就有了這句代碼。。。但IE6以後開始有所改觀 }else if(window.XMLHttpRequest){//非IE系列的瀏覽器,但包括IE7 IE8 XHR=new XMLHttpRequest(); } } function checkname(){ var username=document.myform.user.value; createXHR(); XHR.open("GET","checkname.php?id="+username,true);//true:表示異步傳輸,而不等send()方法返回結果,這正是ajax的核心思想 XHR.onreadystatechange=byhongfei;//當狀態改變時,調用byhongfei這個方法,方法的內容咱們另外定義 XHR.send(null); } function byhongfei(){ if(XHR.readyState == 4){//關於Ajax引擎對象中的方法和屬性,能夠參考個人另外一篇博文:http://www.cnblogs.com/hongfei/archive/2011/11/29/2265377.html if(XHR.status == 200){ var textHTML=XHR.responseText; document.getElementById('checkbox').innerHTML=textHTML; } } }
代碼解釋:
①首先咱們須要聲明一個ajax引擎的對象:XHR(隨便命名一個)
②由於微軟的低版本IE和其餘的瀏覽器建立ajax對 象的方式不同,如今IE和其餘瀏覽器的市場份額幾乎各佔一半,因此咱們得兩方面都考慮到,IE-->ActiveXObject;其餘 -->XMLHttpRequest。我將她封裝在一個函數中:createXHR
③咱們在index.html中指定的當失去「焦點」 時就會觸發checkname()函數。那麼咱們如何將用戶輸入的「用戶名」捕獲呢?這裏,利用js便可輕鬆捕獲到 document.myform.user.value(如今知道爲什麼給form和input命名了吧,這一步對應流程圖的「得到填寫內容」),有興趣的 博友,能夠試試在createXHR()的前一行敲行代碼(alert(username)),將捕獲到的用戶名彈出試試看。
④Ajax引擎有幾個方法和屬性(能夠參考個人另外一篇博文:看圖理解:普通交互方式和Ajax交互方式區別),使用以前咱們得先調用函數craateXHR建立一個ajax對象
⑤有了ajax對象,有三個方法是必不可少的:open()、onreadystatechange、send()。
將請求發送到服務器,要使用open ()和send()方法
open()方法的第一個參數,指示採用GET或者POST方式進行傳輸。。。。。。
open()方法的第二個參數,指示要請求的URL地址(這裏咱們請求的是checkname.php文件),能夠是絕對或相對地址
open() 方法的第三個參數async指示是否採用異步請求,true爲採用,這種狀況下,經過ajax、js無需等待服務器響應,而是:①在等待服務器響應的同時 執行其餘腳本②當響應就緒後對響應進行處理。通常對一些小型的請求,async=false也是能夠的,但此時就不要編寫 onreadystatechange 函數了
onreadystatechange事件:當ajax的屬性readyState改變時,就觸 發此事件。在此事件中,當服務器響應已作好被處理的準備時(即readyState=4且status=200時),咱們規定要讓服務器作什麼任務,這裏 咱們規定將從數據庫檢索到的結果輸出到id爲」checkbox「的span標籤中。
⑥經過checkname.php,查詢數據庫後,將獲得 查詢結果(即服務器的響應,對應流程圖中的」查詢數據庫「),此時數據還在ajax引擎中,如需得到該來自服務器的響應,咱們須要使用 XMLHttpRequest對象的responText或responseXML屬性,並經過DOM屬性innerHTML將從服務器響應回來的數據設 置爲id=」checkbox「的span標籤的值
注:利用ajax監測郵箱是否存在一個道理,咱們還能夠利用ajax實時監測用戶輸入的密碼強度,此時,須要用到能夠把onblur事件改成onfocus事件。mysql
Suggestions:sql
這個例子包括三張頁面:數據庫
這是 HTML 表單。它包含一個簡單的 HTML 表單和指向 JavaScript 的連接:數組
<html> <head> <script src="clienthint.js"></script> </head> <body> <form> First Name: <input type="text" id="txt1" onkeyup="showHint(this.value)"> </form> <p>Suggestions: <span id="txtHint"></span></p> </body> </html>
正如您看到的,上面的 HTML 頁面含有一個簡單的 HTML 表單,其中帶有一個名爲 "txt1" 的輸入字段。
該表單是這樣工做的:
JavaScript 代碼存儲在 "clienthint.js" 文件中,它被連接到 HTML 文檔:
var xmlHttp function showHint(str) { if (str.length==0) { document.getElementById("txtHint").innerHTML="" return } xmlHttp=GetXmlHttpObject() if (xmlHttp==null) { alert ("Browser does not support HTTP Request") return } var url="gethint.php" url=url+"?q="+str url=url+"&sid="+Math.random() xmlHttp.onreadystatechange=stateChanged xmlHttp.open("GET",url,true) xmlHttp.send(null) } function stateChanged() { if (xmlHttp.readyState==4 || xmlHttp.readyState=="complete") { document.getElementById("txtHint").innerHTML=xmlHttp.responseText } } function GetXmlHttpObject() { var xmlHttp=null; try { // Firefox, Opera 8.0+, Safari xmlHttp=new XMLHttpRequest(); } catch (e) { // Internet Explorer try { xmlHttp=new ActiveXObject("Msxml2.XMLHTTP"); } catch (e) { xmlHttp=new ActiveXObject("Microsoft.XMLHTTP"); } } return xmlHttp; }
每當在輸入域中輸入一個字符,該函數就會被執行一次。
若是文本框中有內容 (str.length > 0),該函數這樣執行:
若是輸入域爲空,則函數簡單地清空 txtHint 佔位符的內容。
每當 XMLHTTP 對象的狀態發生改變,則執行該函數。
在狀態變成 4 (或 "complete")時,用響應文本填充 txtHint 佔位符 txtHint 的內容。
AJAX 應用程序只能運行在完整支持 XML 的 web 瀏覽器中。
上面的代碼調用了名爲 GetXmlHttpObject() 的函數。
該函數的做用是解決爲不一樣瀏覽器建立不一樣 XMLHTTP 對象的問題。
這一點在上一節中已經解釋過了。
被 JavaScript 代碼調用的服務器頁面是一個名爲 "gethint.php" 的簡單服務器頁面。
"gethint.php" 中的代碼會檢查名字數組,而後向客戶端返回對應的名字:
<?php // Fill up array with names $a[]="Anna"; $a[]="Brittany"; $a[]="Cinderella"; $a[]="Diana"; $a[]="Eva"; $a[]="Fiona"; $a[]="Gunda"; $a[]="Hege"; $a[]="Inga"; $a[]="Johanna"; $a[]="Kitty"; $a[]="Linda"; $a[]="Nina"; $a[]="Ophelia"; $a[]="Petunia"; $a[]="Amanda"; $a[]="Raquel"; $a[]="Cindy"; $a[]="Doris"; $a[]="Eve"; $a[]="Evita"; $a[]="Sunniva"; $a[]="Tove"; $a[]="Unni"; $a[]="Violet"; $a[]="Liza"; $a[]="Elizabeth"; $a[]="Ellen"; $a[]="Wenche"; $a[]="Vicky"; //get the q parameter from URL $q=$_GET["q"]; //lookup all hints from array if length of q>0 if (strlen($q) > 0) { $hint=""; for($i=0; $i<count($a); $i++) { if (strtolower($q)==strtolower(substr($a[$i],0,strlen($q)))) { if ($hint=="") { $hint=$a[$i]; } else { $hint=$hint." , ".$a[$i]; } } } } //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),則: