【連載】研究EasyUI系統(tǒng)——Form組件

在html標(biāo)準(zhǔn)中,form標(biāo)簽作為表單元素,作用是將表單內(nèi)諸如<input>、<select>等用戶可輸入編輯元素的值提交給服務(wù)器。easyui框架中,form作為一個(gè)單獨(dú)的控件,功能和傳統(tǒng)的form表單類似,并具備了很多獨(dú)有的特性。
下面我們通過一個(gè)簡易的用戶自主注冊程序,了解一下form的用法。
  注冊程序包含registerDemo.php、registerUser.php、demo_user.sql三個(gè)文件,registerDemo.php為用戶界面,registerUser.php為邏輯處理模塊,demo_user.sql為數(shù)據(jù)庫表。

demo_user.sql

/* 用戶表 */
CREATE TABLE IF NOT EXISTS demo_user
(
    user_id INT AUTO_INCREMENT, /*主鍵 ,自增*/
    user_name VARCHAR(16), /* 用戶名 */
    user_pass VARCHAR(32), /* 密碼 */
    user_date DATETIME, /* 注冊日期 */
    PRIMARY KEY(user_id)
)

registerDemo.php

<!-- 本頁構(gòu)造用戶界面 -->
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <link rel="stylesheet" type="text/css" href="easyui/themes/default/easyui.css" />
        <link rel="stylesheet" type="text/css" href="easyui/themes/icon.css" />
        <script type="text/javascript" src="easyui/jquery.min.js"></script>
        <script type="text/javascript" src="easyui/jquery.easyui.min.js"></script>
        <title>registerDemo</title>
        <style>
            .regContainer {
                width:360px;
                height: 270px;
                border: 1px solid lightblue;
                border-radius: 5px;
                text-align: center;
            }
            .regInput {
                margin-top: 20px;
            }
            .regTitle {
                width:100%;
                margin-top: 10px;
                text-align: center;
                font-family: '黑體';
                font-size: 16px;
            }
            .regDivide {
                height:1px;
                width:100%;
                background: lightblue;
                margin: 10px 0 10px 0
            }
        </style>
    </head>
    <body>
        <div class="contianer">
            <form id='frmRegister' method="post">
                <div class="regContainer">
                    <div class="regTitle">FORM組件(注冊)</div>
                    <div class="regDivide"></div>
                    <div class="regInput">
                        <input id="user" name="user" class="easyui-textbox"  
                          data-options="iconCls:'icon-man',width:250,height:35,prompt:'輸入用戶名'">
                    </div>
                    <div class="regInput">
                        <input id="pwd" name="pwd" class="easyui-textbox" 
                          data-options="iconCls:'icon-lock',width:250,height:35,type:'password'">
                    </div>
                    <div class="regInput">
                        <input id="pwd2" name="pwd2" class="easyui-textbox" 
                          data-options="iconCls:'icon-lock',width:250,height:35,type:'password'">
                    </div>
                    <div class="regInput">
                        <a class="easyui-linkbutton" onclick="regUser();" href="javascript:void(0)" 
                          data-options="iconCls:'icon-add',width:80,height:30">
                          注冊
                        </a>
                    </div>
                </div>
            </form>
        </div>
        
        <script>
            $("#frmRegister").form({
                url:"model/registerUser.php",
                onSubmit:function() {
                    /* 獲取用戶名密碼,$.trim過濾空格、tab等空白字符 */
                    var name = $.trim($("#user").textbox("getValue"));
                    var pwd = $.trim($("#pwd").textbox("getValue"));
                    var pwd2 = $.trim($("#pwd2").textbox("getValue"));
                    if (name == "" || pwd == "" || pwd2 == "") {
                        alert("用戶名或密碼為空");
                        return false;
                    }
                    else if (pwd != pwd2) {
                        alert("兩次輸入的密碼不同");
                        return false;
                    }
                    return true;
                },
                success:function(data) {
                    var data = eval('(' + data + ')');
                    if (data.success == 1) {
                        alert("注冊成功");
                    }
                    else {
                        alert("注冊失敗:" + data.msg);
                    }
                }
            });
            
            function regUser() {
                $("#frmRegister").form("submit");
            }
            
        </script>
    </body>
</html>

registerUser.php

<?php
/* 
 * 本模塊實(shí)現(xiàn)用戶注冊 
 */

/* 以下是數(shù)據(jù)庫信息 */
define ("DATABASE","mysql");
define ("DATABASE_NAME","easyuidemo2");
define ("DATABASE_USER","root");
define ("DATABASE_PASSWORD","12345");
define("DATABASE_HOST","localhost");
define ("DATABASE_TABLE_NAME", "demo_user");
define("DSN", DATABASE . ":" . "host=" . DATABASE_HOST . ";dbname=" . DATABASE_NAME . ";charset=utf8");

header("Content-Type:text/html; charset=utf-8");
date_default_timezone_set("Asia/Shanghai");

/* 定義返回給請求頁面的反饋數(shù)據(jù)包 */
$result= Array("success"=>0, "msg"=>"");

$user = trim(filter_input(INPUT_POST, "user"));
$pwd = trim(filter_input(INPUT_POST, "pwd"));
$pwd2 = trim(filter_input(INPUT_POST, "pwd2"));

if (!$user || !$pwd || !$pwd2) {
    $result["success"] = 0;
    $result["msg"] = "用戶名或密碼不能為空";
    echo json_encode($result);
    exit();
}
else if (!$pwd != !$pwd2) {
    $result["success"] = 0;
    $result["msg"] = "兩次輸入的密碼不同";
    echo json_encode($result);
    exit();
}

try {
    /* 通過pdo來操作數(shù)據(jù)庫 */
    $db_pdo = new PDO(DSN, DATABASE_USER, DATABASE_PASSWORD);
    $db_pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
    
    /* 獲取當(dāng)前日期時(shí)間 */
    $d = date("Y-m-d H:i:s",time());
    
    $sql = "INSERT INTO " . DATABASE_TABLE_NAME . " VALUES (NULL, :user, :pwd, '$d');";
    $stmt = $db_pdo->prepare($sql);
    
    if (!$stmt) {
        throw new Exception("注冊用戶失敗(數(shù)據(jù)庫連接錯誤)");
    }
    if (!$stmt->execute(array(":user"=>$user, ":pwd"=>$pwd))) {
        throw new Exception("注冊用戶失敗(數(shù)據(jù)庫賦值錯誤)");
    }
    $result["success"] = 1;
    $result["msg"] = "用戶注冊成功!";
    echo json_encode($result);
    
} catch (Exception $ex) {
    $result["success"] = 0;
    /* $ex->getMessage()用于獲取try塊中構(gòu)造Exception時(shí)賦予的錯誤說明 */
    $result["msg"] = $ex->getMessage();
    echo json_encode($result);
}

然后來看一下效果圖:

form效果圖

  這是一個(gè)典型的并且十分簡易的用戶自主注冊頁面,在registerDemo.php頁面,我們構(gòu)造了一個(gè)用戶界面,包括讓用戶輸入用戶名、輸入密碼、確認(rèn)密碼的三個(gè)文本框(文本框使用了easyui中的textbox組件,我們會為它專門寫一篇),以及用于提交的按鈕(按鈕使用了easyui中的linkbutton組件,我們當(dāng)然也會專門為它寫一篇)。
  我們使用了easyui框架中的form組件,用戶一切輸入就緒后,點(diǎn)擊“注冊”按鈕,調(diào)用regUser方法。regUser方法對form組件調(diào)用“submit”方法進(jìn)行了包裝,form通過submit方法向服務(wù)器提交表單內(nèi)容,從而完成注冊。
  接下去,我們結(jié)合上例代碼,細(xì)致地說明form組件的屬性、方法和事件。
  
form組件屬性:

屬性名稱 屬性值類型 屬性默認(rèn)值 描述
novalidate 布爾值 false 是否對表單內(nèi)的字段進(jìn)行驗(yàn)證。<br />1.4及以上版本支持。
ajax 布爾值 true 是否以ajax方式提交。<br />1.4及以上版本支持。
queryParams json對象 {} 額外的參數(shù)。<br />1.4及以上版本支持。
url 字符串 null 提交至的目標(biāo)。

novalidate表示是否要驗(yàn)證表單內(nèi)的字段。這個(gè)屬性和form組件內(nèi)的各組件息息相關(guān)。在這之前,我們再提及一個(gè)easyui框架中的組件,即validatebox,validatebox專門用于作為form表單中的輸入控件,它具有輸入內(nèi)容驗(yàn)證的功能,防止空數(shù)據(jù)以其他不符合規(guī)范的數(shù)據(jù)。上例中,form里面我們用到了textbox組件,textbox依賴于validatebox,所有textbox同樣具有內(nèi)容驗(yàn)證功能(其他所有依賴于validatebox的組件都有該功能),如果novalidate屬性設(shè)為true,form提交時(shí)便會對組件內(nèi)的各輸入組件進(jìn)行驗(yàn)證。當(dāng)然,上例代碼為突出form組件本身,并沒有用到textbox的驗(yàn)證功能。
  ajax屬性表示是否以ajax形式提交,傳統(tǒng)html中的form表單是非ajax方式,easyui中的form默認(rèn)是ajax方式。拿上例代碼來說,ajax方式下,瀏覽器將registerDemo.php中的請求數(shù)據(jù)提交服務(wù)器后,依然停留在registerDemo.php頁面,并等待服務(wù)器的反饋(即registerUser.php的返回?cái)?shù)據(jù)),然后顯示提示信息。如果不是ajax方式,registerDemo.php提交后,將直接跳轉(zhuǎn)至registerUser.php,用戶最后看到的是帶有提示信息的空白頁。
  queryParams屬性允許用戶提交除了form組件內(nèi)部表單元素外的參數(shù),也就是說,除了name、pwd、pwd2之外,還想再提交給服務(wù)器幾個(gè)參數(shù),可以用queryParams屬性,同樣也是以post方式提交。具體用法:

$("#frmRegister").form({queryParams:{param1: "p1", param2: "p2"}});

如此一來,額外的參數(shù)param1和param2便可同三個(gè)textbox內(nèi)容一起提交給registerUser.php了。
  url表示表單提交到哪里,等價(jià)于傳統(tǒng)form表單中的action,是個(gè)目標(biāo)地址。

form組件方法:

方法名稱 參數(shù) 描述
submit options 提交表單。參數(shù)為JSON對象。
load data 將數(shù)據(jù)加載到表單各字段中。
clear 清空表單字段值。
reset 重置表單。1.3.2及以上版本支持。
validate 驗(yàn)證表單,如果字段符合要求,返回true,否則返回false。
enableValidation 開啟驗(yàn)證。1.3.4及以上版本支持。
disableValidation 關(guān)閉驗(yàn)證。1.3.4及以上版本支持。

submit方法用于提交表單,參數(shù)可有可無。本文中的代碼便是沒有參數(shù)的。即便有參數(shù),用法也很簡單:

<script>
    $(“#fromRegister”).form("submit",{
        url:"model/registerUser.php",
        onSubmit:function() { …… },
        success:function(data) {……}
    });
</script>

參數(shù)就是一系列form組件的屬性值集合,我們往往直接使用submit配合參數(shù)進(jìn)行數(shù)據(jù)提交。
  load方法的參數(shù)既可以是url,也可以是json,它的作用是將url或者json中的數(shù)據(jù)填充到對應(yīng)的form內(nèi)各組件中。

<script>
    /*load方法用法一*/
    $(“#fromRegister”).form("load",{
        user:"guest",
        pwd:"12345",
        pwd2:"12345"
    });
    
    /*load方法用法二*/
    $(“#fromRegister”).form("load",”data/info.json”);
</script>

load方法調(diào)用后,form組件內(nèi)的三個(gè)textbox組件均被賦值,用戶名輸入欄內(nèi)容為“guest”,兩個(gè)密碼框內(nèi)容為“12345”。請注意,user、pwd、pwd2分別對應(yīng)textbox組件所在<input>標(biāo)簽中的name屬性。如果是url,那么url對應(yīng)的頁面內(nèi)容也應(yīng)該為json。
  clear方法清空form組件內(nèi)其他組件或元素的值。
  reset方法則將form組件內(nèi)其他組件或元素重置成默認(rèn)值。reset與clear不同,很多組件的默認(rèn)值不為空,例如用戶名默認(rèn)為admin。
  validate對form組件內(nèi)所有具有內(nèi)容驗(yàn)證功能的組件進(jìn)行驗(yàn)證,全部符合要求返回true,否則返回false。
  enableValidation和disableValidation分別為開啟驗(yàn)證功能和關(guān)閉驗(yàn)證功能。

form組件事件:

事件名稱 參數(shù) 描述
onSubmit param 表單提交前觸發(fā)。
success data 表單成功提交后觸發(fā)。
onBeforeLoad param 加載數(shù)據(jù)前觸發(fā)。
onLoadSuccess data 數(shù)據(jù)加載完成后觸發(fā)。
onLoadError 數(shù)據(jù)加載出錯是觸發(fā)。

onSubmit已經(jīng)通過例子代碼詳細(xì)介紹,需要注意的是,onSubmit事件返回false時(shí),表單不會提交給服務(wù)器,返回true才提交。參數(shù)param是屬性queryParmas的值,也就是額外的請求參數(shù)。
  success也在例子代碼中也有詳細(xì)說明,參數(shù)data為服務(wù)器返回給請求頁面的數(shù)據(jù)。
  onBeforeLoad、onLoadSuccess和onLoadError都和load方法有關(guān),他們?nèi)咴趌oad方法執(zhí)行的不同階段或不同場景分別被觸發(fā),因?yàn)楸容^簡單,也不多做說明。參數(shù)param與onSubmit的參數(shù)一致,均為queryParmas的值。需要說明的是,onBeforeLoad事件只在“l(fā)oad”方法以url形式被調(diào)用時(shí)才會被觸發(fā),以json形式加載本地?cái)?shù)據(jù)時(shí)并不會觸發(fā)該事件。
  本文代碼僅是作為介紹form組件之用,安全性缺乏保障,數(shù)據(jù)都是以明文形式在網(wǎng)絡(luò)中進(jìn)行傳輸,并且以明文形式存入數(shù)據(jù)庫。應(yīng)當(dāng)通過MD5、SHA256等散列算法或其他加密算法提高數(shù)據(jù)安全性。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,488評論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,034評論 3 414
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,327評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,554評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,337評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 54,883評論 1 321
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,975評論 3 439
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,114評論 0 286
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,625評論 1 332
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,555評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,737評論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,244評論 5 355
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 43,973評論 3 345
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,362評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,615評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,343評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,699評論 2 370

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,776評論 18 139
  • React中沒有類似Angular那樣的雙向數(shù)據(jù)綁定,在做一些表單復(fù)雜的后臺類頁面時(shí),監(jiān)聽、賦值、傳遞、校驗(yàn)時(shí)編碼...
    tedyuen777閱讀 9,880評論 1 23
  • 1.從載入EasyUI開始 讀者需要到EasyUI官網(wǎng)中下載包含原文件和demo的壓縮包,并解壓到之前編寫的代碼目...
    老皮丘閱讀 1,715評論 0 6
  • 22年12月更新:個(gè)人網(wǎng)站關(guān)停,如果仍舊對舊教程有興趣參考 Github 的markdown內(nèi)容[https://...
    tangyefei閱讀 35,199評論 22 257
  • 昨晚因?yàn)闃I(yè)主維權(quán)群里很多無知的聲音而崩潰~關(guān)鍵是孩子她爸在群里聊的起勁~補(bǔ)充下,因?yàn)槲覜]有實(shí)名,被T~ 可笑的是我...
    酸奶咖啡閱讀 245評論 1 1