$14 表單腳本

1. 表單基礎(chǔ)知識(shí):

在HTML中,表單由<form>表示;
在JS中,表單由HTMLFormElement類型表示磺芭,它繼承了HTMLElement。
取得頁(yè)面中的表單:

var form=document.forms;
Paste_Image.png

1.1 提交表單

只要將button或者input標(biāo)簽的type設(shè)置為submit即可提交表單醉箕。
瀏覽器在將請(qǐng)求發(fā)送給服務(wù)器之前會(huì)首先觸發(fā)submit事件钾腺,這樣我們可以根據(jù)用戶輸入的內(nèi)容決定是否發(fā)送這個(gè)表單。

1.2 重置表單

html中:將其type設(shè)置為"reset"
JS中:

var form=document.forms[0];
form.reset();

1.3 表單字段

可以通過(guò)elements屬性訪問(wèn)表單中的字段讥裤。

<form>
       <button type="submit" id="button">按鈕1</button>
       <input type="submit" value="submit"/>
</form>
 var form=document.forms[0];
 var button=form.elements[0];
 var input=form.elements[1];

也可以根據(jù)name值訪問(wèn):

form.elements["button"]==button//true
A. 共有的表單屬性:
1. disabled:布爾值放棒,表示是否被禁用。
2. form:指向當(dāng)前的表單
3. name:當(dāng)前字段的名稱
4. readOnly:當(dāng)前字段是否為只讀
5. type:當(dāng)前字段的類型:如radio  checkbox等
6. value:當(dāng)前字段被提交給服務(wù)器的值己英。

上述屬性除了form外间螟,都可以通過(guò)JS進(jìn)行修改:
如:在一次單擊后禁用按鈕,以防止用戶多次點(diǎn)擊:

EventUtil.addHandler(button,"click",function (event) {
           alert("a");
           button.disabled=true;
        });
B. 共有的表單字段方法

focus()和blur()
focus()方法將瀏覽器的焦點(diǎn)設(shè)置到表單字段损肛。
JS方法:

var input=form.elements[1];
input.focus();

html方法:利用autofocus屬性

<input type="text" autofocus>
Paste_Image.png

blur()與focus()相反厢破,它為移走焦點(diǎn)。

C. 共有的表單字段事件
1. blur:當(dāng)前字段失去焦點(diǎn)觸發(fā)
2. focus:當(dāng)前字段獲得焦點(diǎn)觸發(fā)
3. change:對(duì)于input和textarea元素治拿,失去焦點(diǎn)并且value值改變時(shí)觸發(fā)摩泪。對(duì)于select元素,選項(xiàng)改變時(shí)觸發(fā)劫谅。
var text=form.elements[2];//textarea元素
    EventUtil.addHandler(text,"focus",function (event) {//聚焦后將背景顏色設(shè)置為黃色
        event=EventUtil.getEvent(event);
        var target=EventUtil.getTarget(event);
        target.style.backgroundColor="yellow";
    });
    EventUtil.addHandler(text,"blur",function (event) {//失焦后如果里面的值為數(shù)字則無(wú)顏色见坑,否則為紅色
        event=EventUtil.getEvent(event);
        var target=EventUtil.getTarget(event);
        if(/[^\d]/.test(target.value)){
            target.style.backgroundColor="red";
        }else {
            target.style.backgroundColor=" ";
        }
    });
    EventUtil.addHandler(text,"change",function (event) {//里面的值改變時(shí)如果為數(shù)字則無(wú)顏色,否則為紅色
        event=EventUtil.getEvent(event);
        var target=EventUtil.getTarget(event);
        if(/[^\d]/.test(target.value)){
            target.style.backgroundColor="red";
        }else{
            target.style.backgroundColor="";
        }
    })

2. 文本框腳本

表示文本框的元素:
input textarea
區(qū)別:
input:
單行文本
可以設(shè)置顯示的字符數(shù)size和最大的接收字符數(shù)maxlength

<input type="text" size="10" maxlength="12">

textarea:
多行文本
可以通過(guò)cols和rows設(shè)置列和行數(shù)捏检。

<textarea cols="5" rows="5">12345</textarea>

改變值:
在改變值時(shí)荞驴,都可以使用element.value=""設(shè)置。

2.1 選擇文本

選中所有文本:select()方法

EventUtil.addHandler(text,"focus",function (event) {//鼠標(biāo)聚焦時(shí)選中所有文本
        event=EventUtil.getEvent(event);
        var target=EventUtil.getTarget(event);
        target.select();
    });
Paste_Image.png
A. select事件:

當(dāng)文本被選中時(shí)觸發(fā):

EventUtil.addHandler(text,"select",function (event) {
     console.log(text.value);
});
B. 獲取被選中的文本:

select有兩個(gè)屬性:selectionStart和selectionEnd保存的選中文本的偏移量

EventUtil.addHandler(text,"select",function (event) {      
    console.log(text.value.substring(text.selectionStart,text.selectionEnd));
});
C. 選擇部分文本:setSelectionRange
text.focus();//使用該方法之前或者之后需要將焦點(diǎn)設(shè)置到文本框未檩。
text.setSelectionRange(2,3);
Paste_Image.png

2.2 過(guò)濾輸入:

利用事件和DOM手段戴尸,將文本框變?yōu)榭梢岳斫庥脩糨斎霐?shù)據(jù)的功能性控件。
A. 屏蔽字符:

如用戶只能輸入數(shù)字:

EventUtil.addHandler(text,"keypress",function (event) {
     event=EventUtil.getEvent(event);
     var target=EventUtil.getTarget(event);
     var charCode=EventUtil.getCharCode(event);
     if(!/\d/.test(String.fromCharCode(charCode))&&charCode>9&&!event.ctrlKey){//后面兩個(gè)條件為取消一些退格等功能鍵以及復(fù)制粘貼用的ctrl鍵
            EventUtil.preventDefault(event);
        }
})
B. 操作剪貼板:

剪貼板事件:

beforecopy:復(fù)制操作前觸發(fā)冤狡。
copy:復(fù)制操作時(shí)觸發(fā)。
beforecut:剪切操作前觸發(fā)项棠。
cut:剪切操作時(shí)觸發(fā)悲雳。
beforepaste:粘貼前觸發(fā)
paste:粘貼時(shí)觸發(fā)。

如何訪問(wèn)剪貼板中的數(shù)據(jù):
clipboardData對(duì)象香追。該對(duì)象三個(gè)方法:getData() setData() clearData()
在EventUtil對(duì)象中加入方法:

    getClipboardText:function (event) {
                var clipboardData=(event.clipboardData || window.clipboardData);
                return clipboardData.getData("text");
            },
     setClipboardText:function (event,value) {
                if(event.clipboardData){
                    return event.clipboardData.setData("text/plain",value);
                }else if(window.clipboardData){
                    return window.clipboardData.setData("text",value);
                }
            }

例子:如果是數(shù)值合瓢,則粘貼,否則透典,不粘貼晴楔。

    EventUtil.addHandler(textArea,"paste",function (event) {
       event=EventUtil.getEvent(event);
       var text=EventUtil.getClipboardText(event);
       if(!/^\d*$/.test(text)){
           EventUtil.preventDefault(event);
       }
   })

2.3 . 自動(dòng)切換焦點(diǎn)

當(dāng)文本框中達(dá)到最大輸入字符數(shù)量時(shí)顿苇,自動(dòng)切換到下一個(gè)文本框。

        <input type="text" name="tel1" id="textTel1" maxlength="3">
        <input type="text" name="tel2" id="textTel2" maxlength="3">
        <input type="text" name="tel3" id="textTel3" maxlength="4">
     function tabForward(event) {
        event=EventUtil.getEvent(event);
        var target=EventUtil.getTarget(event);
        if(target.value.length==target.maxLength){
            var form=target.form;//切換到當(dāng)前目標(biāo)所在的表單
            for(var i=0;i<form.elements.length;i++){//對(duì)該表單內(nèi)的元素進(jìn)行循環(huán)
                if(form.elements[i]==target){//找到當(dāng)前事件的元素
                    if(form.elements[i+1]) {//如果存在下一個(gè)元素税弃,則將下一個(gè)元素獲得焦點(diǎn)纪岁。
                        form.elements[i+1].focus();
                    }
                    return;//如果不存在就停止
                }
            }
        }
    }
    var text1=document.getElementById("textTel1");
    var text2=document.getElementById("textTel2");
    var text3=document.getElementById("textTel3");
    EventUtil.addHandler(text1,"keyup",tabForward);
    EventUtil.addHandler(text2,"keyup",tabForward);
    EventUtil.addHandler(text3,"keyup",tabForward);

2.4 HTML5約束驗(yàn)證API

HTML5幫助對(duì)表單進(jìn)行驗(yàn)證。

A. 必填字段:required
<input type="text" maxlength="3" required>
<input type="text"  maxlength="3">
<input type="text"  maxlength="4">
<button type="submit">提交</button>
Paste_Image.png
B. 其他輸入類型:

其他的type類型:如"url" "email"

<input type="email" required>
<input type="text"  >
<input type="text"  >
<button type="submit">提交</button>
Paste_Image.png
C. 數(shù)值范圍

type值還有"number" "range" "datatime"等等则果。下面的例子為輸入0-50中的3的倍數(shù)幔翰。

<input type="number" min="0" max="50" step="3">
<input type="text">
<input type="text">
<button type="submit">提交</button>
Paste_Image.png
D. 輸入模式:pattern

利用正則進(jìn)行匹配

<input type="text" >
<input type="text" pattern="\d+">
<input type="text"  >
<button type="submit">提交</button>
Paste_Image.png
E. 檢測(cè)有效性

如何檢測(cè)表單是否有效:checkValidity()方法,返回布爾值西壮。

        var button=document.getElementsByTagName("button")[0];
        EventUtil.addHandler(button,"click",function (event) {
            if(document.forms[0].checkValidity()){
                //表單有效
            }else{
                console.log("表單無(wú)效")
            }
        })

還有一個(gè)屬性:validity可以有更詳細(xì)的信息顯示表單字段的有效性遗增。

F. 禁用驗(yàn)證:

novalidate屬性:表單不需要驗(yàn)證。
HTML方法:

    <form novalidate>
    </form>

JS方法:

    document.forms[0].novalidate=true;

formnovalidate屬性:作用于某個(gè)按鈕款青,當(dāng)點(diǎn)擊該按鈕時(shí)不驗(yàn)證表單做修。
HTML方法:

    <form novalidate>
        <input type="text" >
        <input type="text" pattern="\d+">
        <input type="text"  >
        <button type="submit" formnovalidate>提交</button>
    </form>

JS方法:

    document.getElementsByTagName("button")[0].formNoValidate=true;

3. 選擇框腳本

選擇框通過(guò)select和option標(biāo)簽組成。

    <form>
        <select name="location" id="selLocation">
            <option value="select1">北京</option>
            <option value="select2">上海</option>
            <option value="select3">山東</option>
        </select>
    </form>
HTMLSelectElement類型提供了下列的屬性和方法:

add(newOption,relOption):在relOption之前插入newOption
options:返回所有的option的HTMLCollection
remove(index):移除給定選項(xiàng)
selectIndex:選中項(xiàng)索引
size:選擇框可見(jiàn)行數(shù)抡草。

每個(gè)option都有下列屬性:

index
label
selected:布爾值
text:如上例中的“北京”
value:value值
var selectBox=document.forms[0].elements["location"];
console.log(selectBox.options[0].label)

3.1 選擇選項(xiàng)

如何訪問(wèn)選中項(xiàng):

    var selectBox=document.forms[0].elements["location"];
    var selectedOption=selectBox.options[selectBox.selectedIndex];

指定選中哪一項(xiàng):

selectBox.options[1].selected=true;

3.2 添加選項(xiàng)

方法一:操作DOM

    var newOption=document.createElement("option");
    newOption.appendChild(document.createTextNode("天津"));
    selectBox.appendChild(newOption);

方法二:option構(gòu)造函數(shù)

    var newOption=new Option("天津","select4");
    selectBox.appendChild(newOption);

方法三:選擇框的add()方法

    var newOption=new Option("天津","select4");
    selectBox.add(newOption,1)//索引設(shè)為1

3.3 移除選項(xiàng)

方法一:DOM方法

    var selectBox=document.forms[0].elements["location"];
    selectBox.removeChild(selectBox.options[0]);

方法二:選擇框的remove()方法

    var selectBox=document.forms[0].elements["location"];
    selectBox.remove(0);

3.3 移動(dòng)和重排選項(xiàng)

利用appendChild屬性將選擇框1中的option移動(dòng)到選擇框2饰及。(appendChild方法傳入一個(gè)文檔已經(jīng)存在的元素會(huì)將該元素從它的父節(jié)點(diǎn)刪除然后再添加)

        var select1=document.forms[0].elements["location1"];
        var select2=document.forms[0].elements["location2"];
        select2.appendChild(select1.options[0])

insertBefore方法:

        var select1=document.forms[0].elements["location1"];
        var select2=document.forms[0].elements["location2"];
        var optionMove=select1.options[0];
        select2.insertBefore(optionMove,select2.options[1]);
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市渠牲,隨后出現(xiàn)的幾起案子旋炒,更是在濱河造成了極大的恐慌,老刑警劉巖签杈,帶你破解...
    沈念sama閱讀 222,946評(píng)論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件瘫镇,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡答姥,警方通過(guò)查閱死者的電腦和手機(jī)铣除,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,336評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)鹦付,“玉大人尚粘,你說(shuō)我怎么就攤上這事∏贸ぃ” “怎么了郎嫁?”我有些...
    開(kāi)封第一講書人閱讀 169,716評(píng)論 0 364
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)祈噪。 經(jīng)常有香客問(wèn)我泽铛,道長(zhǎng),這世上最難降的妖魔是什么辑鲤? 我笑而不...
    開(kāi)封第一講書人閱讀 60,222評(píng)論 1 300
  • 正文 為了忘掉前任盔腔,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘弛随。我一直安慰自己瓢喉,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,223評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布舀透。 她就那樣靜靜地躺著栓票,像睡著了一般。 火紅的嫁衣襯著肌膚如雪盐杂。 梳的紋絲不亂的頭發(fā)上逗载,一...
    開(kāi)封第一講書人閱讀 52,807評(píng)論 1 314
  • 那天,我揣著相機(jī)與錄音链烈,去河邊找鬼厉斟。 笑死,一個(gè)胖子當(dāng)著我的面吹牛强衡,可吹牛的內(nèi)容都是我干的擦秽。 我是一名探鬼主播,決...
    沈念sama閱讀 41,235評(píng)論 3 424
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼漩勤,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼感挥!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起越败,我...
    開(kāi)封第一講書人閱讀 40,189評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤触幼,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后究飞,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體置谦,經(jīng)...
    沈念sama閱讀 46,712評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,775評(píng)論 3 343
  • 正文 我和宋清朗相戀三年亿傅,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了媒峡。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,926評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡葵擎,死狀恐怖谅阿,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情酬滤,我是刑警寧澤签餐,帶...
    沈念sama閱讀 36,580評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站盯串,受9級(jí)特大地震影響贱田,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜嘴脾,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,259評(píng)論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧译打,春花似錦耗拓、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,750評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至韵洋,卻和暖如春竿刁,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背搪缨。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,867評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工食拜, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人副编。 一個(gè)月前我還...
    沈念sama閱讀 49,368評(píng)論 3 379
  • 正文 我出身青樓负甸,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親痹届。 傳聞我的和親對(duì)象是個(gè)殘疾皇子呻待,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,930評(píng)論 2 361

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

  • 本章內(nèi)容 理解表單 文本框驗(yàn)證與交互 使用其他表單控制 14.1 表單的基礎(chǔ)知識(shí) 通過(guò)document.forms...
    悶油瓶小張閱讀 364評(píng)論 0 0
  • 事件源對(duì)象 event.srcElement.tagName event.srcElement.type 捕獲釋放...
    孤魂草閱讀 892評(píng)論 0 0
  • 個(gè)人博客:https://yeaseonzhang.github.io 花了半個(gè)多月的時(shí)間,終于又把“JS紅寶書”...
    Yeaseon閱讀 1,756評(píng)論 2 23
  • 讀書筆記 迅速殲滅不該做的事情队腐,接著對(duì)該做的事情發(fā)起熟練的蚕捉、跨學(xué)科的攻擊,然后柴淘,當(dāng)合適的機(jī)會(huì)來(lái)臨——只有當(dāng)合適的機(jī)...
    SweetCC閱讀 212評(píng)論 0 0
  • 正是因?yàn)榕懿降臅r(shí)候什么都不用想所以才喜歡跑步迫淹。每天要想的事情那么多,只有跑步的時(shí)候才能放松下來(lái)悠就,什么都不用想千绪,只管...
    來(lái)福喵咪閱讀 315評(píng)論 0 0