整合營銷服務商

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

          免費咨詢熱線:

          第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()事件處理函數:

          篇介紹了表單的使用,表單有很多控件,比如輸入框,密碼框、文本域,按鈕等。按類型可分如下:

          • 輸入類控件
          • 菜單類控件

          輸入類組件 —— input

          此類控件有很多種類型,使用<input type="類型">語法,常見類型如下:

          type 值

          含義

          text

          文字字段

          password

          密碼域,用戶看不到明文,以*代替

          radio

          單選按鈕

          checkbox

          多選按鈕

          button

          普通按鈕

          submit

          提交按鈕

          reset

          重置按鈕

          image

          圖像域,用圖像作為背景的提交按鈕

          hidden

          隱藏域,不可見的輸入框

          file

          文本域,用于上傳文件等非文本數據

          文本輸入框和密碼框

          除了顯示形式不一樣,其它屬性一樣,有以下屬性:

          • name —— 定義文字字段名稱,用于和其它控件區別,不能包含特殊字符,也不可使用html 標簽名稱
          • maxlength —— 定義文本框可輸入字符最大長度
          • size —— 定義文本框在頁面中顯示的長度
          • vaule —— 定義文本框中默認的值

          如下是文本輸入框和密碼框制作一個登錄表單

          html代碼:

          <!DOCTYPE html>
          <html>
          <body>
          <h1>用戶登錄</h1>
          <form action="/demo/html/action_page.php">
            <label for="fname">用戶名:</label><br>
            <input type="text" id="username" name="username" value=""><br>
            <label for="lname">密碼:</label><br>
            <input type="password" id="pwsd" name="pwsd" value=""><br><br>
            <input type="submit" value="提交">
          </form> 
          </body>
          </html>

          顯示效果:

          HTML5 輸入類型

          除了以上幾種類型,HTML5 還增加了多個新的輸入類型:

          • color
          • date
          • datetime
          • datetime-local
          • email
          • month
          • number
          • range
          • search
          • tel
          • time
          • url
          • week

          如下代碼:

          <!DOCTYPE html>
          <html>
          <body>
          <form action="/demo/demo_form.asp">
            數字類型(1 到 5 之間):
            <input type="number" name="quantity" min="1" max="5">
            IE9 及早期版本不支持 type="number"。<br>
            color 選擇顏色:
            <input type="color" name="color"><br>
             生日:
            <input type="date" name="bday"><br>
            年月:
            <input type="month" name="bdaymonth"><br>
            年周:
            <input type="week" name="week_year"><br>
            時間:
            <input type="time" name="usr_time"><br>
            一定范圍
             <input type="range" name="points" min="0" max="10"><br>
             E-mail:
            <input type="email" name="email">
            能夠在被提交時自動對電子郵件地址進行驗證<br>
            搜索:
            <input type="search" name="googlesearch"><br>
            電話:
            <input type="tel" name="usrtel">
            目前只有 Safari 8 支持 tel 類型。<br>
            url:
            <input type="url" name="url">
            提交時能夠自動驗證 url 字段<br>
            <input type="submit">
          </form>
          </body>
          </html>

          效果如下:

          單選和多選按鈕

          使用 type = “radio” 和 type =“checkbox” 定義是單選還是多選,除了name和value屬性外,單選和多選都有一個 checked屬性定義默認選擇的項,checked = “true”指選中那個選項,表單會將 checked = “true” 的選型值傳遞給后臺。

          如下實例:

          <!DOCTYPE html>
          <html>
          <body>
          <h4>單選和多選</h4>
          <form action="/demo/demo_form.asp">
          水果:
          <input type="radio" name="shuiguo" value="banner" checked> 香蕉
          <input type="radio" name="shuiguo" value="apple"> 蘋果
          <br><br>
          省份:
          <input type="checkbox" name="shengfen" value="shannxi" checked> 陜西
          <input type="checkbox" name="shengfen" value="sanxi"> 山西
          <input type="checkbox" name="shengfen" value="gdong"> 廣東
          <br><br>
          <input type="submit">
          </form> 
          </body>
          </html>

          顯示效果:

          單選和多選傳遞給后臺的數據是不一樣的,如下會看到地址欄中的數據,多選會發送多個值,后臺將會獲取一個數組形式的數據。

          /demo/demo_form.asp?shuiguo=banner&shengfen=shannxi&shengfen=sanxi

          普通按鈕、提交按鈕、重置按鈕

          普通按鈕:type = “button”,一般配合腳本使用,語法如下:

          <input type="button" name="名稱" value="按鈕值" onclick="腳本程序" />

          value 值就是按鈕在頁面顯示的文字,onclick屬性定義了腳本事件,這里指單擊按鈕時所進行的處理。

          如下示例:

          <!DOCTYPE html>
          <html>
          <body>
          <form>
           <input type="button" value="普通按鈕">
          <input type="button" value="打開窗口" onclick="window.open()">
          <input type="button" value="您好" onclick="alert('您好')">
            </form>
          </body>
          </html>
          

          單擊您好按鈕

          提交按鈕:type = “submit”,用于提交表單內容,是一種特殊按鈕。

          如剛才的登錄表單,提交后會返回結果:

          重置按鈕:type="reset",用于清除表單數據,也是一種特殊按鈕。

          輸入數據

          點擊重置按鈕后,表單數據清空

          重置清空數據

          HTML5 按鈕

          除了使用input定義按鈕,還可以使用 html5 新增的<button> 標簽定義按鈕,button 使用語法如下:

          <form action="/demo/html/action_page.php">
          <button type="button">普通按鈕</button>
          <button type="submit">提交按鈕</button>
          </form> 

          其它輸入類控件

          隱藏域 —— hidden
          文件域 —— file

          如下示例:

          <form action="/demo/html/action_page.php">
            <label for="fname">隱藏域:</label>
            <input type="hidden" id="hidden" name="hidden" value=""><br>
            <label for="lname">文件域:</label>
            <input type="file" id="file" name="file" value=""><br>
            <input type="submit" value="提交">
          </form> 

          顯示效果

          可以看到,隱藏域在頁面中不顯示,單擊文件域選擇文件按鈕可以選擇文件,比如word文件,電子表格文件等,會以非文本方式傳送到后臺的,常用來實現文件上傳功能。

          文本域 —— textarea

          除了input 類型的控件,還有文本域 textarea ,一種特殊的文本框,它與input 文本輸入框的區別就是可以輸入多行文字,input 文本輸入框是單行的無法輸入多行文字。

          如下示例:

          <p>textarea 元素定義多行輸入字段。</p>
          <form action="/demo/html/action_page.php">
            <textarea name="message" rows="10" cols="30">The cat was playing in the garden.</textarea>
            <br><br>
            <input type="submit">
          </form>

          效果如下:

          rows 屬性定義文本域的高度是幾行,cols 定義文本域寬度占幾列,比如上面定義了高10行寬30列的文本域。

          下拉菜單和多選列表

          下拉菜單作用和單選按鈕類似,只不過它更加節省空間,當要選擇的選型很多時,就不適合使用radio空間,所以當選項很多的時候,使用下拉菜單,語法如下:

          <select name="名稱">
          <option value="選項值1" selected>選項1</option>
          <option value="選項值2">選項3</option>
          更多option......
          </select>

          多選列表和多選按鈕類似,一樣為了節省空間,當數據選項比較多時,使用多選列表,語法如下:

          <select name="名稱" size="可看見的列表項數" multiple>
          <option value="選項值1" selected>選項1</option>
          <option value="選項值2">選項3</option>
          更多option......
          </select>

          多選比下拉菜單不同之處是多了一個multiple屬性,定義多選的,且表現形式也不一樣,不是下拉而是一個列表。

          如下代碼:

          <!DOCTYPE html>
          <html>
          <body>
          <form action="/demo/demo_form.asp">
          下拉菜單:<br>
          <select name="cars">
          <option value="volvo">Volvo</option>
          <option value="saab">Saab</option>
          <option value="fiat">Fiat</option>
          <option value="audi">Audi</option>
          </select>
          <br>
          多選列表:<br>
          <select name="cars" size="3" multiple>
          <option value="volvo">Volvo</option>
          <option value="saab">Saab</option>
          <option value="fiat">Fiat</option>
          <option value="audi">Audi</option>
          </select>
          <br><br>
          <input type="submit">
          </form>
          </body>
          </html>

          顯示效果:

          這里需要注意的是,多選列表多選時需要按住ctrl鍵同時鼠標單擊選擇才能多選,效果如下:

          到這里,已介紹了大部分的表單控件,現在你可以使用他們制作自己的表單,表單通常在動態網站中使用,這為以后制作動態網站打下基礎。

          還有許多屬性沒有講到,比如html5新增的一些屬性和功能,可自行參考 w3cshool 等網站學習,感謝關注,學習愉快!

          上篇 : 前端入門——html 表單

          下篇: 前端入門 —— 網頁中使用窗口框架

          了尋找一個優質的網頁模板,網頁設計師和開發者往往可能會花上大半天的時間。不過幸運的是,現在的網頁設計師和開發人員已經開始共享HTML5,Bootstrap和CSS3中的免費網頁模板資源。鑒于網站模板的靈活性和強大的功能,現在廣大設計師和開發者對html5網站的實際需求日益增長。為了造福大眾,Mockplus的小伙伴整理了2018年最好的免費響應式HTML5網頁模板供大家學習。

          為什么HTML5, Bootstrap和CSS3的網頁模板資源如此受歡迎?

          1. 作為一種全新的語言,HTML5支持所有瀏覽器兼容的瀏覽器,是創建優秀網站的最新標記語言。由于HTML5語言的日益普及,所以HTML5網站模板也很受歡迎。

          2. CSS3是CSS語言的最新版本,用于提供最佳的樣式網站,如無限的顏色組合,很棒的字體樣式,字體選擇等等。總的來說, CSS3語言使您的網站美麗而時尚。

          3. Bootstrap已經成為用戶界面開發人員最喜歡的前端框架之一,其優勢在于其開源的可用性。 它自己修改后的書面CSS為UI開發人員節省了大量時間。 此外,Bootstrap具有一些創新功能,如移動友好型,SAAS,干凈輕便的代碼,跨瀏覽器兼容性等等,使得大多數設計人員使用此框架可以用較少的時間和精力創建響應式網站。

          5個最好的免費響應式HTML5網頁模板 -- 2018

          1. Boxus - 軟件公司和網頁設計公司的創意網站模板

          開發技術:HTML 5, CSS 3, JS, jQuery

          網站特色:

          l 創意機構模板

          l 粘性的導航條

          l 谷歌地圖

          l 社交媒體圖標

          l 色彩斑斕的接口

          l 字體圖標

          l 明亮的配色方案

          Boxus是一個充滿創意和活力的免費HTML5軟件公司和網頁設計公司的創意網站模板。其獨特的布局以及響應速度非常出色。 最重要的是,它提供了最新的JavaScript插件,使模板更加高效和強大。 你要知道,一個具有啟發性的令人驚嘆的免費HTML5網頁模板可以大大減少耗時并提高生產力。

          2. AweSplash - 免費的HTML閃屏頁面

          開發技術:HTML 5, CSS 3, JS, jQuery

          網站特色:

          l 滑塊

          l 響應式視網膜菜單

          l 幽靈按鈕

          l SEO友好

          l 設備響應

          l jQuery&Javascript插件

          l YouTube和Vimeo Player插件

          AweSplash非常適合作為歡迎頁面或任何其他著陸頁來推出新產品或宣布即將舉辦的活動。它的主要吸引力是它的4個不同的演示頁面。幽靈按鈕可讓您鏈接到即將推出的產品。使用名為Animate Headline的Javascript插件,頁面變得更加美觀。在這個免費HTML5啟動畫面模板的演示中,你可以看到帶有美麗背景滑動圖像的頁面。

          3. Beverages - 餐廳類Bootstrap響應式網頁模板

          開發技術:HTML 5, CSS 3, JS, Bootstrap

          網站特色:

          l 完全響應

          l 支持自定義

          l 使用有效的HTML5和CSS3代碼構建

          l 使用Google網絡字體

          l Bootstrap框架

          Beverages是100%響應式餐廳主題網站模板,適用于任何食品和飲料網站的設計。兼容所有設備,顯示在所有屏幕尺寸上。它完全建立在Bootstrap框架中,HTML5,CSS3和JQuery.你可以輕松的將這個模板與任何其他類型的生意相結合。

          4. TravelAir - 旅游觀光HTML網站模板

          開發技術:HTML 5, CSS 3, JS, jQuery

          網站特色:

          l Bootstrap 4

          l HTML5和CSS3

          l 粘滯標題

          l 跨瀏覽器兼容性

          l Google字體

          TravelAir擁有獨特而富有創意的主頁設計,其現代風格的設計布局。 主頁上有一個帶有標題文字的貓頭鷹旋轉木馬滑塊。此外,有jQuery UI日歷的旅行預訂表格。在主頁有旅游套餐,最熱門的目的地和關于您的公司的部分,讓網站訪問者和專業外觀的網站印象深刻。

          5. Jessica- 營養師網站模板

          開發技術:HTML 5, CSS 3, JS, jQuery

          網站特色:

          l Bootstrap V3 +

          l 極簡設計

          l HTML5 CSS3

          l 谷歌字體(蒙特塞拉特)下載

          l 風格指南(開發人員用途和模板設計指南)

          作為營養師網站模板,Jessica采用了極簡風格的網頁設計,顏色搭配非常美觀,圖片看起來讓人很有食欲。營養網站模板對健康,健身,美體,美食,美容,飲食,減肥教練,女教練,女性飲食等主題都是新鮮而具有吸引力的。

          3個最好的免費Bootstrap網頁模板 -- 2018

          1. Vex - 免費Bootstrap 4著陸頁模板

          開發技術:HTML 5, CSS 3, Bootstrap 4 alpha.5, JS, jQuery

          網頁特色:

          l 視差背景效果

          l 電子郵件訂閱選項

          l 頁腳菜單

          l Bootstrap 4框架

          l 友好的用戶界面

          Vex由最近發布的Bootstrap 4 CSS框架構建而成,非常靈敏。由于Bootstrap 4為開發人員和用戶提供了更多的舒適性和靈活性,Vex模板在小屏幕上可以發揮出色的效果。

          2. Conceit - 企業類Bootstrap響應式Web模板

          開發技術:Bootstrap framework, HTML5, CSS3, JQuery

          網頁特色:

          l 100%響應Bootstrap滑塊

          l 基于Font Awesome的圖標

          l HTML5和CSS3

          l Google字體

          l Bootstrap框架

          l 圖像轉換效果

          Conceit是一個現代主題多頁多用途商業和企業相關高利用率網站模板,支持用戶構建自己的創意網站。這個模板提供了很多實用的頁面包括關于頁面,聯系頁面,404頁面,最新博客等。這個模板的設計是完全基于Bootstrap框架,HTML5,CSS3和JQuery構建的100%響應式跨瀏覽器模板。

          3. Asentus - 免費的響應式引導頁HTML5模板

          開發技術:HTML 5, CSS 3, Bootstrap 3, JS, jQuery

          網頁特色:

          l 粘滯菜單欄

          l 滑動標題背景

          l 幽靈按鈕

          l HTML5 / CSS3

          如果你想要輕量級,靈活且易于定制,免費供商業和個人使用的企業代理網站模板; Asentus正是你想要的。這是一個免費的自適應引導企業代理機構的HTML5模板。 超級干凈,優雅的風格。

          1. Garage - 免費的HTML5 CSS3 Bootstrap響應式網頁模板

          開發技術:HTML 5, CSS 3, Bootstrap 3, JS, jQuery

          網頁特色:

          l 視差效應

          l W3C有效標記

          l 平滑過渡效果

          l 跨瀏覽器支持

          l 100%響應式布局

          l 100%的搜索引擎友好

          Garage是由webdomus開發團隊開發的完全特殊的創意模板,特別適用于古董或經典汽車展示。這個多頁面的HTML5 CSS3 Bootstrap響應模板有相關章節,可以滿足客戶的需求。

          2. Graffiti Artist - 免費的涂鴉藝術類CSS網頁模板

          開發技術:HTML 5, CSS 3,

          網站特色:

          l 便捷的網頁編輯入口

          l 豐富的教程

          l 設計工具

          Graffiti是一個適于涂鴉藝術家,街頭攝影師和創意專業人士的CSS網頁模板。藝術作品和創意項目在模板正面和中心位置展示,非常吸引人。引人注目的黑白媒體以及視差滾動為豐富多彩的獨特風格提供了完美的背景。

          總結:

          這些免費的HTML網站模板對網頁設計師和開發甚至初學者都很有用,他們不需要花費過多的精力就可以自己創建的個人網站。如果你想把握2018年最新最好的免費響應式HTML5, Bootstrap, CSS網頁設計,不妨將上面的網頁模板下載下來自己研究,激發自己的創作靈感。

          如果你不會任何開發語言但也想同樣擁有自己的網站,推薦你借助原型設計工具,例如國產的Mockplus快速完成網頁模板設計。如果想像這些優秀的模板那樣,直接下載套用也是可以的。除軟件內置的豐富網頁模板,Mockplus官網上也提供了很多優秀的真實網頁模板。直接下載原文件,在Mockplus桌面端打開即可開始設計。只需要通過Mockplus的圖片組件導入自己的圖片和自定義組件,就可以快速的完成一個中低保真的HTML5網頁原型設計。


          主站蜘蛛池模板: 福利一区二区在线| 激情内射亚州一区二区三区爱妻| 久久伊人精品一区二区三区| 亚洲一区精彩视频| 成人在线一区二区| 亚洲AV无码国产一区二区三区 | 久久综合亚洲色一区二区三区| 亚洲国产成人久久一区WWW| 亚洲国产视频一区| 精品一区二区三区四区在线| 91视频一区二区三区| 一区二区亚洲精品精华液| 中文字幕av无码一区二区三区电影| 国产成人一区二区三区免费视频| 亚洲国产精品一区二区久| 国产精品一区视频| 国产精品av一区二区三区不卡蜜| 男插女高潮一区二区| 成人在线观看一区| 无码AV一区二区三区无码| 中文字幕久久久久一区| 亚洲AV无码一区东京热| 日韩在线观看一区二区三区| 国产伦精品一区二区三区在线观看| 另类国产精品一区二区| 一区视频免费观看| 久夜色精品国产一区二区三区| 在线观看午夜亚洲一区| 亚洲欧洲精品一区二区三区| 亚洲日韩AV无码一区二区三区人| 国产精品视频一区麻豆| 在线免费一区二区| 亚洲国产精品一区二区久久hs | 久久精品人妻一区二区三区| 亚洲一区免费视频| 国产一区二区草草影院| 久久精品国产一区| 视频在线一区二区| 国产麻豆精品一区二区三区| 中文字幕久久亚洲一区| 高清精品一区二区三区一区|