整合營銷服務(wù)商

          電腦端+手機端+微信端=數(shù)據(jù)同步管理

          免費咨詢熱線:

          第63節(jié) Form表單-Web前端開發(fā)之JavaScript-王唯

          內(nèi)容是《Web前端開發(fā)之Javascript視頻》的課件,請配合大師哥《Javascript》視頻課程學習。

          在HTML中,表單是用<form>元素來表示的,它與其他各種各樣的表單輸入元素,如<input>、<select>和<button>在客戶端編程中有著重要的地位。

          表單的作用是,通過表單元素收集用戶的輸入,再將這些輸入數(shù)據(jù)提交給服務(wù)器,服務(wù)器處理接收到的數(shù)據(jù)并生成一個新的HTML頁面顯示在客戶端;在以前,表單提交數(shù)據(jù)、服務(wù)器返回數(shù)據(jù),此時客戶端與服務(wù)端并沒有其他交互行為,因此,數(shù)據(jù)提交交互性差、服務(wù)器負擔重。

          Javascript的最初的一個應(yīng)用,就是分擔服務(wù)器處理表單的任務(wù),打破處處依賴服務(wù)器的局面;雖然現(xiàn)在Web和Javascript有了長足的發(fā)展,但Web表單的變化并不明顯;特別是一些常見的形式,web表單并沒有提供特別好的方案;最常見的操作,是使用Javascript增強了一些標準表單控件的默認行為。

          表單及其控件都是HTML元素,可以使用標準的DOM技術(shù)來操作它們,另外表單已經(jīng)腳本化了,也有專門的API,所以在表單編程中,最好使用表單API;

          取得Form表單對象:

          取得<form>元素引用的方式:最常用的方式就是將它看成與其他元素一樣,使用getElementById()或getElementsByTagName()等標準的DOM技術(shù);

          var form = document.getElementById("myForm");
          var form = document.getElementsByTagName("form")[0];

          通過document.forms集合可以取得頁面中所有表單集合,在這個HTMLCollection集合中,可以通過數(shù)值索引或name或id值來取得特定的表單:

          var firstForm = document.forms[0];
          var myForm = document.forms["myForm"];

          較早的瀏覽器或者那些支持向后兼容的瀏覽器中,會把每個設(shè)置了name特性的表單作為屬性保存在document對象中,如:

          var form = document.myForm;

          注:不推薦這種方式;
          注:可以同時為表單指定id和name屬性,但它們可以設(shè)置不同的值;

          表單屬性和方法:

          表單<form>在HTML中具有action、encoding、method和target等屬性,在Javascript中,它是HTMLFormElement類型,繼承了HTMLElement,因而與其他HTML元素一樣具有相同的默認屬性,但也具有自己獨有的屬性和方法,其中大部分的屬性都與其在HTML中的屬性相對應(yīng),這些屬性可以控制表單是如何來提交數(shù)據(jù)并如何顯示的,如:

          • acceptCharset:服務(wù)器能夠處理的字符集,等價于HTML中的accept-charset特性;
          • action:接受請求的URL,等價于HTML的action特性;
          • elements:表單中所有控件的集合(HTMLCollection);
          • enctype:請求的編碼類型(方式),等價于HTML中的enctype特性;
          • encoding:編碼,等價于HTML的encoding特性,不般不需要;
          • length:只讀,表單中控件的數(shù)量;
          • method:請求類型(方法),等價于HTML的method特性;
          • name:表單的名稱,等價于HTML的name特性;
          • target:用于發(fā)送請求和接收響應(yīng)的窗口名稱,等價于HTML的target
          • reset():方法,將所有表單域重置為默認值;
          • submit():方法,提交表單;

          以上的大部分屬性是可寫的;

          <script>
          console.log(form.action); // demo.html
          form.action = "/login";
          console.log(form.action); // login
          // 獲取表單信息
          function getFormInfo(){
          var info;
          var form = document.forms[0];
          info = "form.elements:" + form.elements + "\n";
          info += "form.length:" + form.length + "\n";
          info += "form.name:" + form.name + "\n";
          info += "form.acceptCharset:" + form.acceptCharset + "\n";
          info += "form.action:" + form.action + "\n";
          info += "form.enctype:" + form.enctype + "\n";
          info += "form.encoding:" + form.encoding + "\n";
          info += "form.method:" + form.method + "\n";
          info += "form.target:" + form.target + "\n";
          form.elements["txt"].value = info;
          }
          function setFormInfo(form){
          form.name = "yourForm"
          form.method = "GET";
          form.action = "/member";
          form.acceptCharset = "gb2312";
          form.enctype = "multipart/form-data";
          form.target = "_blank";
          var pwd = document.createElement("input");
          pwd.type = "password";
          pwd.id = "pwd";
          form.appendChild(pwd);
          }
          </script>
          <form name="myForm" id="myForm" action="/login" method="POST">
          <p><input type="text" id="username" name="username" /></p>
          <p><input type="button" value="表單信息" onclick="getFormInfo()" />
          <input type="button" value="設(shè)置表單" onclick="setFormInfo(this.form)" /></p>
          <p><textarea id="txt"></textarea></p>
          </form>

          也可以使用DOM方法動態(tài)創(chuàng)建表單,如:

          var form = document.createElement("form");
          document.body.appendChild(form);
          form.name = "myform";
          form.action = "/login";
          form.method = "POST";
          // form.submit();
          // 或者
          var btn = document.createElement("input");
          btn.type = "submit";
          btn.value = "提交";
          form.appendChild(btn);

          Submit提交表單:
          使用<input>的type特性為”submit”或”image”就可以提交表單,或者<button>也可以提交表單;

          <input type="submit" value="提交" />
          <input type="image" src="images/submit.png" />
          <button type="submit">提交表單</button>

          以上的按鈕,只要在任何表單元素擁有焦點的情況下,按回車就可以提交表單;如果表單里沒有提交按鈕,按回車鍵不會提交表單,但有個特例,如果只有一個文本框,即使沒有提交按鈕,回車也會提交;
          注意:textarea是個例外,如果在文本區(qū)中回車會換行,而不是提交表單;

          以這種方式提交表單時,瀏覽器會在將請求發(fā)送給服務(wù)器之前觸發(fā)onSubmit事件,利用此事件,可以驗證表單數(shù)據(jù),從決定是否允許表單提交;阻止這個事件的默認行為或返回false就可以取消表單提交,如果不阻止,就是提交表單;

          var myForm = document.getElementById("myForm");
          myForm.addEventListener("submit", function(event){
          var input = document.forms[0].elements[0];
          if(input.value == ""){
          event.preventDefault();
          console.log("提交不了");
          }
          },false);

          如果是DOM0級事件處理程序,也可以return false;

          myForm.onsubmit = function(e){
          var input = document.forms[0].elements[0];
          if(input.value == ""){
          console.log("input不能為空");
          // e.preventDefault();
          return false; // 或者
          }
          }

          如果是HTML事件處理程序,可以return false;

          <form id="myForm" name="myForm" onsubmit="return validate();">
          <script>
          function validate(){
          var input = document.forms[0].elements[0];
          if(input.value == ""){
          console.log("input數(shù)據(jù)不能為空");
          return false; // 或者
          }
          return true;
          }
          </script>

          submit()方法:
          在Javascript中,調(diào)用submit()方法也可以提交表單;而且,這種方式不需要表單包含提交按鈕,在任何時候都可以正常提交表單;

          var myForm = document.getElementById("myForm");
          myForm.submit();

          在調(diào)用submit()方法提交表單時,并不會觸發(fā)onSubmit事件,因此在調(diào)用此方法之前驗證表單數(shù)據(jù);

          <input id="btn" type="button" value="普通按鈕" />
          var btn = document.getElementById("btn");
          // 不會觸發(fā)myForm的onSubmit事件,所以數(shù)據(jù)驗證必須要處理
          btn.addEventListener("click",function(e){
          if(validate()){ // 數(shù)據(jù)驗證
          console.log("普通按鈕提交");
          myForm.submit();
          }else{
          console.log("不能為空");
          }
          },false);

          另外,調(diào)用此方法也不會觸發(fā)約束驗證,如:
          <p>輸入1-10之間的整數(shù):<input type="number" min="1" max="10" required /></p>
          所以,也需要在調(diào)用submit()方法前驗證約束,如:

          var num = document.querySelector('input[type="number"]');
          if(num.required){
          if(num.value == ""){
          console.log("num不能為空");
          return false;
          }
          }

          有個誤區(qū),如果給一個提交按鈕添加onSubmit事件,是無效的,它會直接提交,如:

          <input id="mySubmit" type="submit" value="提交" onsubmit="return validate();" />

          如果為一個提交按鈕添加onClick事件,可以進行表單提交驗證,同時也會觸發(fā)表單的onSubmit事件,例如,把上例的btn的onClick事件處理程序添加到submit提交按鈕,可以看以,onClick事件先于表單的onSubmit事件觸發(fā);

          另外,不要為一個表單元素的name或id的值設(shè)為submit,因為它會覆蓋表單的submit方法,所以當運行時,會提示不存在的submit()函數(shù);
          另外,不僅是提交按鈕或普通按鈕調(diào)用submit()方法能提交表單,甚至一個超鏈接調(diào)用submit()方法也可以提交,但要注意,需要取消超鏈接的默認行為:

          <!-- <a href="javascript:void(0)" id="aBtn">提交</a> -->
          <a href="#" id="aBtn">提交</a>
          </form>
          <script>
          var aBtn = document.getElementById("aBtn");
          aBtn.onclick = function(e){
          e.preventDefault(); // 或者在HTML中執(zhí)行javascript:void(0)
          if(validate()){
          console.log("超鏈接提交");
          myForm.submit();
          }else{
          console.log("超鏈接提交數(shù)據(jù)驗證不通過");
          }
          }

          示例:

          <!-- onsubmit="return false" 防止表單自動提交
          form 默認為get提交 -->
          <form id="myForm" onsubmit="return false">
          <p>用戶名:<input type="text" name="username" id="username" /></p>
          <p>密碼:<input type="password" name="pwd" id="pwd" /></p>
          <p><button type="button" onclick="login()">提交</button></p>
          </form>
          <script>
          function login(){
          var username = document.getElementById("username").value;
          var pwd = document.getElementById("pwd").value;
          if(username != "" && pwd !=""){
          var myForm = document.forms["myForm"];
          myForm.method = "get";
          myForm.action = "/login";
          myForm.submit();
          }else{
          console.log("數(shù)據(jù)為空");
          }
          }
          </script>

          還有一種重要的提交方式,就是Ajax提交,也就是利用XMLHttpRequest對象進行異步數(shù)據(jù)提交,它最大的特點是不會提交整個頁面,只會進行局部提交。

          自動提交和防止自動提交:

          回車、調(diào)用提交按鈕的click()方法、調(diào)用表單的submit()方法(可以在onLoad事件中,甚至可以利用setTimeout定時提交)等;
          如果表單中有提交按鈕,可以為表單添加onsubmit=”return false”;但此時,提交按鈕也會失效;
          如果表單中沒有提交按鈕,不會自動提交;
          如果表單中只有一個文本框,但沒有提交按鈕,回車會自動提交,可以為表單添加onsubmit=”return false”,就不會自動提交;或者添加一個隱藏的文本框,如:

          <input type="text" style="display: none;" />

          也不會自動提交,注意,不是隱藏域;

          或者監(jiān)聽文本框的onKeydown事件,如果是回車的話,不做處理,如:

          <input type="text" onkeydown="if(event.keyCode==13){return false}" />

          如果在表單中有提交按鈕,如果表單任一個控件都處于焦點狀態(tài)下,直接回車就可以提交表單,如果沒有控件處于焦點狀態(tài),可以監(jiān)聽document的keydown事件,從而判斷是否按下回車鍵,再進行提交,如:

          document.addEventListener("keydown", function(e){
          if(e.keyCode == 13){
          document.forms[0].submit();
          console.log("表單提交了");
          }
          },false);

          防止重復(fù)提交:

          提交表單時可能出現(xiàn)的最大問題,就是重復(fù)提交表單;解決該問題的方法有兩個:在第一次提交表單后就禁用提交按鈕,或者利用onSubmit事件處理程序取消后續(xù)的表單提交操作;

          禁用提交按鈕:

          var myForm = document.getElementById("myForm");
          myForm.addEventListener("submit", function(event){
          event.preventDefault(); // 為了能看到效果
          var btnSubmit = event.target.elements["btnSubmit"];
          btnSubmit.disabled = true;
          },false);

          注:不能通過onclick事件處理程序來實現(xiàn)這個功能,原因是不同瀏覽器之間存在“時差”:有的會在觸發(fā)表單的onSubmit事件前觸發(fā)onClick事件,有些相反;對于先觸發(fā)onClick事件的,意味著會在提交發(fā)生之前禁用按鈕,結(jié)果永遠都不會提交表單,因此最好使用onSubmit事件來禁用提交按鈕;
          此種方式不適合表單中不包含提交按鈕的情況;

          重置表單:

          使用type特性為reset的<input>或<button>兩種按鈕可以重置表單:

          <input type="reset" value="重置">
          <button type="reset">重置</button>

          當單擊重置按鈕時,會觸發(fā)onReset事件;利用此事件,可以在必要時取消重置操作;取消重置也就是阻止重置的默認行為,如:

          var myForm = document.getElementById("myForm");
          myForm.addEventListener("reset", function(event){
          event.preventDefault();
          console.log("重置被禁止了");
          },false);

          在HTML事件處理程序或DOM0級中的onReset事件中返回false也可以取消默認行為;

          也可以使用Javascript調(diào)用reset()方法重置,但與調(diào)用submit()方法不同,其會觸發(fā)onReset事件;

          var myForm = document.getElementById("myForm");
          myForm.reset();
          //...
          var btn = document.getElementById("btn");
          btn.onclick = function(){
          myForm.reset(); // 會觸發(fā)onReset事件
          };

          從用戶體驗角度來說,重置表單并不常見,所以有可能是意外地觸發(fā)了表單重置事件,所以這種需求是很少見的,更常見的做法是提供一個取消按鈕,讓用戶能夠回到前一個頁面;

          表單元素(控件):

          可以像訪問頁面中的其他元素一樣,使用原生DOM方法訪問表單控件;

          var fields = document.getElementById("username");
          var fields = document.getElementsByTagName("input")[0];
          var fields = document.querySelectorAll('#login input[type="radio"]');
          var fields = document.querySelectorAll('#login input[type="radio"][name="color"]');

          Form表單具有l(wèi)ength屬性,其返回表單元素的數(shù)量,但是不包含<input>元素type為“image”元素;所以也可以通過訪問表單的索引或?qū)傩詠碓L問元素,如form[0]可以取得第一個表單控件或form[“color”] 或form.color獲得第一個命名控件;

          console.log(myForm.length);
          console.log(myForm[0]);
          console.log(myForm["username"]);
          console.log(myForm.username);
          elements:表單中所有控件的集合(HTMLCollection);
          var formElements = document.forms[0].elements;
          console.log(formElements); // HTMLFormControlsCollection
          console.log(formElements.length); // 5

          其屬于HTMLFormControlsCollection集合類型,繼承自HTMLCollection;這個類型沒有什么特別的屬性和方法;
          注意,elements集合中不包括type等于image的input元素;

          可以通過表單elements集合索引或name特性訪問所有元素,如:

          var form = document.getElementById("myForm");
          var field1 = form.elements[0];
          var field2 = form.elements["textbox1"];
          var fields = form.elements.color;
          var fieldCount = form.elements.length;

          這種方式和直接利用表單的索引或name特性訪問表單元素是一致的,相比之下,還是推薦使用這種方式,因為前者在未來有可能不支持,并且會引起一些歧義;

          示例,所有表單元素的值不能為空,如:

          <script type="text/javascript">
          function myCheck(){
          for(var i=0;i<document.forms[0].elements.length-1;i++){
          if(document.forms[0].elements[i].value==""){
          alert("當前表單不能有空項");
          document.forms[0].elements[i].focus();
          return false;
          }
          }
          return true;
          }
          </script>
          <form name="myForm" method="post" action="#" onSubmit="return myCheck()">
          用戶名:<input type="text" name="username"><br>
          性別:<input type="text" name="sex"><br>
          出生時間:<input type="text" name="birthday"><br>
          <input type="submit" value="提交">
          </form>

          如果有多個表單控件使用同一個name,通過elements[“name”]會返回以該name命名的一個NodeList,而通過elements[index]只會返回第一個元素;

          <form id="myForm">
          <p>
          <input type="radio" name="color" value="red" />red<br/>
          <input type="radio" name="color" value="green" />red<br/>
          <input type="radio" name="color" value="blue" />red<br/>
          </p>
          </form>
          <script type="text/javascript">
          var myForm = document.getElementById("myForm");
          var colors = myForm.elements["color"];
          // var colors = myForm.elements.color; // 或者
          console.log(colors); // RadioNodeList
          console.log(colors.length); // 3
          var firstColor = colors[0];
          var firstElement = myForm.elements[0];
          console.log(firstColor === firstElement); // true
          </script>

          因此,在使用索引和name特性時結(jié)果有可能是不一樣的;一般來說,優(yōu)先使用id屬性,但是name屬性在HTML表單提交中有特殊的目的,一般應(yīng)用在相關(guān)的復(fù)選按鈕組和強制共享name屬性值的、互斥的單選按鈕組;另外,對于其他表單元素來說,設(shè)置name特性的目的就是為了提交到服務(wù)端,服務(wù)端根據(jù)該name特性取得這個表單元素的值;

          共有的表單控件屬性:

          除了<fieldset>元素外,所有表單控件都擁有相同的一組屬性;由于<input>類型可以表示多種表單元素,因此有些屬性只適用于某些表單元素,但還有一些屬性是所有表單元素所共有的:

          • disabled:布爾值,表示當前控件是否被禁用;
          • form:只讀,指向當前控件所屬表單的指針;如果表單元素沒有包含在一個<form>中,則值為null;
          • name:只讀,當前控件的名稱;
          • readOnly:布爾值,表示當前控件是否只讀;
          • tabIndex:表示當前控件的切換(tab)序號;
          • type:當前控件的類型,如checkbox、radio等;
          • value:讀/寫,表單元素的值,也就是將被提交給服務(wù)器的值,對file來說,是只讀的,包含著文件在計算機中的路徑;

          以上除了form屬性,都可以通過Javascript動態(tài)修改,如:

          var form = document.getElementById("myForm");
          var field = form.elements[0];
          field.value = "Another value";
          alert(field.form === form);
          field.focus();
          field.disabled = true;
          // 不推薦,但對input是可行的
          field.type="checkbox";

          type屬性:

          除了<fieldset>之外,所有表單元素都有type屬性;對于<input>元素,這個值等于HTML特性type值,如:text、password、radio、checkbox、button、file、hidden、reset、submit;對于其他元素,該值如下:

          • 文件域:<textarea> 值為textarea
          • 單選列表:<select>…</select> 值為:select-one
          • 多選列表:<select multiple>..</select> 值為:select-multiple
          • 自定義按鈕:<button>…</button> 值為:submit
          • 自定義非提交按鈕:<button type=“button”>..</button> 值為button
          • 自定義重置按鈕:<button type=“reset”>..</button> 值為reset
          • 自定義提交按鈕:<button type=“submit”>..</button> 值為submit

          此外,<input>和<button>的type屬性可以動態(tài)修改,而<select>元素的type屬性是只讀的;示例:密碼框的明文和暗文:

          <style>
          span.icon-eye{
          display: inline-block; width:24px; height: 24px;
          background: url("images/eye.png") no-repeat; cursor: pointer;
          }
          span.icon-eye-invisible{
          background-position: -24px 0;
          }
          </style>
          <p><input id="pwd" name="pwd" type="password" /><span class="icon-eye icon-eye-invisible"></span></p>
          <script>
          var iconEye = document.querySelector("span.icon-eye");
          iconEye.addEventListener("click", function(event){
          var p = document.getElementsByTagName("p")[0];
          var pwd = document.getElementById("pwd");
          if(p.classList.toggle("icon-eye-invisible")){
          pwd.type = "text";
          }else{
          pwd.type = "password";
          }
          },false);
          </script>

          示例:在彈出窗口提交表單

          <script>
          function popupSend(oForm){
          if(oForm.method && oForm.method.toLowerCase() !== "get"){
          alert("只允許GET方式提交");
          return;
          }
          var oField, sFieldType, nFile, sSearch = "";
          for(var i = 0; i < oForm.elements.length; i++){
          oField = oForm.elements[i];
          if(!oField.hasAttribute("name"))
          continue;
          // sFieldType = oField.nodeName.toUpperCase() === "INPUT" ? oField.getAttribute("type").toUpperCase() : "TEXT";
          sFieldType = oField.nodeName.toUpperCase() === "INPUT" ? oField.type.toUpperCase() : "TEXT";
          if(sFieldType === "FILE"){
          for(nFile = 0; nFile < oField.files.length; sSearch += "&" + escape(oField.name) + "=" + escape(oField.files[nFile++].name));
          }else{
          sSearch += "&" + escape(oField.name) + "=" + escape(oField.value);
          }
          }
          open(oForm.action.replace(/(?:\?.*)?$/, sSearch.replace(/^&/, "?")), "submit-" + (oForm.name || Math.floor(Math.random() * 1e6)), "resizable=yes,scrollbars=yes,status=yes");
          }
          </script>
          <form id="myForm" name="myForm" action="demo.php" method="get">
          <p>First Name:<input type="text" name="firstname" /><br/>
          Last Name:<input type="text" name="lastname" /><br/>
          Password:<input type="password" name="pwd"><br/>
          Photo:<input type="file" name="photo"><br/>
          <input type="radio" name="sex" value="male">Male
          <input type="radio" name="sex" value="female">Female</p>
          <p><input type="checkbox" name="vehicle" value="Bike">自行車<br/>
          <input type="checkbox" name="vehicle" value="Car">汽車</p>
          <p><input type="submit" value="提交"></p>
          </form>
          <script>
          var myForm = document.getElementById("myForm");
          myForm.addEventListener("submit", function(e){
          popupSend(this);
          e.preventDefault();
          })
          </script>

          共有的表單控件方法:

          每個表單元素都有兩個方法:focus()和blur();其中,focus()方法用于獲得焦點,即激活表單元素,使其可以響應(yīng)鍵盤事件,如:

          window.onload = function(e){
          document.forms[0].elements[0].focus();
          }

          默認情況下,只有表單元素可以獲得焦點;對于其他元素,可以設(shè)置其tabIndex設(shè)置為-1,然后再調(diào)用focus() 方法,也可以讓這些元素獲得焦點;

          HTML5為表單控件新增了一個autofocus屬性,在支持這個屬性的瀏覽器中,只要設(shè)置這個屬性,不用Javascript就能自動把焦點轉(zhuǎn)移到相應(yīng)的控件上,如:

          <input type="text" autofocus />

          如果在HTML中已經(jīng)為元素設(shè)置這個屬性了,就不用在Javascript中調(diào)用focus()了,因此有必要在調(diào)用focus()之前先檢測是否設(shè)置了該屬性,如:

          window.addEventListener("load", function(event){
          var element = document.forms[0].elements[0];
          if(element.autofocus !== true){
          element.focus();
          console.log("Js focus");
          }
          });

          blur()方法:從元素中移除焦點;

          與focus()方法相對的是blur()方法,它的作用是從元素中移走焦點;在調(diào)用blur()時,并不會把焦點轉(zhuǎn)移到某個特定的元素上,其僅僅是將焦點從調(diào)用這個方法的元素上面移走而已,如:

          document.forms[0].elements[0].blur();

          共有的表單元素事件:

          當用戶與表單元素交互時它們往往會觸發(fā)鼠標、鍵盤或其他HTML等常規(guī)事件,除此之外,表單元素還支持以下3個事件:

          • blur:失去焦點時時觸發(fā);
          • focus:獲得焦點時觸發(fā);
          • change:對于<input>和<textarea>元素,在它們失去焦點且value值改變時觸發(fā);對于<select>元素,在其選項改變時觸發(fā);

          如:

          var textbox = document.forms[0].elements[0];
          textbox.addEventListener("focus", function(event){
          if(event.target.style.backgroundColor != "red"){
          event.target.style.backgroundColor = "yellow";
          }
          });
          textbox.addEventListener("blur", function(event){
          if(/[\d]/.test(event.target.value)){
          event.target.style.backgroundColor = "green";
          }else{
          event.target.style.backgroundColor = "red";
          }
          console.log("blur");
          });
          textbox.addEventListener("change", function(event){
          if(/[\d]/.test(event.target.value)){
          event.target.style.backgroundColor = "green";
          }else{
          event.target.style.backgroundColor = "red";
          }
          console.log("change");
          });

          需要強調(diào)的是,change事件對于<input>和<textarea>元素,在它們失去焦點且value值改變時觸發(fā);對于<select>元素,在其選項改變時觸發(fā),如:

          var selectbox = document.forms[0].elements["mySelect"];
          selectbox.addEventListener("change", function(event){
          console.log(this.options[this.selectedIndex].value);
          });
          selectbox.addEventListener("blur", function(e){
          console.log("select blur");
          });

          當改變選項時,會觸發(fā)change事件,但此時,<select>仍處于焦點狀態(tài),當其失去焦點時,才會觸發(fā)blur事件,這一點,有<input>有很大區(qū)別;

          事件處理程序中的this:
          事件處理程序中的this是觸發(fā)該事件的元素的一個引用;例如,可以通過this.form來取得其所在的Form對象的引用;通過this.form.x來獲取該表單中其它的表單元素;

          orm 對象

          Form 對象代表一個 HTML 表單。

          在 HTML 文檔中 <form> 每出現(xiàn)一次,F(xiàn)orm 對象就會被創(chuàng)建。

          Form 對象集合

          elements[] 包含表單中所有元素的數(shù)組。

          elements 集合可返回包含表單中所有元素的數(shù)組。

          元素在數(shù)組中出現(xiàn)的順序和它們在表單的HTML 源代碼中出現(xiàn)的順序相同。

          每個元素都有一個 type 屬性,其字符串值說明了元素的類型。

          formObject.elements[].property

          <form id="myForm">
          Firstname: <input id="fname" type="text" value="Mickey" />
          Lastname: <input id="lname" type="text" value="Mouse" />
          <input id="sub" type="button" value="Submit" />
          </form>
          <p>Get the value of all the elements in the form:<br />
          <script type="text/javascript">
          var x=document.getElementById("myForm");
          for (var i=0;i<x.length;i++)
          {
              document.write(x.elements[i].value);
              document.write("<br />");
              document.write(x.elements[i].type);
              document.write("<br />");
          }
          </script>

          Form 對象屬性

          acceptCharset 服務(wù)器可接受的字符集。

          action 設(shè)置或返回表單的 action 屬性。

          enctype 設(shè)置或返回表單用來編碼內(nèi)容的 MIME 類型。

          id 設(shè)置或返回表單的 id。

          length 返回表單中的元素數(shù)目。

          method 設(shè)置或返回將數(shù)據(jù)發(fā)送到服務(wù)器的 HTTP 方法。

          name 設(shè)置或返回表單的名稱。

          target 設(shè)置或返回表單提交結(jié)果的 Frame 或 Window 名。

          標準屬性

          className 設(shè)置或返回元素的 class 屬性。

          dir 設(shè)置或返回文本的方向。

          lang 設(shè)置或返回元素的語言代碼。

          title 設(shè)置或返回元素的 title 屬性。

          Form 對象方法

          reset() 把表單的所有輸入元素重置為它們的默認值。

          submit() 提交表單。

          Form 對象事件句柄

          onreset 在重置表單元素之前調(diào)用。

          onsubmit 在提交表單之前調(diào)用。

          多數(shù)PHP程序都使用HTML表單從用戶那里獲取數(shù)據(jù)并計算結(jié)果。

          HTML表單的一些基本原則

          • 選擇適合于收集的數(shù)據(jù)類型和提供交互方式的控件。
          • 清楚標記每一個控件,這樣用戶就可以理解其功能。
          • 盡可能將標簽對齊。將控件的左邊緣對齊。
          • 將相關(guān)的標簽分組,并且通過設(shè)計中使用空白將每一個分組分開。
          • 表單上的控件順序應(yīng)該類似于用戶操作他們的順序。

          創(chuàng)建基本HTML表單

          首先創(chuàng)造一個基本的HTML大綱,包含表單控件;然后將控件進行合并(HTML表單必須包括一個提交按鈕,用戶單擊它可以將表單數(shù)據(jù)發(fā)送到服務(wù)器。)一個單獨的HTML頁面可以包含多個表單。

          • 創(chuàng)建HTML結(jié)構(gòu)

          包含表單的HTML結(jié)構(gòu)和和普通的HTML結(jié)構(gòu)一樣。

          <HTML>
            <HEAD>
            <TITLE>標題放在這</TITLE>
            </HEAD>
          <BODY>
            表單頁面放在這
            </BODY>
            </HTML>

          在包含表單的HTML頁面中可以使用任何HTML標簽。基本的表單使用FROM標簽來說明。該標簽中METHOD屬性接收GET或POST兩個值中的一個。ACTION屬性子明PHP腳本的url,該腳本可以收集通過表單收集的數(shù)據(jù),可以是絕對路徑或者相對路徑。

          <FORM METHOD="method" ACTION="url"> 
            中間可以放置表單控件
            </FORM>
          • 合并控件

          兩個常用的基本控件:文本框和提交按鈕。

          文本框:允許用戶鍵入信息以發(fā)送給PHP腳本。NAME屬性為文本提供名稱,PHP腳本可以通過名稱準確訪問其內(nèi)容,因此它應(yīng)該是唯一的且符合PHP變量命名規(guī)則(但不需要$符號),單標簽。VALUE屬性指明出現(xiàn)在提交按鈕上面的標題。創(chuàng)建方式如下:

          <INPUT TYPE = "TEXT" NAME="text">

          提交按鈕:允許用戶將一個表單的內(nèi)容發(fā)送到服務(wù)器,一個HTML表單對應(yīng)應(yīng)該有一個提交按鈕。

          示例:一個完整的HTML表單。

          <HTML>
            <HEAD>
            <TITLE>標題</TITLE>
            </HEAD>
          <BODY>
          <FORM METHOD="POST" ACTION="phpinfo.php">
          <INPUT TYPE="TEXT" NAME="user_name">
          <BR/>
          <BR/>
          <INPUT TYPE="TEXT" NAME="user_email">
          <BR/>
          <BR/>
          <INPUT TYPE="SUBMIT" VALUE="Send the Data">
          </FORM>
            </BODY>
            </HTML>


          • 使用多個表單

          可以在一個HTML頁面中包含多個表單,注意下一個表單的FORM開始之前需要結(jié)束前一個FORM表單。

          <HTML>
            <HEAD>
            <TITLE>標題</TITLE>
            </HEAD>
          <BODY>
            
          <FORM METHOD="POST" ACTION="phpinfo.php">
          <INPUT TYPE="TEXT" NAME="user_name">
          <BR/>
          <BR/>
          <INPUT TYPE="TEXT" NAME="user_email">
          <BR/>
          <BR/>
          <INPUT TYPE="SUBMIT" VALUE="Send the Data">
          <BR/>
          <BR/>
          </FORM>
          
          <FORM METHOD="POST" NAME="phpinfo.php">
          <INPUT TYPE="TEXT" NAME="user_name1">
          <BR/>
          <BR/>
          <INPUT TYPE="TEXT" NAME="user_email1">
          <BR/>
          <BR/>
          <INPUT TYPE="SUBMIT" VALUE="Send the Data1">
          </FORM>
          
            </BODY>
            </HTML>


          創(chuàng)建表單控件

          • 創(chuàng)建自定義的文本框

          文本框的屬性中,TYPE和NAME是必須的,其余是可選屬性。SIZE屬性用于設(shè)置文本框的可視大?。籑AXLENGTH指明用戶鍵入字符的最大長度;VALUE給出了一個最初顯示在文本框中的值。

          <input type="text" name="" size="" maxlength="" value="">
          • 創(chuàng)建文本區(qū)域

          文本區(qū)域可以輸入多行文本。NAME和ROWS屬性是必須的。ROWS屬性表明了文本區(qū)域內(nèi)可以看到的文本行數(shù),充滿時會滾動。COLS屬性指明可見文本列數(shù)與行數(shù)類似。WRAP屬性指明文本區(qū)域內(nèi)單詞換行的方式,可以指定如下值。該標簽為雙標簽。

          說明

          off

          禁止單詞換行但用戶可以輸入換行符強制換行

          virtual/soft

          各行顯示為換行,但是換行并沒有被發(fā)送到服務(wù)器

          physica/hard

          啟用了單詞換行

          <inputarea name="" rows="" cols="" wrap="">
          • 創(chuàng)建密碼框

          創(chuàng)建密碼框的語法與文本框相同,但要將TYPE屬性指定為PASSWORD而不是TYPE。

          <input type="password" name="" size="" maxlength="" value="">
          • 創(chuàng)建復(fù)選框

          取兩個值中的一個,即二選一。TYPE屬性是必須的,checked屬性出現(xiàn),該復(fù)選框默認情況會被選定。value屬性指定復(fù)選框被選定情況下被發(fā)送到服務(wù)器的值,默認發(fā)送on值。法如下:

          <input type="checkbox" name="" checked value="">
          • 創(chuàng)建單選按鈕

          語法與復(fù)選框?qū)傩院x相同,但是TYPE屬性的值必須是RADIO,NAME屬性是必須的。

          <input type="radio" name="" checked value="">
          • 創(chuàng)建列表框

          用戶可以選擇一個或者多個選項,它是一個滾動菜單。

          <select name="" multipile size="">options go here</select>

          name屬性是必須的,multipile屬性指明用戶可以通過按下crtl鍵并單擊多個選項來選擇它們

          列表框的單選行為可作為單選按鈕。

          <option selected value="text"></options>
          • 創(chuàng)建隱藏域
          <input type="hidden" name="text"value="">
          • 實現(xiàn)上傳文件的HTML表單
          <input type="FILE" name="name" accept="time" value="text">

          其中type屬性是必須的。格式通過使用MIME碼指定。常用的格式如下:


          超文本標記語言文本 .html,.html text/html

            普通文本 :txt text/plain

            word文檔:application/msword

            RTF文本 :rtf application/rtf

            GIF圖形 :gif image/gif

            JPEG圖形 :jpeg,

            jpg: image/jpeg

            au聲音文件:au audio/basic

            MIDI音樂文件 :mid,.midi audio/midi,audio/x-midi

            RealAudio音樂文件 .ra, .ram audio/x-pn-realaudio

            MPEG文件 .mpg,.mpeg video/mpeg

            AVI文件 .avi video/x-msvideo

            GZIP文件 .gz application/x-gzip

            壓縮文件.rar application/octet-stream

            壓縮文件.zip application/x-zip-compressed

            TAR文件 .tar application/x-tar


          更多提交表單的信息

          • 使用圖像提交數(shù)據(jù)
          <input type="image" src="url" name="text" align="align">
          • 創(chuàng)建重置按鈕
          <input type="reset" value="text">

          主站蜘蛛池模板: 亚洲av无码一区二区三区天堂古代| 国产A∨国片精品一区二区| 中文字幕一区在线播放| 国产亚洲情侣一区二区无码AV| 国精品无码A区一区二区| 一区二区三区在线观看| 视频在线一区二区三区| 国内自拍视频一区二区三区| 精品久久国产一区二区三区香蕉 | 四虎成人精品一区二区免费网站| chinese国产一区二区| 精品国产一区二区三区www| 精品人无码一区二区三区| 国产色精品vr一区区三区| 成人丝袜激情一区二区| 2022年亚洲午夜一区二区福利| 成人区精品一区二区不卡| 国产综合精品一区二区| 国产SUV精品一区二区88L| 日本精品视频一区二区三区| 成人丝袜激情一区二区| 伊人久久精品一区二区三区| 一区二区三区无码被窝影院| 国产91大片精品一区在线观看| 人妻夜夜爽天天爽爽一区| 91一区二区视频| 精品国产一区二区三区www| 国产一区在线视频观看| 一区二区不卡久久精品| 日韩一区二区三区视频| 国产婷婷色一区二区三区| 亚洲香蕉久久一区二区| 国99精品无码一区二区三区| 日韩精品无码免费一区二区三区 | 久久人妻av一区二区软件| 蜜桃无码一区二区三区| 日韩一区二区三区精品| 无码人妻AⅤ一区二区三区| 人妻视频一区二区三区免费| 一区二区三区日本电影| 亚洲视频在线一区二区三区|