整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          第66節 表單按鈕下拉選項及表單序列化-Web前端開發之JavaScript

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

          按鈕Button:
          按鈕是最常用的表單元素之一,有兩種形式的按鈕,button按鈕和radio單選、checkbox復選按鈕;
          提交和重置元素本身就是按鈕,并且有相關聯的默認動作,如果其click事件處理程序返回false,也就取消它的默認行為了;也可以使用它們的click事件來執行表單的驗證及提交,但最為常用的還是使用form對象本身的submit事件進行驗證和提交;
          普通按鈕是沒有默認行為的,一般來說使用它們來執行自定義腳本,當然也可以用它來執行form.submit()方法來提交表單;
          對于type為”submit”或type=”image”的按鈕,HTML5新增了formaction、formmethod、formenctype、formtarget屬性,其中formaction屬性用于覆蓋form的 action屬性,作用是為不同的提交按鈕增加formaction屬性,使得在單擊時可以將表單提交給不同的頁面;formmethod屬性為每個不同的提交按鈕分別指定不同的提交方法;formenctype屬性為每個不同的提交按鈕分別指定不同的編碼方式;formtarget屬性用于為每個不同的提交按鈕指定在何處打開提交頁面;這些屬性在Javascript中都有相對應的同名屬性,如:

          <form action="demo.php">
              <input type="submit" formaction="center/" formmethod="GET" formtarget="_blank" formenctype="multipart/form-data" value="用戶中心" />
              <input type="submit" formaction="admin/" formmethod="POST" formaction="_self" formenctype="application/x-www-form-urlencoded" value="后臺管理" />
          </form>
          <script>
          var btnSubmit = document.forms[0].elements[0];
          console.log(btnSubmit.formAction);
          console.log(btnSubmit.formMethod);
          console.log(btnSubmit.formTarget);
          console.log(btnSubmit.formEnctype);
          </script>

          radio單選和checkbox復選按鈕(框)是開關按鈕,其只有兩種狀態:選中或未選中;

          <form id="myForm" name="myForm">
          <p>性別:
          <input type="radio" name="sex" id="male" value="1" />男
          <input type="radio" name="sex" id="remale" value="0" checked />女
          </p>
          <p>課程:
          HTML<input type="checkbox" name="course" id="c1" value="HTML" />
          CSS<input type="checkbox" name="course" id="c2" value="CSS" checked />
          JavaScript<input type="checkbox" name="course" id="c3" value="JavaScript" />
          </p>
          </form>
          <script>
          var male = document.getElementById("male");
          console.log(male); // <input>
          male = document.forms["myForm"].elements["male"];
          console.log(male);  // <input>
          </script>

          單選和復選按鈕都定義了checked屬性,該屬性為可讀寫的布爾值;defaultChecked屬性對應的是HTML的checked屬性,也是布爾值,它指定了元素在第一次加載頁面時是否選中;

          var male = document.forms["myForm"].elements["male"];
          var remale = document.forms["myForm"].elements["remale"];
          console.log(male.checked);  // false
          console.log(male.defaultChecked);  // false
          console.log(remale.checked);  // true
          console.log(remale.defaultChecked);  // true
          male.checked = true;
          console.log(male.checked);  // true
          console.log(male.defaultChecked);  // false
          console.log(remale.checked);  // false
          console.log(remale.defaultChecked);  // true
          male.defaultChecked = true;
          console.log(male.checked);  // true
          console.log(male.defaultChecked);  // true
          console.log(remale.checked);  // false
          console.log(remale.defaultChecked);  // true

          checked會令一個單選按鈕組中所有元素互斥,defaultChecked也是可寫的(W3C定義其是只讀的,所以寫入的操作是不規范的),但它不是互斥的;所以可以利用這兩個屬性把單選按鈕恢復到默認的狀態,如:

          male.checked = true;
          male.checked = male.defaultChecked; 
          remale.checked = remale.defaultChecked;

          對于復選框,也是類似的,但其checked不是互斥的,因為它本身就允許多選;
          例如:復位單選和復選狀態;

          <p><input type="button" value="重置單選和復選" id="resetRadioCheckbox" /></p>
          <script>
          var resetRadioCheckbox = document.getElementById("resetRadioCheckbox");
          resetRadioCheckbox.onclick = function(){
              // var radioList = document.querySelectorAll('input[type="radio"]');
              var radioList = document.getElementsByName("sex"); // 也可以
              console.log(radioList);
              for(var i=0,len=radioList.length; i<len; i++)
                  radioList[i].checked = radioList[i].defaultChecked;
              
              var checkList = document.getElementsByName("course");
              for(var i=0,len=checkList.length; i<len; i++)
                  checkList[i].checked = checkList[i].defaultChecked; 
          }
          </script>

          單選和復選按鈕本身并不顯示任何文本,它們通常和相鄰的HTML文本一起顯示或與<label>元素相關聯,所以其value屬性并不顯示出來,而只是為了提交給服務端;

          var radioList = document.getElementsByName("sex");
          for(var i=0,len=radioList.length; i<len; i++){
              if(radioList[i].checked)
                  console.log("被選中的值是:" + radioList[i].value);
          }
          var checkList = document.getElementsByName("course");
          var checkStr = "";
          for(var i=0,len=checkList.length; i<len; i++){
              if(checkList[i].checked)
                  checkStr += checkList[i].value + ",";
          }
          if(checkStr != "")
              checkStr = checkStr.substring(0,checkStr.length - 1);
          else
              checkStr = "無";
          console.log("被選中的值是:" + checkStr);

          同時,也會根據獲取來的值來設置單選或復選按鈕的選中狀態,如:

          window.onload = function(){
              var sexValue = 1; // 從服務端獲取
              var radioList = document.getElementsByName("sex");
              for(var i=0,len=radioList.length; i<len; i++){
                  if(radioList[i].value == sexValue){
                      radioList[i].checked = true;
                      break;
                  }
              }
              var courseValue = "JavaScript,HTML";  // 從服務端獲取
              var arrCourse = courseValue.split(",");
              var checkList = document.getElementsByName("course");
              for(var i=0,len=checkList.length; i<len; i++){
                  // if(arrCourse.indexOf(checkList[i].value) >= 0) // 或者
                  if(arrCourse.includes(checkList[i].value))
                      checkList[i].checked = true;
                  else
                      checkList[i].checked = false;
              }
          }

          其往往成組并使用共享的name,如果使用共享的name獲取這些元素時,返回是一個類數組而不是單個元素;

          <script>
          var sex = document.getElementsByName("sex");
          console.log(sex);  // NodeList
          var sex = document.forms["myForm"].elements["sex"];
          console.log(sex);  // RadioNodeList
          </script>

          使用elements集合,返回的類型是更具體的RadioNodeList,該類型擁有一個value屬性,返回單選按鈕組中選中的value值;該屬性是可讀寫的,在設置value屬性時,value屬性等于值的第一個單選按鈕元素將被設置為checked,如:

          console.log(sex.value);  // 0
          sex.value = "1";  // 男就被選中的
          console.log(sex.value);

          radio單選按鈕的本意就是在一組單選按鈕組中只能選擇唯一一個,如果只有一個radio按鈕,是沒有多大實際意義的;即使如此,如果使用elements屬性,其返回的就不是NodeList,而是單個元素對象;

          <p><input type="radio" id="single" name="single" value="單個按鈕" /></p>
          </form>
          <script>
          var single = document.forms[0].elements["single"];
          console.log(single);  // <input>
          single.checked = true;
          console.log(single.checked);
          console.log(single.defaultChecked);
          console.log(single.value);  // 單個按鈕
          </script>

          在獲取checkbox時,如:

          var courses = document.getElementsByName("course");
          console.log(courses);  // NodeList<input>
          var courses = document.forms["myForm"].elements["course"];
          console.log(courses); // RadioNodeList<input>

          雖然當前為checkbox組,并不是radio組,但返回的也是RadioNodeList,并不是類似的CheckboxNodeList類型,而且也不存在這個類型;
          其返回的RadioNodeList集合的value屬性無用;獲取所有選中復選按鈕的值,可以遍歷所有被選中的選項;

          當單擊單選或復選按鈕時,會觸發onclick事件,如果單擊時改變了開關按鈕的狀態,也會觸發change事件;

          var sexList = document.forms[0].elements["sex"];
          for(var i=0,len=sexList.length; i<len; i++){
              var sex = sexList[i];
              sex.addEventListener("change", function(event){
                  console.log(event.target.checked);
                  console.log(event.target.defaultChecked);
              });
          }
          var courseList = document.forms[0].elements["course"];
          var log = document.getElementById("log");
          var arrCourse = [];
          for(var i=0,len=courseList.length; i<len; i++){
              if(courseList[i].checked)
                  arrCourse.push(courseList[i].value);
          }
          console.log(arrCourse.join());
          log.innerText = arrCourse.join();
          for(var i=0,len=courseList.length; i<len; i++){
              var course = courseList[i];
              course.addEventListener("change", function(event){
                  if (event.target.checked) {
                      arrCourse.push(event.target.value);
                  }else{
                      arrCourse.splice(arrCourse.indexOf(event.target.value),1);
                  }
                  console.log(arrCourse.join());
                  log.innerText = arrCourse.join();
              },false);
          }

          示例:全選:

          <p>
          HTML<input type="checkbox" name="course" value="HTML" />
          CSS<input type="checkbox" name="course" value="CSS" />
          JavaScript<input type="checkbox" name="course" value="JavaScript" />
          </p>
          <p><button id="all">全選</button>
              <button id="not">全不選</button>
          <button id="reverse">反選</button></p>
          <script>
          var chkBoxs = document.getElementsByName("course");
          // 全選
          var all = document.getElementById("all");
          all.onclick = function(){
              for(var i=0; i<chkBoxs.length; i++){
                  chkBoxs[i].checked = true;
              }
          }
          // 全不選
          var not = document.getElementById("not");
          not.onclick = function(){
              for(var i=0; i<chkBoxs.length; i++){
                  chkBoxs[i].checked = false;
              }
          }
          // 反選
          var reverse = document.getElementById("reverse");
          reverse.onclick = function(){
              for(var i=0; i<chkBoxs.length; i++){
                  chkBoxs[i].checked = !chkBoxs[i].checked;
              }
          }
          </script>

          示例:同意提交

          <div id="content">
          <p>Lorem ...</p>
          </div>
          <p><label>同意此協議</label><input type="checkbox" id="cbAgree" disabled /></p>
          <input type="submit" value="提交" id="btnSubmit" disabled />
          <script>
          window.onload = function(){
              var cbAgree = document.getElementById("cbAgree");
              var btnSubmit = document.getElementById("btnSubmit");
              var s = 5;
              var timer = setInterval(function(){
                  btnSubmit.value = "等待" + s + "秒";
                  if(--s < 0){
                      clearInterval(timer);
                      btnSubmit.value = "提交";
                      cbAgree.disabled = false;
                  }
              },1000);
              cbAgree.addEventListener("change", function(event){
                  btnSubmit.disabled = !cbAgree.checked;
              },false);
          }
          </script>

          Label標簽元素:
          其與其它表單元素關聯,關聯的方式有兩種:一是使用for屬性,二是將<input>直接嵌套在<label>中,在這種情況下,不需要for和id屬性,因為關聯是隱式的;
          表單的elements集合中并不包括Lable;

          Label屬性:

          • form:只讀,是一個HTMLFormElement對象,表示與其關聯的Form;如果沒有關聯Form,則為null;
          • control:只讀,表示與標簽關聯的表單元素;
          • htmlFor:可讀可寫,是一個字符串,表示與其關聯的表單元素的ID,與其HTML的for屬性對應;
          var label = document.getElementsByTagName("label")[1];
          console.log(label);
          console.log(label.form);
          console.log(label.control);
          console.log(label.htmlFor);
          label.htmlFor = "c2";
          console.log(label.control);  // checkbox
          console.log(label.htmlFor);  // c2

          表單元素的labels屬性:只讀,返回表單元素關聯的所有<label>元素的NodeList,如:

          <p><label for="content">內容:</label><br/>
          <textarea id="content" name="content"></textarea><br/>
          <label for="content">請輸入簡要的內容</label></p>
          </form>
          <script>
          var content = document.forms["myForm"].elements["content"];
          console.log(content.labels);  // NodeList(2)
          var label = content.labels[0];
          console.log(label);  // label
          console.log(label.textContent);  // 內容:
          console.log(label.form);  // <form>
          console.log(label.control);  // textarea#content
          console.log(label.htmlFor);  // content
          </script>

          select選擇框:
          選擇框是通過<select>和<option>元素創建的,其屬于HTMLSelectElement類型,瀏覽器通常將其渲染為下拉菜單的形式或設置其size屬性大于1呈現為列表的形式;

          <form id="myForm" name="myForm">
          <select name="province" id="province">
              <option value="beijing" label="大北京">北京</option>
              <option>安徽</option>
              <option value="jiangsu">江蘇</option>
              <option value="guangdong">廣東</option>
              <option value="shangdong">山東</option>
          </select>
          </form>

          其擁有除了所有表單元素共有的屬性和方法外,還提供了:

          • size :選擇框中可見的行數;等價于HTML中的size特性;
          • multiple:布爾值,表示是否允許多選;等價于HTML中的multiple特性;
          • type:值為”select-one”或”select-multiple”,取決于HTML代碼中有沒有multiple特性;
          • options:控件中所有<option>元素的HTMLCollectoin;
          • selectedIndex:選中項的索引,如果沒有選中項,為0;對于多選,只保存選中項中第一項的索引;
          • selectedOptions:表示所選中<option>元素集的HTMLCollection;
          • add(newOptoin, relOption):向<select>中插入新<option>元素,其位置在指定項relOption之前;
          • remove(index):移除給定位置的<option>選項;
          • length:返回<option>數量;
          • value:由當前選中項決定:如果沒有選中的項,則為空字符串;如果有一個選中項,而且該項的value特性已經在HTML中指定,就等于該option的value值,即使該value是空字符,也是如此;如果有一個選中項,但該項的value特性在HTML中未指定,則該value等于該項的文本(text);如果有多個選中項,取得第一個選中項的值;當其type為select-one和select-multiple時,其選擇的行為是不一樣的,如果為select-multiple,允許多選,但此時,其value返回的是第一個option的value值;
          • options屬性,其返回包含了多個Option元素的HTMLOptionsCollection集合,如:
          var province = document.forms[0].elements["province"];
          console.log(province.options);  // HTMLOptionsCollection

          該集合擁有length、selectedIndex屬性和add()及remove()方法;其中selectedIndex返回的是選中項的索引;通過options的索引可以返回一個option對象;

          console.log(province.options.selectedIndex);  // 2
          console.log(province.selectedIndex);  // 2
          console.log(province.options[1]);  // <option>

          通過select對象的item(index)方法或select的索引也可以返回一個option對象;

          var opt = selectbox.item(1);
          var opt = selectbox[1];
          console.log(opt);
          console.log(opt.index);
          console.log(opt.text);

          每個<option>元素屬于HTMLOptionElement類型,該類型繼承自成 HTMLElement,其擁有下列屬性:

          • index:當前項在options集合中的索引;
          • form:只讀,其所屬的form,與其所在的HTMLSelectElement 對象的form屬性一致;
          • label:當前選項的Label屬性;如果沒有此屬性,則返回元素的text;
          • selected:布爾值,表示當前選項是否被選中;將這個屬性設置為true可以選中當前選項;
          • defaultSelected:對應其HTML的selected特性的初始值;
          • text:選項顯示的純文本字符串;
          • value:選項的值;等價于HTML中的value特性,即提交給服務端的文本;

          設置這些屬性的目的,是為了方便對選項數據的訪問,雖然可以使用常規的DOM功能來訪問這些信息,但效率比較低:

          var province = document.forms[0].elements["province"];
          // 不推薦
          // var text = province.options[0].firstChild.nodeValue;
          var text = province.options[0].textContent; // 或
          var value = province.options[0].getAttribute("value");
          console.log(text, value);
          // 推薦
          var text = province.options[0].text;
          var value = province.options[0].value;
          console.log(text, value);
          console.log(province.options[0].index);
          console.log(province.options[0].selected);
          console.log(province.options[0].label);
          province.options[2].selected = true;
          // options[1]沒有value,所以返回其text
          console.log(province.options[1].value);

          在未指定value特性的情況下,IE7會返回空字符串,其他會返回與text特性相同的值;

          <opggroup>:
          <optgroup>HTML元素在<select>元素中創建一組選項,其屬于HTMLOptGroupElement類型,屬性為:
          disabled:是一個布爾值,表示整個子項列表<option>是否已禁用(true)或未禁用(false);
          label:表示組label屬性;

          <form>
          <select id="selectbox">
              <optgroup label="前端" disabled>
                  <option>HTML</option>
                  <option>CSS</option>
                  <option>JavaScript</option>
              </optgroup>
              <optgroup label="后端">
                  <option>C#</option>
                  <option>Java</option>
                  <option>PHP</option>
              </optgroup>
          </select>
          <script>
          var selectbox = document.getElementById("selectbox");
          var optgroup = selectbox.getElementsByTagName("optgroup")[0];
          console.dir(optgroup);  // HTMLOptGroupElement
          console.dir(optgroup.label);  // 前端
          </script>

          選擇選項:
          對于只允許選擇一項的選擇框,最簡單的方式就是直接使用selectedIndex屬性,利用此屬性既可以獲取選中的項,也可設置某個項被造中;如:

          var selectedIndex = province.selectedIndex;
          var selectedOption = province.options[selectedIndex];
          console.log("選中項的索引:" + selectedIndex + ",text" + selectedOption.text + ",value:" + selectedOption.value);
          province.selectedIndex = 1;  // 根據索引設置選中項
          var selectedIndex = province.selectedIndex;
          var selectedOption = province.options[selectedIndex];
          console.log("選中項的索引:" + selectedIndex + ",text" + selectedOption.text + ",value:" + selectedOption.value);

          對于multiple多項的選擇,單個selectedIndex屬性不足以表示被選中的多個選項,即使選中多個,讀取則只會返回選中項第一項的索引值且其value值也是第一個選中的Option的value值;

          selected屬性:另一種選擇選項的方式,即取得某一項的引用,然后將其selected屬性設置為true;

          console.log(province.options[0].selected); // false
          console.log(province.options[2].selected); // true
          province.options[0].selected = true;
          province.options[1].selected = true;

          與selectedIndex不同的是,在允許多選的選擇框中設置選項的selected屬性,不會取消對其他選中項的選擇,因而可以動態選中任意多個項;但如果是在單選擇框中,會取消對其他選擇的選擇;

          selected屬性的作用主要是確定用戶選擇了選擇框中的哪些項;要取得所有選中的項,可以遍歷Options選項集合,逐個測試每個選項的selected屬性:

          var province = document.forms[0].elements["province"];
          function getSelectedOptions(selectbox){
              var result = new Array();
              var option = null;
              for(var i=0, len=selectbox.options.length; i<len; i++){
                  option = selectbox.options[i];
                  if(option.selected){
                      result.push(option);
                  }
              }
              return result;
          }
          var province = document.forms[0].elements["province"];
          var selectedOptions = getSelectedOptions(province);
          var msg = "";
          for(var i=0,len = selectedOptions.length; i<len; i++){
              msg += "index:" + selectedOptions[i].index + ",text:" + selectedOptions[i].text + ",value:"+ selectedOptions[i].value  + ";";
          }
          console.log(msg);

          selectedOptions屬性:只讀屬性,其返回當前選定的<option>元素的HTMLCollection;

          console.log(province.selectedOptions); // HTMLCollection

          如果是select-one單選,其中包含一個option,如果是select-mutiple多選,就包括所有選定的option;
          例如:獲取所有選中項

          <label for="foods">你喜歡吃什么?</label><br>
          <select id="foods" name="foods" size="7" multiple>
              <option value="1">蘋果</option>
              <option value="2">香蕉</option>
              <option value="3">桔子</option>
              <option value="4">披薩</option>
              <option value="5">西紅柿</option>
          </select>
          <br>
          <button name="order" id="order">確定</button>
          <p id="output"></p>
          <script>
          var orderButton = document.getElementById("order");
          var itemList = document.getElementById("foods");
          var outputBox = document.getElementById("output");
          orderButton.addEventListener("click", function() {
              var collection = itemList.selectedOptions;
              var output = "";
              for (var i=0; i<collection.length; i++) {
                  if (output === "") {
                      output = "你喜歡吃的食物如下:";
                  }
                  output += collection[i].text;
                  if(i === (collection.length - 2) && (collection.length < 3))
                      output +=  "和";
                  else if(i < (collection.length - 2))
                      output += ",";
                  else if(i === (collection.length - 2))
                      output += "和";
              }
              if(output === "")
              output = "你啥也不喜歡";
              outputBox.innerHTML = output;
          }, false);
          </script>

          添加選項:
          可以動態添加選項,并將它們添加到選擇框中;有多種添加的方式:
          第一種:使用DOM方法:

          var newOption = document.createElement("option");
          newOption.appendChild(document.createTextNode("天津"));
          // newOption.setAttribute("value", "tianjin");
          newOption.value = "tianjin";
          selectbox.appendChild(newOption);

          第二種:使用Option構造函數來創建新選項:
          語法:var option = new Option(text?, value?, ?defaultSelected, ?selected);參數text和value分別設置Option對象的text和value;后兩個參數,分別設置option的defaultSelected和selected屬性,4個參數均為可選;其會返回一個<option>元素;

          var newOption = new Option("上海", "shanghai");
          selectbox.appendChild(newOption);
          newOption = new Option("四川","sichuan",true,true);
          selectbox.appendChild(newOption);
          newOption = new Option();
          newOption.text = "貴州";
          newOption.value = "guizhou";
          newOption.label = "美麗貴州";
          newOption.selected = true;
          selectbox.appendChild(newOption);

          IE7以下不可用,因為它不能正確設置新選項的text屬性;

          第三種:使用選擇框的add()方法:
          語法:select.add(option[, before);其接受兩個參數:要添加的新選項option和將位于新選項之后的選項before;before即可以是一個option也可以是選項的索引;before為可選,如果要在列表的最后添加選項,應該將第二個參數設置為null、undefined或者不設;如:

          var newOption = new Option("上海", "shanghai");
          selectbox.add(newOption, selectbox.options[1]); // 第2個位置
          selectbox.add(newOption, 1); // 第2個位置
          selectbox.add(newOption, null); // 最后位置
          selectbox.add(newOption, undefined); // 最后位置
          selectbox.add(newOption, 100); // 最后位置
          selectbox.add(newOption); // 最后位置

          如果將新選項添加到任意位置,使用DOM技術和insertBefore()方法也可以;

          第四種,使用options屬性也可以把新的option添加到選擇框中,或者使用表單索引,如:

          var newOption = new Option("上海", "shanghai");
          selectbox.options[selectbox.options.length] = newOption; // 或者
          selectbox[selectbox.options.length] = newOption;
          // 如,添加多個
          var arrOptions = ['重慶','云南','廣西'];
          arrOptions.forEach(function(v,i){
              selectbox[selectbox.options.length] = new Option(v);
          });
          // 或
          arrOptions = [
              {text: "重慶", value: "chongqing"},
              {text: "云南", value: "yunnan"},
              {text: "廣西", value: "guangxi"}
          ];
          arrOptions.forEach(function(v,i){
              selectbox[selectbox.options.length] = new Option(v.text, v.value);
          });

          移除選項:
          移除選項也有多種方式:首先可以使用DOM的removeChild()方法,為其傳入要移除的選項;其次可以使用選擇框的remove()方法,為其傳入要移除選項的索引;最后,可以將相應選項設置為null;

          selectbox.removeChild(selectbox.options[1]);
          selectbox.remove(2);
          selectbox.options[2]=null;
          // 如果不帶參數,會刪除selectbox本身
          selectbox.remove();

          移除選擇框中所有的項,可以迭代所有選項并逐個移除:

          function clearSelectbox(selectbox){
              for(var i=0,len=selectbox.options.length; i<len; i++){
                  selectbox.remove(0);
              }
          }
          clearSelectbox(selectbox);

          使用options屬性也可以移除全部或某個選項,

          selectbox.options[1] = null;  // 移除第2個
          selectbox.options.length = 2; // 截斷,只保留2個
          // selectbox.options.length = 0; // 移除所有
          selectbox.length = 0; // 移除所有

          移動選項:
          將一個選擇框中的選項移動到另一個選擇框中,使用DOM的appendChild()方法,因為使用appendChild()方法并傳入一個已存在的元素,那么就會先從該元素的父節點中移除它,再把它添加到新的指定的位置;

          var selectbox1 = document.getElementById("selLocation1");
          var selectbox2 = document.getElementById("selLocation2");
          selectbox2.appendChild(selectbox1.options[1]);

          移動和移除選項有一個共同之外,即會重置每一個選項的index屬性;

          <h3>移動選項</h3>
          <select name="sel1" id="sel1" size="8" multiple>
              <option value="">唐</option>
              <option value="">宋</option>
              <option value="">元</option>
              <option value="">明</option>
              <option value="">清</option>
          </select>
          <button id="toRight">>></button>
          <button id="toLeft"><<</button>
          <select name="sel2" id="sel2" size="8" multiple>
              <option value="">秦</option>
              <option value="">漢</option>
              <option value="">三國</option>
              <option value="">兩晉</option>
              <option value="">南北朝</option>
          </select>
          <script>
          var sel1 = document.getElementById("sel1");
          var sel2 = document.getElementById("sel2");
          var toRight = document.getElementById("toRight");
          var toLeft = document.getElementById("toLeft");
          toRight.onclick = function(){
              var options = sel1.selectedOptions;
              for(var i=options.length-1; i>=0; i--){
                  sel2.appendChild(options[i]);
              }
          };
          toLeft.onclick = function(){
              var options = sel2.selectedOptions;
              for(var i=options.length-1; i>=0; i--){
                  sel1.appendChild(options[i]);
              }
          }
          </script>

          重排選項:
          重排選項的次序,最好的方式也是DOM方法,如appendChild()適合將選項添加到選擇框的最后,insertBefore()可以將選項移動到指定位置,如:

          var optionToMove = selectbox.options[1];
          // 向上移一下
          selectbox.insertBefore(optionToMove,selectbox.options[optionToMove.index - 1]);
          // 向下移一下
          selectbox.insertBefore(optionToMove,selectbox.options[optionToMove.index + 2]);

          select的事件:
          選擇框的change事件與其他表單控件的change事件觸發的條件不一樣,其他控件的change事件是在值被修改且焦點離開時觸發,而選擇框的change事件只要選中了選項就會觸發;
          選擇不同的選項時,也會觸發input事件,如:

          selectbox.addEventListener("change", function(event){
              console.log(event.target.selectedIndex);
          });
          function inputHandler(e){
              console.log(e.target.value);
          }
          selectbox.addEventListener("input", inputHandler);

          示例:跳轉

          <select id="links">
              <option value="https://www.zeronetwork.cn">零點網絡</option>
              <option value="https://cn.bing.com">Bing</option>
              <option value="https://www.apple.com">蘋果</option>
          </select>
          <script>
          var links = document.getElementById("links");
          links.addEventListener("change", function(event){
              location.href = event.target.options[event.target.selectedIndex].value;
          });
          </script>

          表單序列化:
          隨著Ajax的出現,表單序列化已經成為一種常見需求;在Javascript中,可以利用表單元素的type屬性,連同name和value屬性一起實現對表單的序列化;
          瀏覽器把數據發送給服務器原理:

          • 對表單字段的名稱和值進行URL編碼,使用和號(&)分隔;
          • 不發送禁用的表單字段;
          • 只發送勾選的復選框和單選按鈕,并且復選框中的每個選中的值單獨一個條目;
          • 不發送type為”reset”和”button”的按鈕;
          • 多選選擇框中的每個選中的值單獨一個條目;

          如:表單簡單序列化;

          var btn = document.getElementById("btn");
          btn.addEventListener("click", submitHandler, false);
          function submitHandler(event){
              var myForm = document.forms[0];
              var username = myForm.elements["username"].value;
              var userpwd = myForm.elements["userpwd"].value;
              var sex = myForm.elements["sex"].value;
              var courseValue = [];
              var courseList = myForm.elements["course"];
              for(var i=0, len=courseList.length; i<len; i++){
                  if(courseList[i].checked)
                      courseValue.push(courseList[i].value);
              }
              var params = "username=" + username +
                          "&userpwd=" + userpwd +
                          "&sex=" + sex +
                          "&course=" + courseValue;
              console.log(params);
          }

          如:通用序列化:

          function serialize(form){
              // 后面要用到的變量
              var params = new Array();
              var field = null,
                  i, j, len,
                  optLen,
                  option,
                  chkObj = {};
                  
              for(i=0, len=form.elements.length; i<len; i++){
                  field = form.elements[i];
                  switch(field.type){
                      // 如果是select,包含單選和多選
                      case "select-one":
                      case "select-multiple":
                          arrOpt = [];
                          for(j=0, optLen=field.options.length; j<optLen; j++){
                              option = field.options[j];
                              if(option.selected){
                                  arrOpt.push(encodeURIComponent(option.value));
                              }
                          }
                          arrOpt = arrOpt.join(",");
                          params.push(encodeURIComponent(field.name) + "=" + arrOpt);
                          break;
                      // 如果是fieldset、file、submit、reset、button不提交
                      case undefined: //字段集
                      case "file":    //文件域
                      case "submit":  //提交
                      case "reset":   //重置
                      case "button":  //按鈕
                          break;
                      // 如果是單選或復選框
                      case "radio":
                      case "checkbox":
                          if(field.checked){
                              if(chkObj[field.name])
                                  chkObj[field.name].push(encodeURIComponent(field.value));
                              else
                                  chkObj[field.name] = [encodeURIComponent(field.value)];
                          }
                          break;
                      default:
                          // 如果沒有名字的表單元素,不提交
                          if(field.name.length)
                              params.push(encodeURIComponent(field.name) + "=" + encodeURIComponent(field.value));
                  }
              }
              for(var o in chkObj){
                  params.push(encodeURIComponent(o) + "=" + chkObj[o].join(","));
              }
              return params.join("&");
          }
          // 應用
          var btn = document.getElementById("btn");
          btn.addEventListener("click", submitHandler, false);
          function submitHandler(event){
              var myForm = document.forms[0];
              var params = serialize(myForm);
              console.log(params);
          }

          無刷新提交(局部刷新):

          <script>
          function saveUserInfo(){
              var msg = document.getElementById("msg");
              var form = document.forms[0];
              // 提交地址
              var url = "./demo.php"; 
              // POST的值,把每個變量都通過&來聯接
              var postStr = serialize(form);
                  
              // XmlHTTP
              var XmlHTTP;
              if(window.XMLHttpRequest) {
                  XmlHTTP = new XMLHttpRequest();
              }else if(window.ActiveXObject) {
                  XmlHTTP = new ActiveXObject("Microsoft.XMLHTTP");
              }
              XmlHTTP.open("POST", url, true);
              //定義傳輸的文件HTTP頭信息
              XmlHTTP.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
              XmlHTTP.send(postStr); //發送POST數據
              //獲取執行狀態
              XmlHTTP.onreadystatechange = function() {
                  //如果執行狀態成功,那么就把返回信息寫到指定的層里
                  if (XmlHTTP.readyState == 4 && XmlHTTP.status == 200) {
                      msg.innerHTML = XmlHTTP.responseText;
                  }
              }
          }
          </script>
          <div id="msg"></div>
          <form name="userinfo" method="post" action="">
              姓名:<input type="text" id="username"name="username" /><br />
              年齡:<input type="text" name="age" /><br />
              性別:<input type="text" name="sex" /><br />
              <input type="button" value="提交表單" onClick="saveUserInfo()">
          </form>

          demo.php:

          <?php
          $username = $_POST['username'];
          $age = $_POST['age'];
          $sex = $_POST['sex'];
          echo "$username <br>";
          echo "$userage <br>";
          echo "$usersex <br>";
          // 鏈接數據庫,并保存到數據庫,$result為執行結果
          $result = true;
          if ($result){
              echo "提交成功!";
          }
          else {
              echo "提交失敗!";
          }
          ?>

          整合:saveUserInfo()中換成:

              // 提交地址
              var url = "./demo.php"; 
              // POST的值,把每個變量都通過&來聯接
              var postStr = serialize(form);

          submitHandler()事件處理函數:

          言:萬物之始,大道至簡,演化至繁。水滴不染塵世浮華,方能純凈如冰川靈動如絲絨。落紅不逐春日絢爛,方有一年春盡一年春。

          一、html5的介紹

          1.1介紹

          html號稱超文本標記語言,代表著瀏覽器技術發展的一個階段。html版本1到版本5的更新迭代都是由組織W3C管理的。當時到html4.1的時候,W3C組織就聲稱不再更新版本了。而改用XHTML。但是由于瀏覽器的各種不兼容的問題,于是乎W3C這個組織就和其他的瀏覽器產商一起聯合起來將這門語言再次更新到html5

          比喻:

          html5 >機器人的骨骼

          css3 >機器人的外在修飾

          js > 機器人的行為如行走、抬腿

          Jquery > 封裝好的控制行為的庫,可以提高效率

          1.2優勢

          • 易用性

          • 支持視頻和音頻

          • 互動性高

          • 支持移動設備

          • 未來的趨勢

          1.3開發工具

          HBuild、WebStrom、sublime Text

          二、代碼規范

          2.1代碼規范

          新建一個Web項目

          相比html4來說,html5的語法更加簡潔并且在規定上也更加寬松。

          • 單標簽不用寫關閉符號

          • 雙標簽省略結束標簽

          • html、head、body、colgroup、tbody可以完全省略

          • 刪除其中一些,打開瀏覽器的檢查元素功能,也不會報錯

          三、各類標簽

          3.1文本標簽

          • b標簽:表示關鍵字和產品名稱。<b>html</b>其實它的實際作用就是將一段文字加粗。但是并不是特別強調它的重要性。比如說:在一段文字當中出現的某些關鍵字或者產品的名稱就可以用b標簽

          • strong標簽:表示比較重要的文字<strong>html</strong>它的作用也是加粗,只是它在強調一段比較重要的文本

          • br單標簽:換行

          • wbr標簽:安全換行you've no idea how worried <wbr> i was當用戶對網頁進行縮放的時候可能會有一些單詞被擠到下一行。如果不行某個單詞被分離的話,可以使用安全換行標簽

          • i標簽:傾斜。em標簽語義一樣,但em表示強調<i>傾斜標簽</i>它用于表示外文詞匯或科技術語

          • s標簽:刪除線。del標簽表示強調。<s>html</s>刪除線

          • u標簽:給文字加下劃線。ins標簽表示強調<u>html</u>下劃線

          • small標簽:添加小號字體<small>放小一號</small>將文本放小一號。通常用于免責聲明和澄清聲明。

          • sub和sup標簽:添加上標和下標X<sub>5</sub>和Y<sup>2</sup>(sub和sup長差不多,這個要如何去記憶呢?大家可以看到b的肚子在下面,所以呢它是下標,而p的頭部在上方,所以記錄是上標。那這樣一來是不是就感覺清晰了許多呢)

          • q標簽:引用來自其它出處的內容<q>有朋自遠方來</q>

          • ruby標簽:語言元素。常用于幫助讀者正確發音。<ruby>夔<rp>(</rp><rt>kui</rt><rp>)</rp></ruby><rp><rt>用來幫助讀者掌握表意語言文字的正確發音。比如說漢語拼音在文字的上方。

          • bdo標簽:設置文字方向<bdo dir="rtl">設置文字方向</bdo>dbo必須使用屬性dir才可以設置,一共兩個值:rtl從右到左和ltr從左到右。一般默認是ltr。還有一個bdi元素也是處理方向的,由于是特殊語言的效果,并且主流瀏覽器有些不支持,所以可以忽略。

          • mark標簽:突出顯示文本<mark>突出顯示文本</mark>加上一個黃色的背景,黑色的字。從語義上來看,與上下文相關而突出的文本,用于記號。

          • a標簽:超鏈接a元素屬于文本元素,有一些私有屬性。

            href屬性 <a >百度</a> 這個屬性是必須的,否則a元素就變得毫無意義。它的屬性值意味著點擊跳轉到指定的外部網站去。

            target屬性<a target="_blank">百度</a> 這個屬性告訴瀏覽器希望打開的新窗口顯示在哪里。_blank表示在新窗口中打開文檔。_self表示在當前窗口打開文檔。默認_self。(_parent和_top這些要結合框架來使用,但是基本上用得已經很少了。)

            錨點設置:用于將同一個文檔中的另一個元素移入視野。說通俗一點就是通過點擊這個錨點定位到頁面中的某個位置。

          <a href="#1">第一節</a>

          <a href="#2">第二節</a>

          <a href="#3">第三節</a>

          </br>

          ==========以下全都是分隔符============</br>

          ==========以下全都是分隔符============</br>

          ==========以下全都是分隔符============</br>

          <a name="1">第一節的內容 我?應該說點啥的。

          ==========以下全都是分隔符============</br>

          ==========以下全都是分隔符============</br>

          ==========以下全都是分隔符============</br>

          </a>

          ==========以下全都是分隔符============</br>

          ==========以下全都是分隔符============</br>

          &hellip;&hellip;以上省略一萬行&hellip;&hellip;

          ==========以下全都是分隔符============</br>

          <a name="2">第二節的內容 我?應該說點啥的。

          ==========以下全都是分隔符============</br>

          ==========以下全都是分隔符============</br>

          ==========以下全都是分隔符============</br>

          </a>

          3.2分組標簽

          顧名思義,分組元素就是用來組織相關內容的html元素,對它們進行清晰有效的分類。

          • p標簽:表示段落<p>這是一個段落</p> <p>這是一個段落</p>p標簽就是將內部包含的文本形成一個段落。它們可以自動換行,而且段落與段落之間保持一定量的空隙。

          • div標簽:通用分組<div>這是一個塊標簽</div> <div>這是另一個塊標簽</div>在早期的版本中經常用到,用div將其他數據或標簽包裹起來,進而進行布局。但是在html5中,漸漸被其他元素替代。(它與p標簽的區別就是兩段文本間沒有空隙??障堕g隔和br標簽換行一樣)

          • blockquite標簽:引用大段其他地方的內容<blockquote>引用別人的內容的輔導費打發打發可以換行哦他也有首尾縮進的效果</blockquote>有段落空隙的功能,還包含了首尾縮進的功能。

          • pre標簽:按照原格式展示數據<pre> 我就是 長這樣的 參差不齊 </pre>(有時候某些文字就想要按照原來的格式顯示出來就要用到pre標簽。它就是將數據原封不動的顯示出來)

          • hr標簽:單標簽。添加一條分割線。

          • ul和li標簽:添加無限列表

          <ul>

          <li>貂蟬</li>

          <li>大喬</li>

          <li>小喬</li>

          <li>孫尚香</li>

          </ul>

          ul標簽表示無序列表(就像咱們平時說的無符號整形,在前面也是加了一個u),而li標簽則表示內部的列表項

          • ol和li:表示有序列表

          • start屬性:表示從第幾個序列開始統計。<ol start="2">

          • reversed屬性:是否倒序排列。<ol reversed>(不過這個屬性有很多的瀏覽器不支持,所以要謹慎使用)

          • type屬性:表示列表的編號的類型 <ol type="A">

          • value屬性:這是屬于li的屬性。表示強行設置某個項目的編號。<li value="7">安琪拉</li>

          • dl、dt、dd:列表標簽

          <dl>

          <dt>第一份內容</dt>

          <dd>第一行詳細內容</dd>

          <dd>第二行詳細內容</dd>

          <dl>

          雖然說這三個標簽是一個整體,但是dt和dd標簽并非都必須出現

          • figure和figcaption標簽:使用插圖的意思。一般用于圖片的布局。

          <figure>

          <figcaption>這里有一張圖哦</figcaption>

          <img src="img.png">

          </figure>

          3.3表格標簽

          表格的用途是以網格的形式顯示二維數據。開發者可以對表格中的元素標簽設置不同的屬性如邊框寬度、顏色等使表格呈現出不同的效果。

          3.3.1 標簽

          • table:表示表格標簽

          • tr:代表某一行

          • td:代表一個單元格。

          <table border="1" style="width:300px;">

          <tr> <!--相當于行-->

          <td>王昭君</td> <!--相當于每行中的每一列-->

          <td>沉魚落雁</td>

          <td>法師</td>

          </tr>

          <tr> <!--相當于行-->

          <td>貂蟬</td> <!--相當于每行中的每一列-->

          <td>羞花閉月</td>

          <td>刺客</td>

          </tr>

          </table>

          • th:代表標題單元格。代表標題,作用是將內部文字居中且加粗。

          <tr>

          <th>姓名</th>

          <th>特征</th>

          <th>職業</th>

          </tr>

          • thead:代表表頭。(某些時候,網頁上的表頭是由js動態生成的。有可能沒按照先后的順序排列,如此一來表頭就有可能顯示到第二行、第三行甚至是表尾。用thead將tr括起來可以讓數據永遠顯示在第一行)

          <thead>

          <tr>

          <th>姓名</th>

          <th>特征</th>

          <th>職業</th>

          </tr>

          • tfoot:表示表尾:與表頭相反

          • tbody:表示表格的主體部分

          • (這里非常建議用分主體、表頭、表尾的方式寫。因為到后期使用CSS樣式的時候只要拿到某個標簽就可以設置總體的樣式了,這樣就會非常方便)

          • caption:添加表格的標題

          • colgroup:群組。用于設置列的屬性。默認設置第一個(有的時候需要設置單獨列的屬性,如果說我只想設置第二列的屬性,則需要把第一列的設置成白色)

          <!--<table border="1" style="width:300px;">-->

          <colgroup style="background:white;" span="1"></colgroup> <!--設置第一個顏色為白-->

          <colgroup style="background:red;" span="1"></colgroup> <!--設置第二個顏色為紅 span代表一列-->

          • col:群組的子標簽。更加靈活的設置列屬性。通過占位符設置不需要的屬性。

          <colgroup>

          <col> <!--占位,表示第一列不設置-->

          <col style="background: pink;">

          </colgroup>

          3.3.2屬性

          • border:表示邊框的寬度 <table border="1"></table>

          • style:通用屬性。在css中做詳解。

          • colspan:合并列 <td colspan="3">統計</td>這句代碼表示共占三個單元格

          • rowspan:合并行

          <tr>

          <th rowspan="4">學員</th>

          <th>姓名</th>

          <th>特征</th>

          <th>職業</th>

          </tr>

          3.3文檔元素

          文檔元素的主要作用是劃分各個不同的內容,讓整個布局更加清晰。 進入代替div。讓整個布局元素都具有語義。

          • header標簽:表示頁面頭部。通常包括標題或導航等內容。下面內容會換行(在頁面中一般會用樣式將它設置到居中)

          • footer標簽:表示頁面的尾部,一般用于版權聲明、友情鏈接等。

          • h1-h6標簽:標題標簽,有字體加粗的效果。從1-6字號依次減小

          <h1>這里是一個大標題</h1> <h3>這里是一個副標題</h3>

          • hgroup:組合標題。hgroup的作用就是當多個標題出現,干擾到一對或多個本身需要整合的標題。

          <header>

          <hgroup>

          <h1>這里是一個大標題</h1>

          <h3>這里是一個副標題</h3>

          </hgroup>

          </header>

          <footer>

          <h4>這里是尾部的副標題</h4>

          這里存放頁面的尾部:如版權聲明,友情鏈接

          </footer>

          如上面那段代碼,頭部的h4標題就能與h1綁定起來,從而和尾部的h4分離。

          • section標簽: 定義一個文檔的主題內容

          • nav標簽: 給文檔頁面添加一個導航

          • aritcle標簽:添加一個獨立成篇的文檔(像平常看到的論壇,貼吧,評論都有自己的頭、尾和內容等)

          <article>

          <header>

          <nav>&hellip;&hellip;</nav>

          </header>

          </article>

          • aside標簽:生成注釋欄。

          <aside>這是一個注釋欄</aside>

          • address表示文檔或者是article元素的聯系信息

          • <address>聯系信息</address>

          • 本身有傾斜的效果。如果是在article元素下表示其下的聯系信息,如果是在body元素下表示整個文檔的聯系信息

          3.4嵌入元素

          嵌入元素主要功能是把外部的一些資源插入到html中。

          • img標簽:用于顯示圖片

          • src:嵌入圖像的url

          • alt:(如果圖片能正常顯示則沒有任何效果。若圖片加載不成功會出現備用內容)

          • width/height:定義圖片的寬度和高度,單位是像素<img src="img.png" alt="風景圖" width="320" height="400"/>

          • ismap:獲取到圖片區域的像素點加入了ismap屬性之后,點擊圖片在瀏覽器中就會獲得圖片被點擊的地方的像素點。(把文件在目錄中打開,講文件拷貝到谷歌瀏覽器打開就能看見)

          <a href="index.html">

          <img ismap src="img_5.jpg" alt="風景圖">

          </a>

          • usemap:創建分區的響應圖。比如說點擊圖片的某一部分,可以跳轉到某一個網頁。(當點擊了coords這塊區域時,跳轉到指定的網頁)

          <img src="img_5.jpg" usemap="#Map" />

          <map name="Map">

          <area shape="circle" coords="31,28,112,100" target="_blank" alt="方形">

          </map>

          • iframe標簽:嵌入另一個文檔。表示在一個頁面內建立一個區域引入另一個頁面。

          <a href="index.html" >index</a>

          <a target="in">百度</a>

          <iframe src="http://www.baidu.com" width="300" heigth="300" name="in"></iframe>

          • progress標簽:用于顯示進度

          • 該標簽會產生一個進度條,一般我們會用js代碼來控制其內部的值。(當前值用value來表示,而最大值用max來表示)

          <progress value="30" max="100"></progress>

          • meter標簽:顯示范圍里的值(類似于進度條,可以規定最大值和最小值max/min。low值規定它的值過低,high表示值過高。而optimun表示最佳值,但是這個屬性是呈現不出效果的)

          <meter value="90" min="10" max="100" low="40" high="80" optimum="60"></meter>

          3.5音頻和視頻標簽

          音頻和視頻文件其實都只是一個容器文件。視頻文件包含了音頻軌道、視頻軌道和其他一些元數據。視頻播放時,音頻軌道和視頻軌道是綁定在一起的。元數據包含了視頻的封面、標題字幕等信息。在網頁實現中,有很多的瀏覽器廠商都有自己的標準,所以html5規范也沒有強制指定編解碼器了。所以在網頁上嵌入視頻和音頻時,最好提供mp4格式和webM格式的視頻。否則有可能由于瀏覽器不兼容的問題導致視頻不能播放。

          • video標簽: 視頻標簽屬性:

          • src:視頻資源的url

          • width:視頻寬度

          • height:視頻高度

          • <video src="test.mp4" width="320" height="400"></video>

          • controls:設置后顯示播放控件(未設置這個屬性時,視頻就像一張圖片,設置controls之后才能顯示視頻播放控件)

          • <video src="test.mp4" width="320" height="400" controls></video>

          • autoplay:表示立即播放視頻

          • loop:反復播放視頻(也就是說在播放結束之后會重新播放視頻)

          • muted:設置之后,視頻會處于靜音狀態

          • poster:指定視頻數據載入時顯示的圖片。(相當于視頻的一個封面)

          <video src="test.mp4" width="320" height="400" controls

          poster="img_5.jpg"></video>

          • preload:預加載。不設置會在第一次播放自動緩存。如果值為none會直到用戶點擊時再加載視頻。如果值為metadata表示播放之前只加載第一幀。auto是默認的,表示要求瀏覽器盡快的加載視頻。

          • 兼容多個瀏覽器 source標簽

          <video src="test.mp4" width="320" height="400" controls poster="img_5.jpg">

          <source src="test.webm"/>

          <source src="test.mp4"/>

          </video>

          • audio標簽:用于嵌套音頻內容。屬性與視頻元素類似。只是沒有寬高設置和圖片。

          • <audio src="test.mp3" controls></audio>

          3.6表單標簽

          表單標簽是用于獲取用戶的輸入數據的。

          • form標簽:表示定義html表單。用該標簽包含的標簽具有提交功能。也就是說,在瀏覽器的地址欄里面能獲取到用戶的信息。(如果不定義表單,那么它是無法提交數據的)

          <form>

          用戶名:<input name="user">

          <button>提交</button>

          </form>

          屬性

          • action:表示表單提交到的頁面(也就是要把數據傳入到哪個頁面中)

          • method:表示表單的提交方式。默認是get。而get和post請求的區別就是post后面不跟請求體。也就是用戶信息。相對來說更加的安全。(一般來說,get是用于超鏈接提交居多,post用作表單提交居多)

          • <form method="post" action="http://www.haosou.com"></from>

          • enctype:表示瀏覽器對發送給服務器的數據采用的編碼格式。有三種格式。默認是不能將文件上傳到服務器&rdquo;application/x-www-form-urlencoded&ldquo;、multipart/form-data用于將文件上傳到服務器、text/plain不建議使用

          • name:設置表單名稱,以便程序調用

          • target:提交的目標,與超鏈接無異

          • autocomplete:設置瀏覽器記錄用戶輸入的信息。分為on和off兩個值。默認為on。

          • novalidate:設置是否執行客戶端數據有效性檢查

          • input標簽:表示用來收集用戶輸入數據的控件。它默認會出現一個單行的文本框。

          • type:文本框的類型。值為text時表示單行文本框;值為password表示密碼框;值為search時,除了火狐瀏覽器的其他瀏覽器外,會顯示一個叉來取消搜索內容,值為number時,表示只限于數字輸入;值為range時,生成一個數值范圍文本框;當type為date系列時,可以獲取日期和時間的值,有六種形態date、month、time、week、datetime、datetime-local;當值為color代表可以獲取不同的顏色;當值為checkbox、radio時表示復選框和單選。單選的name值必須一樣。checked表示默認勾選狀態值為img是表示產生一張圖片按鈕,后面可以接src,alt,width等熟悉值為email,tel,url時表示輸入電子郵件、電話和網址格式值為hidden時,生成一個隱藏控件(看不見,但提交的時候會顯示,一般用于關聯主鍵id提交)值為file的時候,表示上傳文件。accept屬性表示限制文件<input type="text">

          音樂<input type="checkbox" checked>

          體育<input type="checkbox">

          <input type="radio" name="sex" value="男" checked>男

          <input type="radio" name="sex" value="女">女

          <input type="hidden" value="1" name="id">

          <input type="file" accept="image/gif">

          • maxlength:設置文本框最大字符長度

          • readonly:設置文本框為只讀狀態??梢蕴峤坏遣荒苄薷奈谋究虻闹?。

          • placeholder:占位符

          • size:設置文本框的寬度

          • required:表明用戶必須輸入一個值,否則無法通過輸入驗證

          • <input type="text" list="abc" required>

          • autofocus:讓光標聚焦在某個input元素上,方便用戶直接輸入。<input name="user" autofocus>

          • disabled:禁止input元素 (連點擊都不能)

          • list:為文本框提供建議值

          <form>

          <input type="text" list="abc">

          <button>提交</button>

          </form>

          <datalist id="abc">

          <option value="1">湖南</option>

          <option value="2">海南</option>

          </datalist>

          • value:默認在輸入框內出現的值

          • form:與表單外的數據掛鉤一遍提交

          <form id="register" name="reg" action="index.html">

          用戶名:<input name="user">

          <button>提交</button>

          </form>

          年齡:<input name="age" form="register">

          • label標簽:把文字和input標簽包裹起來可以方便設置樣式,并且當用戶點擊文字的時候,光標會自動移入到對應的input框。(如果只是設置了文字用label包裹,又想點擊文字將標簽自動移入對應的框,可以將label的屬性for的值設置成與input的id設置成一樣)

          <label for="user"> 用戶名:</label>

          <input id="user" name="user">

          • fieldset標簽:對表單進行編組。三個屬性name、form、disabled

          • legend標簽:添加分組說明的標簽(也就是說給分組加上一個標題)

          <fieldset>

          <legend>注冊分組</legend>

          <label for="user"> 用戶名:</label>

          <input id="user" name="user">

          <button>提交</button>

          </fieldset>

          • button標簽:創建一個按鈕。type屬性有三個值,submit表示提交,reset表示重置,也就是把input的值變成初始值。button表示一個普通的按鈕。

          • select標簽:下拉列表。需要和option標簽配合使用。

          • name屬性:設定提交時的名稱

          • disabled屬性:將下拉列表禁用

          • form屬性:將表單外部與內部掛鉤

          • size屬性:下拉列表的個數

          • multiple屬性:設置是否可以多選

          • required:選擇驗證,必須選擇后才能通過

          <select name="fruit" size="5" multiple >

          <!--value值是真正要提交上去的值,而后面的是顯示到頁面的值-->

          <option value="1">花花菇涼</option>

          <option value="2">文小喵</option>

          </select>

          optgroup標簽:對列表進行分組選擇。

          <form action="http://www.baidu.com">

          <select name="fruit" multiple size="5">

          <optgroup label="表情包">

          <option value="1">花花菇涼</option>

          <option value="2">文小喵</option>

          </optgroup>

          <optgroup label="書">

          <option value="4" selected>微微一笑很傾城</option>

          <option value="5">神雕俠侶</option>

          </optgroup>

          </select>

          <button>提交</button>

          </form>

          • textarea標簽:生成一個可變大小的多行文本框

          <!--wrap表示是否插入換行符 有soft和hard兩種。hard提交之后在地址欄可以看見%插入的隱藏換行符-->

          <textarea name="content" rows="20" cols="30" wrap="hard"></textarea>

          • pattern:正則表達式。開頭和結尾用^和$ novalidate屬性表示不要驗證該表單

          <input type="text" placeholder="請輸入區號和座機" pattern="^[\d]{2,4}\-[\d]{6,8}$">

          html對網頁頁面的布局或者是表單驗證等功能都相對簡陋,并且不同的瀏覽器支持的成熟度是不盡相同的。因此在大部分情況下,還是要借助jsjqury等前端庫,來呈現豐富多彩的驗證效果。

          .結構標記:作用就是為了提升標記的語義性,每個結構有每個不同的標記。

          1.頭部標記:<header></header>,用于定義頁面的頁眉,最上面的內容。等同于<div id="header"></div>,作用一樣。就是相當于一個容器,裝其他的元素。

          2.導航標記:<nav></nav>,用于定義頁面的導航鏈接部分。等同于<div id="nav"></div>

          例如可以這樣寫導航:

          <nav>

          <ul>

          <li></li>

          </ul>

          </nav>

          3.主體標記:<section></section>作用:定義頁面主體內容中的小節,現在section可以表示整個頁面的主體內容等同于<div id="main"></div>

          4.<article></article>作用:用于描述文本性較強,或者藝術氣息較強的內容。一般情況下,論壇中的帖子信息,報紙信息,博客或微博中的條目信息。用戶回復信息,有限考慮放在article中

          5.<footer></footer>定義頁面中或某個區域中的腳注信息,頁面最底部的信息。

          6.邊欄:<aside></aside>定義頁面側邊欄,靠邊的信息

          以上結構標記為的就是獨立定義結構,替代div。

          表單

          表單的作用:顯示,收集信息,并且將信息提交給服務器

          (在注冊,登陸的時候,網頁就會提供一些供用戶填寫的表單,表單元素會把填寫的信息提交服務器進行處理 )

          表單包含兩組內容

          1.表單元素<form>

          <form></form>

          注意:使用表單控件提交數據時,表單不能省略

          屬性:

          1.action:后臺處理程序的地址(服務器端工程師提供),默認會提交給本頁。

          2.method:方式,表單的提交方式。不同的提交方式約束的內容不一樣。

          常用取值:2個

          get:

          1.顯示提交數據,會將提交信息顯示在地址欄上面,安全性不高,又叫顯示提交

          2.大小限制,最大支持到2kb的提交。

          3.如果不設置method屬性,默認就是get方式提交(顯示提交,最大2kb)

          4.使用場合:向服務器索取數據時,優先使用get

          post:

          1.隱式提交數據,不會將提交的信息顯示在地址欄上,安全性較高,所有有關密碼的信息提交時,必須用post

          2.post沒有大小限制。

          3.使用場合:安全性要求較高的頁面,傳遞數據量較大的時候

          3.enctype

          作用:設置對表單中提交的數據的編碼方式,規范哪些數據可以提交給服務器

          取值:

          1.application/x-www-form-urlencoded,默認值,可以將普通的文本,特殊的字符,一起提交給服務器。

          2.multipart/form-date,允許將表單中的文件,傳遞給服務器,普通文本不能直接傳遞。

          3.text/plain,只能將普通文本傳遞給服務器,特殊字符不允許。

          4.id

          5.name

          2.表單控件

          什么是表單控件

          包含在表單中的元素,具備可視化外觀,并且可以接受用戶輸入的數據。

          分類

          1.input元素

          2.textare文本域

          3.select和option選項框

          一.input元素,主要作用就是收集用戶信息

          語法:<input>

          屬性:

          type,根據不同的類型值可以創建不同的輸入控件,用戶名,密碼,按鈕形式的

          value,控件的值,提交給服務器的數據。

          name,控件的名稱。必須設置,否則無法提交,服務器主要根據name這個控件的名稱,來獲取value

          disabled,禁用控件,該屬性可以沒有值。

          1.文本框和密碼框

          文本框:<input type="text">

          允許用戶輸入任意字符的數據,明文顯示

          密碼框:<input type="password">

          允許用戶輸入任意字符的數據,密文顯示

          屬性:

          maxlength:限制輸入的字符數

          readonly:只讀,無需給值

          value:控件值,同時也可以設置控件

          注意:input元素下,如果不寫type值,或者type值寫錯時,都默認為文本框。

          單選框和復選框

          1.單選框:<input type="radio">

          屬性:

          1.name:定義名稱并且實現控件分組,一組內的元素才能實現單選

          2.value:控件值

          3.checked:設置默認被選中,不需要值

          2.復選框

          <input type="checkbox">

          屬性:name:定義名稱并且分組,便于服務器獲取

          3.按鈕

          1.提交按鈕,功能固定化,負責將數據提交給服務器

          <input type="submit">

          2.重置按鈕,功能固定化,負責將表單控件恢復到初始化的狀態

          <input type="reset">

          3.普通按鈕,沒有固定功能,由開發者通過js來設置。

          <input type="button">

          value:顯示在按鈕上的文本

          name:名稱(可寫可不寫)

          4.非input標簽的按鈕

          <button></button>

          <button type="button">普通按鈕</button>

          屬性:type

          5.隱藏域和文件選擇框

          1。隱藏域,不想讓用戶看見,但是又要提交到服務器的數據,可以放在隱藏域中

          例如:隱藏用戶id

          type="hidden"

          <input tpe="hidden">

          屬性:

          name

          value

          6.文件選擇框

          提供一個基礎控件,允許用戶選擇本機的文件上傳到服務器

          type="file"

          <input type="file">

          屬性:name value

          注意:

          表單的method(提交方式)屬性值必須為post

          表單的enctype編碼必須為multipart/form-date

          更多知識關注小編,或者百度網絡營銷師鐘震,鐘震講網絡營銷。會有很多相關知識,公眾號網絡營銷師鐘震,以后每天都會分享web前端,淘寶運營,競價,網站建設和優化,社媒方面的知識。與大家共同進步。希望對您有一點點幫助,喜歡記得關注公眾號。


          主站蜘蛛池模板: 韩日午夜在线资源一区二区 | 波多野结衣精品一区二区三区| 中文字幕av一区| 国产伦精品一区二区三区免费迷 | 人妻互换精品一区二区| 波多野结衣高清一区二区三区 | 国产无吗一区二区三区在线欢| 人妻体内射精一区二区三区| 国产一区二区三区在线影院 | 中文字幕一区精品| 精品无码国产AV一区二区三区 | 亚洲国产日韩在线一区| 日韩一区二区久久久久久| 亚洲乱码日产一区三区| 亚洲色精品vr一区二区三区| 亚洲性日韩精品一区二区三区 | 女人18毛片a级毛片一区二区| 久久无码人妻一区二区三区| 人妻aⅴ无码一区二区三区| 久久精品免费一区二区三区| 久久久久人妻精品一区| 日韩精品人妻一区二区三区四区| 无码少妇A片一区二区三区| 日韩在线一区高清在线| 嫩B人妻精品一区二区三区| 日韩一区二区电影| 日本一区高清视频| 成人区人妻精品一区二区不卡视频 | 中文字幕一区二区三区永久| 亚洲欧洲一区二区| 国产一区二区免费在线| 无码少妇一区二区性色AV| 精品无码国产AV一区二区三区| 成人无码一区二区三区| 亚洲av无码成人影院一区| 中文人妻av高清一区二区| 在线成人综合色一区| 99久久综合狠狠综合久久一区| 国产AV一区二区精品凹凸 | 国产婷婷色一区二区三区深爱网 | 亚洲AV综合色区无码一区爱AV|