国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發(fā) > XML > 正文

XMLHttpRequest創(chuàng)建智能表單

2024-07-21 02:04:28
字體:
供稿:網(wǎng)友

16.4  使用xmlhttprequest創(chuàng)建智能表單

我們可能已經(jīng)多次遇到過這樣的情況:當(dāng)通過某個web站點(diǎn)的表單注冊用戶,或者申請注冊一個基于web界面的電子郵箱時,在我們填寫完長長的表單之后,結(jié)果卻發(fā)現(xiàn)我們申請的用戶名已經(jīng)被其他人占用了。最糟糕的就是直到我們填完表單并提交,且頁面被重新加載之后,我們才能發(fā)現(xiàn)所申請的用戶名是否已經(jīng)被他人使用,并且重新加載頁面之后我們已經(jīng)輸入的某些信息就可能已經(jīng)丟失,我們不得不再次重新輸入這些信息。幸運(yùn)的是,ajax可以消除這種令人沮喪的用戶體驗(yàn),并在用戶提交表單之前,告訴用戶他所申請的用戶名是否可用。

我們可以采用多種不同的方法來解決這一問題,最簡單的辦法就是提供一個超鏈接以發(fā)起一個到目標(biāo)服務(wù)器程序的http請求,以檢查用戶申請的用戶名等信息是否可用。

下面我們將創(chuàng)建一個類似于常見注冊頁面的表單。該表單將包含以下幾個字段:

●       username(須校驗(yàn)字段)—— 用戶在該字段中輸入希望申請的用戶名。

●       email(須校驗(yàn)字段)—— 用戶在該字段中輸入他的e-mail。

●       password(無須校驗(yàn)字段)—— 用戶在該字段中輸入他的密碼。

●       verify password(無須校驗(yàn)字段)—— 用戶在該字段中再次輸入密碼,與前一次輸入的密碼進(jìn)行比較,以檢查兩次輸入的密碼是否一致。

注意,在本例中,password和verify password字段僅僅作為表單的字段進(jìn)行演示。實(shí)際上,密碼校驗(yàn)是由服務(wù)器端的程序和數(shù)據(jù)庫來完成的,但是,在提交表單之前,可以使用javascript來檢查兩次輸入的密碼是否一致,這比將兩個密碼的檢查放在服務(wù)器端更加有效率。

在username和email字段之后,將包含一個超鏈接,該超鏈接將調(diào)用一個javascript函數(shù),并使用本章前面創(chuàng)建的httprequest類來發(fā)起一個請求,以向目標(biāo)服務(wù)器查詢當(dāng)前用戶輸入的username或email是否有效。服務(wù)器端的程序是一個簡單的php程序文件。雖然關(guān)于php程序設(shè)計(jì)的相關(guān)內(nèi)容并不在本書的范圍,但是我們將討論一下如何向該php程序發(fā)起請求以驗(yàn)證數(shù)據(jù),以及如何將響應(yīng)返回的數(shù)據(jù)回送給javascript使用。

16.4.1  如何向服務(wù)器端的php程序查詢信息

服務(wù)器端的php程序?qū)⒃诓樵冏址胁檎乙韵聝蓚€參數(shù):username參數(shù)或者email參數(shù)。

要檢查用戶名是否可用,只需使用username參數(shù)。一個請求查詢用戶名是否可用的查詢字符串將如下所示:

http://localhost/formvalidator.php?username=[usernametosearchfor]

當(dāng)實(shí)際查詢某一個用戶名時,只需將[usernametosearchfor]替換為實(shí)際要查詢的用戶名即可。

查詢e-mail的方法與此類似。一個查詢e-mail是否有效的url將如下所示:

http://localhost/formvalidator.php?email=[emailtosearchfor]

16.4.2  從服務(wù)器返回的數(shù)據(jù)

如果查詢請求成功,則將返回以下兩個值之一:

●       available—— 該值表示所查詢的用戶名或e-mail有效。

●       not available—— 該值表示所查詢的用戶名或e-mail已經(jīng)被注冊,因此當(dāng)前所輸入的注冊信息無效。

從服務(wù)器端返回的值將以純文本的方式發(fā)送給客戶端。客戶端javascript只須通過一個簡單的比較,即可告訴用戶他所輸入的用戶名或e-mail是否已經(jīng)被注冊。

16.4.3  在開始編寫代碼之前

由于這是一個在線的(live-code)ajax實(shí)例,因此要運(yùn)行該實(shí)例,計(jì)算機(jī)必須滿足如下所示的幾點(diǎn)要求。

1. 計(jì)算機(jī)上必須有一個web服務(wù)器

首先,php程序必須運(yùn)行在一個web服務(wù)器上,因此必須在計(jì)算機(jī)上安裝一個web服務(wù)器。如果你使用的是windows 2000(個人版或服務(wù)器版)、windows xp professional或者windows server 2003,則這些操作系統(tǒng)中已經(jīng)提供了一個免費(fèi)的web服務(wù)器以供使用,即internet information services(iis)。要安裝iis服務(wù)器,只需在windows操作系統(tǒng)的控制面板中打開add/remove programs,并單擊add/remove windows components即可。圖16-3展示了windows xp professional系統(tǒng)中的windows components wizard窗口。

只需選中internet information services(iis)選項(xiàng)前面的復(fù)選框,然后單擊next按鈕即可進(jìn)行安裝。安裝時可能需要使用操作系統(tǒng)的安裝光盤,以完成iis的安裝。

如果你所使用的不是以上幾種操作系統(tǒng),或者你希望使用其他的web服務(wù)器,那么你可以下載并安裝一個apache http server(www.apache.org)。apache http server是一個開放源代碼的web服務(wù)器,它可以運(yùn)行在多種操作系統(tǒng)之上,如linux系統(tǒng)、unix系統(tǒng)和windows系統(tǒng)等。

圖  16-3

2. php

php是一種比較流行的開放源代碼的服務(wù)器端腳本語言。如果想運(yùn)行php腳本,必須在計(jì)算機(jī)上安裝php。從www.php.net上可以下載到各種形式的php安裝程序(如二進(jìn)制形式、windows安裝向?qū)问健⒒蛘遬hp的源代碼形式)。本例中的php代碼是用php 4編寫的,但在php 5中這些代碼也能照常運(yùn)行。

 

打開文本編輯器并輸入下列代碼:

<html>

<head>

<title>form field validation</title>

<style type="text/css">

.fieldname

{

text-align: right;

}

.submit

{

text-align: right;

}

</style>

<script type="text/javascript" src="httprequest.js"></script>

<script type="text/javascript">

function checkusername()

{

var uservalue = document.getelementbyid("username").value;

if (uservalue == "")

{

alert("please enter a user name to check!");

return;

}

var url = "formvalidator.php?username=" + uservalue;

var request = new httprequest(url, checkusername_callback);

request.send();

}

function checkusername_callback(sresponsetext)

{

var uservalue = document.getelementbyid("username").value;

if (sresponsetext == "available")

{

alert("the username " + uservalue + " is available!");

}

else

{

alert("we’re sorry, but " + uservalue + " is not available.");

}

}

function checkemail()

{

var emailvalue = document.getelementbyid("email").value;

if (emailvalue == "")

{

alert("please enter an email address to check!");

return;

}

var url = "formvalidator.php?email=" + emailvalue;

var request = new httprequest(url, checkemail_callback);

request.send();

}

function checkemail_callback(sresponsetext)

{

var emailvalue = document.getelementbyid("email").value;

if (sresponsetext == "available")

{

alert("the email " + emailvalue + " is currently not in use!");

}

else

{

alert("i’m sorry, but " + emailvalue + " is in use by another user.");

}

}

</script>

</head>

<body>

<form>

<table>

<tr>

<td class="fieldname">

username:

</td>

<td>

<input type="text" id="username" />

</td>

<td>

<a href="javascript: checkusername()">check availability</a>

</td>

</tr>

<tr>

<td class="fieldname">

email:

</td>

<td>

<input type="text" id="email" />

</td>

<td>

<a href="javascript: checkemail()">check availability</a>

</td>

</tr>

<tr>

<td class="fieldname">

password:

</td>

<td>

<input type="text" id="password" />

</td>

<td />

</tr>

<tr>

<td class="fieldname">

verify password:

</td>

<td>

<input type="text" id="password2" />

</td>

<td />

</tr>

<tr>

<td colspan="2" class="submit">

<input type="submit" value="submit" />

</td>

<td />

</tr>

</table>

</form>

</body>

</html>

將上面的代碼保存在web服務(wù)器的根目錄中。如果你使用的web服務(wù)器是iis,則將上面的代碼保存為c:/inetpub/wwwroot/validate_form.htm文件。如果你使用的web服務(wù)器是apache,則可將上面的代碼保存在htdocs文件夾之下,即保存為pathtohtdocs/htdocs/validate_form.htm文件。

另外,我們還需要將httprequest.js文件(定義了httprequest類)和formvalidator.php文件放在與validate_form.htm文件相同的目錄中。

現(xiàn)在,我們可以打開瀏覽器,在地址欄中輸入http://localhost/formvalidator.php。如果web服務(wù)器工作正常的話,你將看到頁面上顯示出“php is working correctly. congratulations!”這樣一段文本信息,如圖16-4所示。

圖  16-4

接下來,如果在瀏覽器的地址欄中輸入http://localhost/validate_form.htm,你將看到一個如圖16-5所示的頁面。

圖  16-5

在username文本框中輸入jmcpeak,并單擊文本框旁邊的check availability超鏈接,你將看到一個彈出的信息對話框,如圖16-6所示。

圖  16-6

接下來,在email文本框中輸入someone@xyz.com,并單擊文本框旁邊的check availability超鏈接。你將看到一個消息對話框彈出,并提示你該e-mail已經(jīng)被注冊了。我們還可以在username文本框和email文本框中輸入我們自己的用戶名和e-mail地址,并單擊文本框旁邊相應(yīng)的超鏈接進(jìn)行檢查。也許信息對話框?qū)⒏嬖V你所輸入的用戶名或e-mail是有效的(注意:在服務(wù)器端的php程序中,假定了用戶名jmcpeak和pwilton,電子郵箱someone@xyz.com和someone@zyx.com已經(jīng)被注冊)。

代碼解說

該html頁面中包含一個簡單的表單,表單中的各個字段通過一個表格來進(jìn)行頁面布局的處理。在表格中,每一個表單字段占用一個表格行。表格的前兩行就是我們最感興趣的字段,即username字段和email字段。相應(yīng)的html代碼如下所示:

<form>

<table>

<tr>

<td class="fieldname">

username:

</td>

<td>

<input type="text" id="username" />

</td>

<td>

<a href="javascript: checkusername()">check availability</a>

</td>

</tr>

<tr>

<td class="fieldname">

email:

</td>

<td>

<input type="text" id="email" />

</td>

<td>

<a href="javascript: checkemail()">check availability</a>

</td>

</tr>

<!-- html to be continued later -->

表格的第一列包含了字段的標(biāo)題。第二列則包含了<input/>元素本身。這些標(biāo)記都有id屬性,username用于username域,email用于email域。這使用戶可以很容易地找到<input/>元素并將文本輸入其中。第三列中則包含了一個相應(yīng)的超鏈接(<a/>元素),該超鏈接使用javascript:協(xié)議來調(diào)用javascript代碼。在本例中,當(dāng)用戶單擊username字段之后的超鏈接時,將調(diào)用checkusername()函數(shù),當(dāng)用戶單擊了email字段之后的超鏈接時,將調(diào)用checkemail()函數(shù)。稍后我們將討論這兩個函數(shù)。

表格的其余三行包含了兩個密碼字段和一個submit按鈕(在本例的表單中并不涉及這幾個字段)。其前兩行同樣也包含了三列:第一列是描述性的字段標(biāo)題,第二列則包含了<input/>元素,第三列為空。定義這三個表格行的html代碼如下所示:

<!-- html continued from earlier -->

<tr>

<td class="fieldname">

password:

</td>

<td>

<input type="text" id="password" />

</td>

<td />

</tr>

<tr>

<td class="fieldname">

verify password:

</td>

<td>

<input type="text" id="password2" />

</td>

<td />

</tr>

<tr>

<td colspan="2" class="submit">

<input type="submit" value="submit" />

</td>

<td />

</tr>

</table>

</form>

最后一行則包含了兩個單元格。第一個單元格跨越了表格的兩列,其中包含了表單的submit按鈕。第二個單元格則為空。

該html頁面中的css僅包含了如下所示的兩個樣式規(guī)則:

.fieldname

{

text-align: right;

}

.submit

{

text-align: right;

}

這兩個樣式規(guī)則用于設(shè)置表格中元素的對齊方式,以使表單看上去整齊而有序。

在這個實(shí)例中,字段之后的超鏈接是實(shí)現(xiàn)ajax功能的關(guān)鍵,當(dāng)單擊超鏈接時將調(diào)用相應(yīng)的javascript函數(shù)。首先,我們來討論一下第一個函數(shù)checkusername(),該函數(shù)用以獲取用戶在username文本框中輸入的用戶名,并使用該信息執(zhí)行一個http請求。

function checkusername()

{

var uservalue = document.getelementbyid("username").value;

if (uservalue == "")

{

alert("please enter a user name to check!");

return;

}

var url = "formvalidator.php?username=" + uservalue;

var request = new httprequest(url, checkusername_callback);

request.send();

}

在上面的代碼中,為了獲取用戶名,使用了document.getelementbyid()方法以引用該<input/>元素,使用value屬性以獲取用戶在username文本框中輸入的用戶名,并將用戶名保存在變量uservalue中。接下來,將變量uservalue的值與空字符串(" ")進(jìn)行比較。如果username文本框中的值為空,則提示用戶輸入用戶名,并使用return語句返回以結(jié)束函數(shù)的執(zhí)行。如果不對用戶名為空的情況進(jìn)行檢查,則可能會向服務(wù)器發(fā)送一些不必要的請求。

在checkusername()中,接下來的代碼構(gòu)造了一個url字符串并將其保存在變量url中,該url是一個向目標(biāo)服務(wù)器php程序發(fā)送請求的查詢字符串。隨后,創(chuàng)建了一個httprequest對象,將url和回調(diào)函數(shù)傳遞給httprequest()構(gòu)造函數(shù),并向目標(biāo)服務(wù)器發(fā)送請求。

當(dāng)httprequest對象成功地從服務(wù)器獲得響應(yīng)之后,回調(diào)函數(shù)checkusername_callback()將被執(zhí)行。該函數(shù)將根據(jù)請求返回的信息告訴用戶所申請的用戶名是否有效。注意,從服務(wù)器返回的值只包含兩個可能的值:available和not available,因此,我們僅須檢查這兩個可能的值之一。相應(yīng)代碼如下所示:

function checkusername_callback(sresponsetext)

{

var uservalue = document.getelementbyid("username").value;

if (sresponsetext == "available")

{

alert("the username " + uservalue + " is available!");

}

else

{

alert("we’re sorry, but " + uservalue + " is not available.");

}

}

如果服務(wù)器返回的響應(yīng)是available,則該函數(shù)將告訴用戶當(dāng)前申請的用戶名有效。否則如果返回的響應(yīng)是not available,則該函數(shù)將告訴用戶當(dāng)前申請的用戶名已經(jīng)被占用。

檢查電子郵件是否有效也可以采用類似的方法。checkemail()函數(shù)用于獲取用戶在email字段中輸入的數(shù)據(jù),并將該信息發(fā)送給服務(wù)器端的php程序。

function checkemail()

{

var emailvalue = document.getelementbyid("email").value;

if (emailvalue == "")

{

alert("please enter an email address to check!");

return;

}

var url = "formvalidator.php?email=" + emailvalue;

var request = new httprequest(url, checkemail_callback);

request.send();

}

回調(diào)函數(shù)checkemail_callback()與checkusername_callback()函數(shù)的功能類似。在checkemail_callback()函數(shù)中采用了相同的程序邏輯,該函數(shù)將根據(jù)請求返回的信息告訴用戶所輸入的e-mail是否有效。

function checkemail_callback(sresponsetext)

{

var emailvalue = document.getelementbyid("email").value;

if (sresponsetext == "available")

{

alert("the email " + emailvalue + " is currently not in use!");

}

else

{

alert("i’m sorry, but " + emailvalue + " is in use by another user.");

}

}

同樣,在checkemail_callback()函數(shù)中,檢查從服務(wù)器返回的響應(yīng)是否是available,如果是,則通知用戶他輸入的e-mail可以使用。如果從服務(wù)器返回的響應(yīng)是not available,則通知用戶他輸入的e-mail已經(jīng)被其他用戶注冊。

使用xmlhttprequest對象并不是唯一的解決辦法,下面我們將介紹使用iframe方式來實(shí)現(xiàn)該表單的功能。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 宜城市| 益阳市| 南陵县| 连南| 南岸区| 临夏市| 江源县| 大余县| 炎陵县| 福安市| 广丰县| 虞城县| 临邑县| 朝阳县| 克拉玛依市| 互助| 增城市| 常山县| 西盟| 广宁县| 曲阜市| 扎赉特旗| 黄龙县| 松滋市| 尚志市| 井研县| 红桥区| 高邮市| 南陵县| 锡林郭勒盟| 济南市| 浦城县| 平湖市| 曲周县| 石柱| 宜黄县| 聂荣县| 寿宁县| 石首市| 荔浦县| 于田县|