JS中的表单脚本

Posted 劳埃德·福杰

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JS中的表单脚本相关的知识,希望对你有一定的参考价值。

目录

1.获取表单

// 利用表单的id属性
let form = document.getElementById("form1");
//  document.forms 集合可以获取页面上所有的表单元素
let firstForm = document.forms[0]; // 取得页面中的第一个表单
let myForm = document.forms["form2"]; // 取得名字为"form2"的表单

2.提交表单

<!-- 通用提交按钮 -->
<input type="submit" value="Submit Form">
<!-- 自定义提交按钮 -->
<button type="submit">Submit Form</button>
<!-- 图片按钮 -->
<input type="image" src="graphic.gif">

在JS中提交 

let form = document.getElementById("myForm");
form.submit(); // 提交表单

验证表单数据,根据验证结果决定是否提交

let form = document.getElementById("myForm");
form.addEventListener("submit", (event) => 
    // 阻止表单提交
    event.preventDefault();
);

表单提交的问题:可能会多次提交表单
解决:在表单提交后禁用提交按钮,或者通过 onsubmit 事件处理程序取消之后的表单提交。 

let form = document.getElementById("myForm");
form.addEventListener("submit", (event) => 
    let target = event.target;
    let btn = target.elements["submit-btn"]; // 取得提交按钮
    btn.disabled = true; // 禁用提交按钮
);

3.重置表单

<!-- 通用重置按钮 -->
<input type="reset" value="Reset Form">
<!-- 自定义重置按钮 -->
<button type="reset">Reset Form</button>

在JS中重置

let form = document.getElementById("myForm");
form.reset(); // 重置表单

阻止重置

let form = document.getElementById("myForm");
form.addEventListener("reset", (event) => 
    event.preventDefault();
);

4.表单字段

表单元素可以像页面中的其他元素一样使用原生 DOM 方法来访问。
elements 集合是一个有序列表,包含对表单中所有表单元素的引用(<input> 、<textarea> 、 <button> 、 <select> 和 <fieldset>)。

let form = document.getElementById("form1");
let field1 = form.elements[0]; // 取得表单中的第一个字段
let field2 = form.elements["textbox1"]; // 取得表单中名为"textbox1"的字段
let fieldCount = form.elements.length; // 取得字段的数量

 如果多个表单控件使用了同一个 name ,比如像单选框那样

<form method="post" id="myForm">
    <ul>
        <li><input type="radio" name="color" value="red">Red</li>
        <li><input type="radio" name="color" value="green">Green</li>
        <li><input type="radio" name="color" value="blue">Blue</li>
    </ul>
</form>
let form = document.getElementById("myForm");
let colorFields = form.elements["color"];
console.log(colorFields.length); // 3

表单字段的公共属性

除 <fieldset> 元素以外,所有表单字段都有一组同样的属性。常用的:disabled、form (指针,指向表单字段所属的表单。只读的)、name (字符串,这个字段的名字)、type (字符串,表示字段类型,如 "checkbox" 、 "radio" 等)
这些属性可以利用JS进行动态修改。

表单字段的公共方法

focus() :把浏览器焦点设置到表单字段
在页面加载后把焦点定位到表单中第一个字段

window.addEventListener("load", (event) => 
    document.forms[0].elements[0].focus();
);

blur() :从元素上移除焦点

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

表单字段的公共事件

blur :在字段失去焦点时触发。
change :在 <input> 和 <textarea> 元素的 value 发生变化且失去焦点时触发,或者在<select> 元素中选中项发生变化时触发。
focus :在字段获得焦点时触发

文本框:单行使用 <input> 元素,多行使用 <textarea> 元素

<!--文本框一次可显示 25 个字符,但最多允许显示 50 个字符-->
<input type="text" size="25" maxlength="50" value="initial value">
<!--文本框高度为25个字符数,宽度为5个字符数,但在html中无法指定最大允许的字符数-->
<textarea rows="25" cols="5">initial value</textarea>

两种文本框都支持一个名为 select() 的方法,此方法用于全部选中文本框中的文本
只要文本框一获得焦点就会自动选中其中的所有文本

textbox.addEventListener("focus", (event) => 
    event.target.select();
);

取得选中文本 :select() 和 setSelectionRange() 

// selectionStart和selectionEnd这两个属性分别表示文本选区的起点和终点
function getSelectedText(textbox)
    return textbox.value.substring(textbox.selectionStart,textbox.selectionEnd);


textbox.value = "Hello world!"
// 选择所有文本
textbox.setSelectionRange(0, textbox.value.length); // "Hello world!"
// 选择前 3 个字符
textbox.setSelectionRange(0, 3); // "Hel"
// 选择第 4~6 个字符
textbox.setSelectionRange(4, 7); // "o w"

5.过滤输入

屏蔽字符

// 屏蔽所有按键的输入
textbox.addEventListener("keypress", (event) => 
    event.preventDefault();
);
// 屏蔽非数字字符和ctrl键,避免屏蔽常用键
textbox.addEventListener("keypress", (event) => 
    if (!/\\d/.test(String.fromCharCode(event.charCode)) && event.charCode > 9 &&    !event.ctrlKey)
        event.preventDefault();
    
);

6.自动切换焦点

<input type="text" name="tel1" id="txtTel1" maxlength="3">
<input type="text" name="tel2" id="txtTel2" maxlength="3">
<input type="text" name="tel3" id="txtTel3" maxlength="4">
<script>
function tabForward(event)
    let target = event.target;
    if (target.value.length == target.maxLength)
        let form = target.form;
        for (let i = 0, len = form.elements.length; i < len; i++) 
            if (form.elements[i] == target) 
                if (form.elements[i+1]) 
                    form.elements[i+1].focus();
                
                return;
            
        
    


let inputIds = ["txtTel1", "txtTel2", "txtTel3"];
for (let id of inputIds) 
    let textbox = document.getElementById(id);
    textbox.addEventListener("keyup", tabForward);

</script>

7.选择框

选择框是使用 <select> 和 <option> 元素创建的。
选择框的 type 属性可能是 "select-one" 或 "select-multiple" ,具体取决于multiple属性是否存在。
选择框的 value 属性根据以下规则决定:
 如果没有选中项,则选择框的值是空字符串。
 如果有一个选中项,且其 value 属性有值,则选择框的值就是选中项 value 属性的值
 如果有一个选中项,且其 value 属性没有指定值,则选择框的值是该项的文本内容
 如果有多个选中项,则选择框的值根据2、3两条规则取得第一个选中项的值

<select name="location" id="selLocation">
    <option value="Sunnyvale, CA">Sunnyvale</option>
    <option value="Los Angeles, CA">Los Angeles</option>
    <option value="Mountain View, CA">Mountain View</option>
    <option value="">China</option>
    <option>Australia</option>
</select>

①在JS中操作选择框

let selectbox = document.forms[0].elements["location"];

let text = selectbox.options[0].text; // 选项文本
let value = selectbox.options[0].value; // 选项值

②获取选中项

对于只允许选择一项的选择框,可使用选择框的 selectedIndex 属性
对于允许多选的选择框,获取 selectedIndex 只会返回选中的第一项的索引

let selectedIndex = selectbox.selectedIndex;
let selectedOption = selectbox.options[selectedIndex];
console.log(`Selected index: $selectedIndex\\n` +
`Selected text: $selectedOption.text\\n` +
`Selected value: $selectedOption.value`);

另一种,选项还可以通过取得选项的引用并将其 selected 属性设置为 true 来选中

// 返回选择框中所有选中项的数组
function getSelectedOptions(selectbox)
    let result = new Array();
    for (let option of selectbox.options) 
        if (option.selected) 
            result.push(option);
        
    
    return result;

③添加选项

DOM 方法

let newOption = document.createElement("option");
newOption.appendChild(document.createTextNode("Option text"));
newOption.setAttribute("value", "Option value");
selectbox.appendChild(newOption);

使用 Option 构造函数创建新选项 

let newOption = new Option("Option text", "Option value");
selectbox.appendChild(newOption); // 在 IE8 及更低版本中有问题

使用选择框的 add() 方法

接收两个参数:要添加的新选项和要添加到其前面的参考选项。 

let newOption = new Option("Option text", "Option value");
selectbox.add(newOption, undefined); // 添加到列表末尾

④移除选项

// 使用 DOM 的 removeChild() 方法
selectbox.removeChild(selectbox.options[0]); // 移除第一项
// 使用选择框的 remove() 方法
selectbox.remove(0); // 移除第一项
// 直接将选项设置为等于 null
selectbox.options[0] = null; // 移除第一项
// 清除选择框的所有选项
function clearSelectbox(selectbox) 
    for (let option of selectbox.options) 
        selectbox.remove(0);
    

⑤移动和重排选项 

从第一个选择框移除选项,再将其添加到第二个选择框:appendChild()

// 使用 appendChild(),传入文档中已有的元素,该元素会先从其父元素中移除,然后再插入指定位置
let selectbox1 = document.getElementById("selLocations1");
let selectbox2 = document.getElementById("selLocations2");
selectbox2.appendChild(selectbox1.options[0]);

选项移动到选择框中的特定位置:insertBefore() 

// 将一个选项在选择框中前移一个位置
let optionToMove = selectbox.options[1];
selectbox.insertBefore(optionToMove,selectbox.options[optionToMove.index-1]);
// 将选项向下移动一个位置
let optionToMove = selectbox.options[1];
selectbox.insertBefore(optionToMove,selectbox.options[optionToMove.index+2]);

以上是关于JS中的表单脚本的主要内容,如果未能解决你的问题,请参考以下文章

使用Ajax下载DOCX文档

在 Vue.js 中使用 v-for 多次渲染时,表单块会混乱

JS中的表单脚本

JS中的表单脚本

当前页面的脚本发生错误该怎么处理

js表单验证时重复提交的问题