• 在HTML 中,表单是由<form>元素来表示的,而在JavaScript 中,表单对应的则是HTMLFormElement 类型
  • HTMLFormElement类型除了继承了HTMLElement的属性外,还具有一些独有的属性和方法,下面列举几点
  1. 通过document.forms可以获得页面中的所有表单,可通过数值索引或者name值来获得特定表单
1         var form=document.forms[0];
2         console.log(form.name)//textForm, name是自定义的名字
3         console.log(form.elements[0].nodeName);//input, nodeName是标签名
4 //html中
5 <form name="textForm" value="aaa">
6         <input type="text" name="text_1" >
7         <input type="text" name="text_2">
8     </form>

  2. form中提交表单的三种方法

<!-- 提交表单 -->
    <form>
        <input type="image" name="">
        <input type="submit" name="">
        <button type="submit"></button>
    </form>

  如果需要阻止表单数据的提交,调用defaultPrevent()方法即可。一般来说,在表单数据无效而不能发送给服务器时,可以使用这一技术。

  js中也可以通过或form.submit()方法提交表单。

  3. 为了防止用户多次提交重复表单,可以第一次提交表单后就禁用提交按钮,或者利用onsubmit 事件处理程序取消后续的表单提交操作。

  4. 重置表单

  • 通过将type设置为reset,用户单击重置按钮重置表单时,会触发reset 事件,在重置表单时,所有表单字段都会恢复到页面刚加载完毕时的初始值
1     <!-- 充值表单 -->
2     <form>
3         <input type="text" name="">
4         <input type="reset" name="">
5     </form>

  5. 表单的element属性。通过form.element[ ]可以访问form表单内的标签,如<input> <button> <textarea>等

  6. 表单的属性

1     <!-- 表单属性 -->
2     <form id="field">
3         <input type="text" name="">
4         <input type="button" name="">
5         <input type="radio" name="">
6     </form>
1         //表单属性
2         var form=document.getElementById('field');
3         var field=form.elements[0]//field调用第一个input
4         field.value="another value";
5         console.log(field.form)//form;
6         field.focus()//焦点设置到当前字段
7         field.disabled=true;//禁用当前字段

value, form, focus和disabled等属性。

  • 为了避免多次提交表单,可以这样设计
1         EventUtil.addHandler(form,"submit",function(){
2             event=EventUtil.getEvent(event);
3             var target=EventUtil.getTarget(event);
4 
5             var btn=target.element["submit-button"];
6             btn.disabled=true;
7         })

  7. 表单字段和方法

  • 表单共有focus和blur两种方法
  • focus()方法,比如可以在页面加载完毕,表单内就出现插入符号,等待用户输入。HTML5为表单增加了一个autofocus字段,可以直接设置
1 <input type="text" autofocus>
  • blur()方法与focus()方法相反,将焦点移走。
  • change 事件在不同表单控件中触发的次数会有所不同。对于<input>和<textarea>元素,当它们从获得焦点到失去焦点且value 值改变时,才会触发change 事件。对于<select>元素,只要用户选择了不同的选项,就会触发change 事件;换句话说,不失去焦点也会触发change 事件。
  • 文本框脚本
  1. <input>和<textarea>两个比较相似,区别在:
  • 对于input来说,通过设置size 特性,可以指定文本框中能够显示的字符数。通过value 特性,可以设置文本框的初始值,而maxlength 特性则用于指定文本框可以接受的最大字符数
  • 对于textarea来说,可以使用rows和cols 特性设置字符的行数和列数,但是不能设置最大字符数。
  • 选择文本
  1. select()方法,可以将焦点设置到文本框内的同时选择所有的文本。所以可以通过设置这个方法快速的删除、复制文本框内的文本
  2. select()事件,一旦选择文本便可触发。通过selectionStart和selectionEnd来获取选择到的文本
1         //输出选择到的字符串
2         var textbox=document.getElementById('textbox');
3         console.log(textbox.value);
4         textbox.onselect=function(){
5             console.log(textbox.value.substring(textbox.selectionStart,textbox.selectionEnd))
6         }

  3. 选择部分文本,调用selectionRange(),传入两个参数,头和尾。

  • 过滤输入
  1. 借助keypress事件,可以获得输入的字符(event.keycode/event.charCode),同时过滤输入的结果(借助preventDefault())。
  2. 操作剪贴板(比如你在淘宝买了一个帐号,复制帐号密码到剪贴板的时候,可以用这个功能)
  • 使用clipboardData 对象,在IE中是window的属性,在在Firefox 4+、Safari 和Chrome 中,这个对象是相应event 对象的属性 
  • clipboardData 对象有三种方法,:getData()、setData()和clearData()
  • HTML5约束
  1. 有一些必填的字段,借助required关键字
1 <input type="text" name="username" required>

  2. 其他的输入类型

1 <input type="email" name ="email">
2 <input type="url" name="homepage">

  3. 数值范围

1 <input type="number" min="0" max="100" step="5" name="count">

  4. 输入模式,借助正则限制

1 <input type="text" pattern="\d+" name="count">

  5. 禁用验证

1 <form method="post" action="signup.php" novalidate>
  • 选择框脚本
  1. 选择框是通过<select>和<option>元素创建的,通过text和value可以获取option的文本和值
1     <!-- 选择框 -->
 2     <form id='selectForm'>
 3         <select id="select_A">
 4             <option value="firstChoice">Choice 1</option>
 5             <option>Choice 2</option>
 6             <option>Choice 3</option>
 7         </select>
 8         <select id="select_B">
 9             <option>Choice 5</option>
10             <option>Choice 6</option>
11         </select>
12     </form>
1         //选择框JS
2         var formBox=document.getElementById('selectForm');
3         var firstSelect=formBox.elements[0];
4         console.log(firstSelect.options[0].text);//choice 1
5         console.log(firstSelect.options[0].value);//firstChoice

  记住层级结构,forms内的元素可以通过elements[ ]来访问,select内的选择项,通过options[ ]来访问。

1         //firstSelect具有一个selectedIndex属性,返回选择项的下标
2         var selectedOption=firstSelect.options[firstSelect.selectedIndex];
3         console.log(selectedOption.text)//choice 1

  2. 通过add方法给下拉菜单添加选项

//动态的添加选项
        var newOption=new Option("optionText","optionValue")
        firstSelect.add(newOption,undefined);
  • Option包装成了对象,传入text和value两个参数
  • add()方法,它的存在,专门为select表单来添加选项。

  3. 移除选项

1     firstSelect.remove(3);//移除新的选项
  • 表单序列化
  1.  浏览器是怎样将数据发送给服务器的?
  • 对表单字段的名称和值进行URL 编码,使用和号(&)分隔
  • 禁用的表单字段,type为reset和button的, 不发送。

  2. 富文本编辑

  • 又称所见即所得
1 <div  id="richedit" style="height: 100px;width:100px;border: 1px solid black" ></div>
1         //添加富文本区域
2         var div=document.getElementById('richedit');
3         div.contentEditable="true";
  • 添加一些控件
1 <!-- 富文本 -->
2     <div id="richedit" style="height: 100px;width:100px;border: 1px solid black" ></div>
3     <div id="buttons">
4         <button id="btn1" >打开编辑</button>
5         <button id="btn2" >关闭编辑</button><br />
6         <button id='justifycenter'>居中</button>
7         <button id='justifyleft'>左对齐</button><br />
8         <button id="italic">斜体</button>
9     </div>
1 EventUtil.addHandler(btn,'click',function(){
 2             event=EventUtil.getEvent(event);
 3             var target=EventUtil.getTarget(event);
 4             switch(target.id){
 5                 case "btn1":
 6                 richedit.contentEditable=true;
 7                 break;
 8                 case "btn2":
 9                 richedit.contentEditable=false;
10                 break;
11                 case "justifycenter":
12                 document.execCommand('justifyCenter');
13                 break;
14                 case "justifyleft":
15                 document.execCommand('justifyLeft');
16                 break;
17                 case "italic":
18                 document.execCommand("italic",false,null);
19             }
20         })
  • 表单提交:因为富文本不是form控件实现的,所以需要将富文本中的innerHTML提交赋给表单,然后再提交给服务器
1 EventUtil.addHandler(form, "submit", function(event){
2   event = EventUtil.getEvent(event);
3   var target = EventUtil.getTarget(event);
4   target.elements["comments"].value = frames["richedit"].document.body.innerHTML;
5 });