整合營銷服務商

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

          免費咨詢熱線:

          怎么使用PHP實現表單提交和驗證?

          網頁開發中,表單是與用戶交互最常見的方式之一。通過表單,用戶可以向服務器提交數據,例如注冊新用戶、提交評論等。而PHP作為一種強大的服務器端腳本語言,可以方便地處理表單提交的數據。本文將為您詳細介紹如何使用PHP來實現表單提交,讓您輕松處理用戶輸入!

          1. 創建HTML表單

          首先,我們需要在HTML頁面中創建一個表單,用于用戶輸入數據。表單通常由form標簽包裹,并包含各種表單元素,例如輸入框、下拉菜單、復選框等。例如,我們創建一個簡單的登錄表單:

          在上面的代碼中,我們使用了action屬性來指定表單數據提交的處理程序,這里是submit.php。同時,我們給每個表單元素添加了name屬性,用于在PHP中獲取表單數據。

          2. 創建PHP處理程序

          接下來,我們需要創建一個PHP文件,用于接收并處理表單提交的數據。在這個文件中,我們可以使用$_POST超全局變量來獲取表單數據。例如,我們可以創建一個名為submit.php的文件,并在其中加入以下代碼:

          在上面的代碼中,我們通過$_POST超全局變量獲取了表單中username和password兩個字段的值。您可以根據實際需求進行數據處理、驗證等操作。

          3. 表單驗證與安全性

          在實際開發中,表單驗證和安全性是非常重要的。為了保護用戶數據的安全,我們應該對表單數據進行驗證和過濾,防止惡意攻擊和非法輸入。以下是一些常見的表單驗證方法:

          ①對于必填字段,可以使用required屬性來標記,并在后臺進行非空驗證;

          ②使用正則表達式對輸入的數據進行格式驗證,例如驗證郵箱、手機號等;

          ③對于敏感信息(例如密碼),應該使用哈希算法進行加密存儲。

          4. 提示與反饋

          在表單提交后,為了讓用戶獲得反饋和提示,我們可以根據處理結果進行頁面跳轉或顯示相應的消息。例如,可以將用戶重定向到登錄成功的頁面,或者在當前頁面顯示一條成功提示信息。

          通過以上步驟,您已經學會了如何使用PHP實現表單提交,并能夠輕松處理用戶輸入?,F在,您可以根據實際需求來擴展和優化表單處理的功能,為用戶提供更好的交互體驗。

          內容是《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()事件處理函數:

          1 全站生成

          圖2 生成過程效果

          說明:

          1. 詳情頁name使用數組credetail[],產品value:1,新聞value:2,這樣我們在生成頁面獲得的credetail,循環可以得到要生成的哪個模塊的詳情;
          2. 應該是生成幾條新聞,然后使用header('refresh:2;url=’)刷新頁面,這里我使用的是間隔2秒,不間隔會出現卡死的情況;
          3. 生成的時候采用分頁讀取,下一次刷新的時候頁碼加1,讀取文章,沒有了也就是當前模塊的生成完成了;
          4. 一個模塊生成完成以后,要在數組內把該模塊參數刪除;

          html代碼:

          					    <tr>
          						    <td width="90" align="right" rowspan=3>按模塊生成</td>
          							<td>   
          							    <div class="layui-input-inline" id='chkall' >
          								<input type="checkbox"  title='全選' />
          								</div>
          							</td>
          						</tr>
          						<tr>
          							<td style='line-height:200%;' class='quanxian'>
                                          							    公司產品 |  <input type='checkbox' value='11'  name='credetail[]' lay-skin="primary" title='詳情頁'>   <input type='checkbox' value='11'  name='crelist[]' lay-skin="primary"  title='分類頁'>   <input type='checkbox' value='11'  name='creindex[]' lay-skin="primary" title='模塊主頁'><br/>	
          															    新聞中心 |  <input type='checkbox' value='1'  name='credetail[]' lay-skin="primary" title='詳情頁'>   <input type='checkbox' value='1'  name='crelist[]' lay-skin="primary"  title='分類頁'>   <input type='checkbox' value='1'  name='creindex[]' lay-skin="primary" title='模塊主頁'><br/>	
          															    應用案例 |  <input type='checkbox' value='13'  name='credetail[]' lay-skin="primary" title='詳情頁'>   <input type='checkbox' value='13'  name='crelist[]' lay-skin="primary"  title='分類頁'>   <input type='checkbox' value='13'  name='creindex[]' lay-skin="primary" title='模塊主頁'><br/>	
          															    單頁信息 |  <input type='checkbox' value='2'  name='credetail[]' lay-skin="primary" title='詳情頁'>  <br/>	
          															</td>
          						</tr>
          
          					    <tr>
                                      <td>
                                          <input type='checkbox'  value='1'  name='cretoday' lay-skin="primary" title='今日信息'> 勾選后只生成今天修改或者填加的信息
          							</td>
          						</tr>
          					    <tr>
          						    <td width="90" align="right"></td>
          							<td>
          							    <input class="layui-btn crea" type="button" value="生成" cmd=0 /> <input class="layui-btn crea" cmd='1' type="button" value="斷點生成" />
          							</td>
          						</tr>
          
          

          彈窗html:

          <div class='tanchuang none' >
          <div class='tcclose'><i class="fa fa-times" aria-hidden="true"></i></div>
          <div id="creinfo" class='none creinfoimg'></div>
          <div style="display:none;"><iframe id='crehtml' height=200 border=0 width=100%  frameborder=0 style='border:1px solid #DDD;'></iframe></div>
          </div>
          

          js代碼:

          $(document).ready(function() {
              $(".crea").click(function(){ 
                var cmd=$(this).attr('cmd');
          	  if(cmd==1){
                //斷點生成
          	    var cmdurl=window.localStorage.getItem('cmdurl');
                if(cmdurl){
                   //彈窗,陰影背景顯示
          		    $(".tanchuang,.zzc").show();
          		    $("#crehtml").attr("src",cmdurl);
          		    return false;
                }
          
          	  }
          		var chk_value =new Array();
          		chk_value['credetail']=[];
              //詳情頁
          		$('input[name="credetail[]"]:checked').each(function(){ 
          			chk_value['credetail'].push($(this).val()); 
          		});
              //列表頁
          		chk_value['crelist']=[];
          		$('input[name="crelist[]"]:checked').each(function(){ 
          			chk_value['crelist'].push($(this).val()); 
          		});
              //模塊首頁
          		chk_value['creindex']=[];
          		$('input[name="creindex[]"]:checked').each(function(){ 
          			chk_value['creindex'].push($(this).val()); 
          		});
              //是否勾選 今天修改信息
          		var tdbase=$('input[name="cretoday"]').is(":checked");
          
          		if(chk_value['credetail']==''&&chk_value['crelist']==''&&chk_value['creindex']==''){
          		    uptishi('請選擇要生成的模塊!');
          			return false;
          		}
          		$(".tanchuang,.zzc").show();
          		//console.log(chk_value);
          		//alert(chk_value['credetail']);
                 
          		$("#crehtml").attr("src",src+"?credetail="+chk_value['credetail']+"&crelist="+chk_value['crelist']+"&creindex="+chk_value['creindex']+"&tdbase="+tdbase);
          	});
          

          執行生成頁面(html):

          	  $credetail=input('credetail')??'';
          		$crelist=input('crelist')??'';
          		$creindex=input('creindex')??'';
          		$tdbase=input('tdbase')??'';
              $p=input('p')??1;
          if($credetail){
              //生成詳情頁
              $dtarr=explode(",",$credetail);
              if($tdbase=="true"){
          				$stimedate=strtotime(date("Y-m-d",time())."   00:00:01");
          				$etimedate=strtotime(date("Y-m-d",time())."   23:59:59");
                  //今天修改的信息
          			  $condtion=" web_time>=".$stimedate." and web_time<=".$etimedate."";
          		}
              //讀取$dtarr[0]信息   一次生成3條信息
              $list=Db::name('news')->page($p,3)->where($condition)->select();
              if($list){
                  foreach($list as $k){
                     htmlfunction();//創建靜態頁面
                  }
                  //向父級窗口賦值
                echo "	
          				<script language='javascript'>
          				    $(document).ready(function() {
          						$('#creinfo',window.parent.document).append('生成完成!');
          						$('#creinfo',window.parent.document).scrollTop($('#creinfo',window.parent.document)[0].scrollHeight);
          		        })
          				</script>";
                
                  $p++;
                  //記錄斷點
          				$cmdurl='http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
                  $cmdurl=preg_replace('/&p=(.*)/','&p='.$p,$cmdurl);
          
                  echo "
          				<script language='javascript'>
          				window.localStorage.setItem('cmdurl','".$cmdurl."');
          				</script>
          				";
          				header("refresh:2;url=".$cmdurl);
          				//header('location:'.$CFG['site_urlpath'].'://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'].'&p='.$p);
          				exit;  
              }else{
                unset($dtarr[0]);
                array_values($dtarr);
          		  $credetail=implode(",",$dtarr);
                  //記錄斷點
          				$cmdurl='http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
                  echo "
          				<script language='javascript'>
          				window.localStorage.setItem('cmdurl','".$cmdurl."');
          				</script>
          				";
          				header("refresh:2;url=".$cmdurl);
          				//header('location:'.$CFG['site_urlpath'].'://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'].'&p='.$p);
          				exit;  
              }
              //詳情頁會一直創建,直到為空,跳轉的時候詳情參數為空了 ,
              //也就不會創建了,然后依次判斷創建列表頁 ,模塊首頁,
            if($crelist){
            }
            if($creindex){
            }
            echo   "全部執行完成!"
              
          }

          說明:

          1. 獲取詳情、列表、模塊、今天的文本框是否勾選了;
          2. 生成完第一個模塊,要刪除掉第一個數組元素unset($dtarr[0]);,也就是我們每次生成都生成$dtarr[0],一直到全部完成;
          3. 當我們創建列表頁的時候,如果頁數很多,也要間隔2 3秒刷新再繼續創建;

          假設處理生成的url是http://127.0.0.1/html?credetail=1,3,4&crelist=22

          開始生成1,3,4當1的信息生成完了,跳轉url就是http://127.0.0.1/html?credetail=3,4&crelist=22,每一次都生成第一個,一直到credetail為空,然后就是生成crelist,依次生成一直到參數全部為空,則全部生成完成。

          斷點生成:

          我們只需要存儲生成完成以后要跳轉的url,當我們點擊斷點生成按鈕,讀取該url的存儲通過jquery賦值給iframe的src就可以實現在斷點處開始生成html。

          主要使用了window.localStorage.setItem('cmdurl','".$cmdurl."'),window.localStorage.getItem('cmdurl');

          1)php存儲斷點URL:

                 //記錄斷點
          				$cmdurl='http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
          				//這樣獲取到的url包含了p分頁,需要把p的值替換成p++
                  $cmdurl=preg_replace('/&p=(.*)/','&p='.$p,$cmdurl);
                  echo "
          				<script language='javascript'>
          				window.localStorage.setItem('cmdurl','".$cmdurl."');
          				</script>
          				";

          2)js讀取斷點

          var cmdurl=window.localStorage.getItem('cmdurl');

          jquery向父級窗口賦值:

          $('#creinfo',window.parent.document).append(‘賦值信息’);

          加入 ,window.parent.document 操作父級窗口

          jquery append賦值,滾動條自動向上滾動:

          $('#creinfo',window.parent.document).scrollTop($('#creinfo',window.parent.document)[0].scrollHeight);

          header間隔幾秒頁面跳轉

          header("refresh:2;url=".$cmdurl);

          主站蜘蛛池模板: 无码国产精品一区二区免费16| 无码AV天堂一区二区三区| 女同一区二区在线观看| 一区二区三区无码高清视频| 色狠狠一区二区三区香蕉| 国产观看精品一区二区三区| 精品国产一区二区三区av片| 色狠狠色狠狠综合一区| 久久精品一区二区三区四区| 国产在线视频一区| 香蕉在线精品一区二区| 国产一区二区三区在线观看免费| 中文乱码人妻系列一区二区| 91视频一区二区| 亚洲福利电影一区二区?| 另类免费视频一区二区在线观看| 国产伦一区二区三区高清| 波多野结衣一区二区三区高清av| 国产精品av一区二区三区不卡蜜| 亚洲国产视频一区| 久久精品一区二区三区AV| 亚洲一区二区三区91| 亚洲av乱码一区二区三区| 一区二区三区亚洲| 亚洲午夜在线一区| 亚洲AV成人一区二区三区观看| 日韩国产免费一区二区三区| 无码中文人妻在线一区二区三区| 欲色aV无码一区二区人妻 | 亚洲AV无码一区二区三区鸳鸯影院| 一区高清大胆人体| 久久毛片一区二区| 性无码一区二区三区在线观看| 一区二区三区电影网| 国产午夜精品一区理论片飘花| 久久精品国产一区二区| 亚洲AV无码一区二区二三区入口 | 亚洲欧美成人一区二区三区 | 中文字幕亚洲乱码熟女一区二区| 日本高清成本人视频一区| 一区二区三区观看免费中文视频在线播放|