網頁開發中,表單是與用戶交互最常見的方式之一。通過表單,用戶可以向服務器提交數據,例如注冊新用戶、提交評論等。而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屬性:
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>
其擁有除了所有表單元素共有的屬性和方法外,還提供了:
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,其擁有下列屬性:
設置這些屬性的目的,是為了方便對選項數據的訪問,雖然可以使用常規的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屬性一起實現對表單的序列化;
瀏覽器把數據發送給服務器原理:
如:表單簡單序列化;
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 生成過程效果
說明:
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 "全部執行完成!"
}
說明:
假設處理生成的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);
*請認真填寫需求信息,我們會在24小時內與您取得聯系。