在HTML中,表单是由 <form> 元素来表示的,而在 JavaScript 中,表单对应的则是 HTMLFormElement 类型。HTMLFormElement 继承了 HTMLElement ,因而与其他HTML元素具有相同的默认属性。

1、HTMLFormElement 也有自己独有的属性和方法:

acceptChartset:服务器能够处理的字符集,等价于 HTML 中的 accept-chartset

action:接受请求的 URL ,等价于 HTML 中的 action

elements:表单中所有空间的集合(HTMLCollection)

enctype:请求编码类型,等价于 HTML 中的 enctype

length:表单控件的数量

method:请求类型,"post","get",等价于 HTML 的 method

name:表单的名称,等价于HTML 的 name 

reset():重置表单方法

submit():提交表单方法

target:用于发送请求和接受响应的窗口名称,等价于HTML的 target

2、获取表单元素引用

      

var form = document.getElementById("formId");
       var forms = document.forms; // 获得页面中所有的表单
       var firstForm = document.forms[0];
       var form = document.forms["formName"]; // 通过form的name属性获取

3、表单事件:表单submit事件,表单reset事件

3.1 在form 中的 type类型为submit的按钮 点击后会触发 submit 事件

<form id="form1" name="form1" action="#" method="get">
        <input type="text" name="name1" id="name1">
        <input type="text" name="age1" id="age1">
        <!--<input type="submit" value="提交" id="submit">-->
    </form>
    <input type="submit" value="提交" id="submit">
      

        var form1 = document.getElementById("form1");
        var submitBtn = document.getElementById("submit");

        submitBtn.onclick = function(e){   // 点击按钮手动触发表单提交事件,需要把按钮button放在表单外

            //form1.submit();  //若是执行这行代码,表单直接提交了,不会经过submit事件

            //手动触发事件
            if(document.createEvent){
                //FIREFOX\CHROME等标准浏览器
                var evt = document.createEvent('HTMLEvents');
                evt.initEvent('submit',false,true);
                form1.dispatchEvent(evt);
            }else{
                //IE8-浏览器
                var event = document.createEventObject();
                form1.fireEvent('onsubmit',event);
            }


        };

    EventUtil.addHandler(form1,"submit",function (e) {  // 特别执行submit事件处理程序,钮button放在表单内,会直接触发submit事件


        // todo 可以进行一些验证等操作

        e = EventUtil.getEvent(e);
        EventUtil.preventDefault(e);

        console.log("submit");
    });

3.2 在form 中的 type类型为reset的按钮 点击后会触发 reset 事件,将表单的输入框的内容恢复到初始状态

4、表单内的字段

4.1 表单字段共有的属性、方法、事件

 disabled:布尔值,表示是否被禁用

form:指向当前字段所属的表单指针,只读

name:当前字段的名称

readOnly:布尔值,表示是否只读

tabIndex:表示当前字段的切换(tab)序号

type:当前字段类型,如“checkbox”,“radio”等

value:提交给服务器的值,对于文件,这个值是文件路径,而文件的内容是 files属性

focus():将浏览器的焦点设置到当前字段,如果 type 是 “hidden”,或者display/visibility 隐藏了该字段,调用focus()方法会出错。HTML5中有一个autofocus属性,可以自动聚焦。

blur():从元素中移走焦点

        focus事件:当前字段获取焦点时触发

blur事件:当前字段失去焦点时触发

change事件:对于input 和 textarea 元素,在他们失去焦点且value值改变是触发,对于select 元素在其选项改变时触发

5、文本框,input[type="text"]、textarea

5.1 

input:

size特性,指定文本框显示的字符数

value特性:设置初始值

maxlength特性:指定可以接受的最大字符数

textarea:

rows特性:指定文本行数(高度)

cols特性:指定文本一行的列数(宽度)

这两种文本框都可以通过js 用文本框元素的 value 属性获取、设置内容。使用DOM方法,setAttribute() / getAttribute(),innerHTML/innerText 来修改 / 获取 <input>的value、<textarea>的内容,得不到、也无法设置真实的value值

5.2 选择文本

select() :选择文本框的所有文本

select事件:选择了文本(可以是部分文本)并释放了鼠标时触发,ie8-不释放鼠标也会触发select事件

选择的文本:HTML5中为文本框添加了两个属性 selectionStart 和 selectionEnd(选择的文本在原文本中的起始和结束索引);ie8- 中有 document.selection 对象保存着整个文档的选择文本信息           

function getSelectionText(textBox) {
            if(typeof textBox.selectionStart == "number"){
                return textBox.value.substring(textBox.selectionStart,textBox.selectionEnd); // 
            }else if(document.selection){
                return document.selection.createRange().text;
            }
        }

 选择部分文本:HTML5中 setSelectionRange(startIndex, endIndex)来选择部分文本。ie8- 需要使用范围

function setSelectText(textBox,startIndex,endIndex){
            if(textBox.setSelectionRange){
                textBox.setSelectionRange(startIndex,endIndex);
            }else if(textBox.createTextRange){
                var range = textBox.createTextRange();
                range.collapse(true);
                range.moveStart("character",startIndex);
                range.moveEnd("character",endIndex - startIndex);
                range.select();
            }
            textBox.focus();
        }

5.3 过滤输入:限制文本框输入某些字符

1)双击input会出现输入提交过的记录,只需要在input文本输入框中加一条autocomplete=”off”属性即可禁止

2)主要是利用阻止默认事件发生来不让输入

EventUtil.addHandler(textbox,"keypress",function(e){
           e= EventUtil.getEvent(e);

           var target = EventUtil.getTarget(e);
           var charcode = EventUtil.getlCharCode(e);

            // 可以阻止非数字的输入,字符编码小于10的键是一些特殊件的键:向上、向下、向左、向右、退格、删除(其实这些键不会触发keypress事件)
            // 但不能禁止输入法输入中文
           if(!/\d/.test(String.fromCharCode(charcode)) && charcode >9 && !e.ctrlKey){
               EventUtil.preventDefault(e);  // 阻止默认事件发生,可以阻止字符输入
           }
        });
        EventUtil.addHandler(textbox,"keyup",function(e){
           e= EventUtil.getEvent(e);
           EventUtil.preventDefault(e);
            this.value=this.value.replace(/[^\x00-\x80]/gi,''); // 限制中文输入,将中文字符替换成空字符
        });
        EventUtil.addHandler(textbox,"paste",function(e){
           e= EventUtil.getEvent(e);
           EventUtil.preventDefault(e); // 阻止粘贴
           // return false;
        });
        EventUtil.addHandler(textbox,"dragenter",function(e){
           e= EventUtil.getEvent(e);
           EventUtil.preventDefault(e);  // 阻止拖拽
           //return false;
        });
        EventUtil.addHandler(textbox,"drop",function(e){
           e= EventUtil.getEvent(e);
           EventUtil.preventDefault(e);  // 阻止拖拽
          // return false;
        });

5.4 操作剪贴板

    有六个剪贴板事件:

beforecopy:在发生复制前出发

copy:复制时触发

beforecut:剪切前时触发

cut:剪切时触发

beforepaste:粘贴之前触发

paste:粘贴时触发

beforecopy,beforecut,beforepaste在各个浏览器的触发条件不一样,在ie中打开了上下文菜单就会触发,beforepaste在Chrome中都不会触发,在Firefox中这三个事件都不会触发

有个clipboardData 对象 : clipboardData= (event.clipboardData || window.clipboardData); clipboardData对象有三个方法getData(), setData(),clearData(),来操作剪切板,但在Chrome 和 Firefox等浏览器中setData()和clearData()已经被禁了,无效了。

function getClipboardText(event){
        var clipboardData = (event.clipboardData || window.clipboardData);
        return clipboardData.getData("text");
    },

   function setClipboardText(event,value){  
        if(event.clipboardData){  //chrome firefox中已经失效或被禁了
            return event.clipboardData.setData("text/plain",value);
        }else if(window.clipboardData){
            return window.clipboardData.setData("Text",value);
        }
    },
    function clearClipboardText(event){  //chrome firefox中已经失效或被禁了
        var clipboardData = (event.clipboardData || window.clipboardData);
        clipboardData.clearData();
    }

 复制文本

function copy() {
            var Url2=document.getElementById("tocopy").innerText;
            var oInput = document.createElement('input');
            oInput.value = Url2;
            document.body.appendChild(oInput);
            oInput.select(); // 选择对象
            document.execCommand("Copy"); // 执行浏览器复制命令
            oInput.className = 'oInput';
            oInput.style.display='none';
            alert('复制成功');
        }

5.5 切换焦点

var Oseries = document.getElementsByClassName("series");
    for(var i=0;i<Oseries.length;i++){
        EventUtil.addHandler(Oseries[i],"keyup",tabForward);
    }

    function tabForward(event){
        event = EventUtil.getEvent(event);
        var target = EventUtil.getTarget(event);
        if(target.value.length == target.maxLength){
            var form = target.form;
            for(var i=0; i< form.elements.length;i++){
                if(form.elements[i] == target){
                    if(form.elements[i+1]){
                        form.elements[i+1].focus();
                    }
                    return false;
                }
            }
        }
    }

 <form action="">
    <input type="text" class="series" id="" name="tex1" maxlength="3">
    <input type="text" class="series" id="" name="tex2" maxlength="3">
    <input type="text" class="series" id="" name="tex3" maxlength="3">
    </form>

6、下拉选择<select><option>

<select>,HTMLSelectElement 的属性和方法(除了表单字段共有的)

add(newOption,relOption):在relOption之前插入新<option>,在最后插入reOption是null

multiple:布尔值,表示是否允许多选,等价于HTML中的multiple

options:控件中所有的option选项

remove(index):移除给定位置的选项

selectedIndex:基于0 的选中项的索引,如果没有选中项值为-1,如果是多选,则是第一个选中项的索引;设置多选的selectedIndex,会使得选中项就是刚才设置的那个

size:选择框中可见的行数,等价于HTML中的size

value:没有选中项,value为空;有选中项,value为option的value特性,或者是option的文本(没有指定value特性时);有多个选中项,value是第一个选中项的值;

option,HTMLOptionElement 的属性:

index:当前选项在options集合中的索引

label:当前选项的标签,等价于HTML中的label

selected:布尔值,表示当前选项是否被选中,设置为true 则可选中该项(如果是单选,则需该选项在最前)

text:选项的文本

value:选项的值,等价于HTML中的value特性

添加选项:

//添加选项,方法一,使用dom方法
    var newOption = document.createElement("option");
    newOption.appendChild(document.createTextNode("optionText"));
    newOption.setAttribute("value","optionValue");
    selectBox.appendChild(newOption); // 可思议使用 insertBefore()/ replaceChild() 等方法

    //添加选项,方法二,使用dom方法和 Option 构造函数结合
    var newOption = new Option("OptionText","OptionValue"); // 返回一个option元素
    selectBox.appendChild(newOption); // ie8- 不能正常插入选项

    //添加选项,方法三,使用 Option 构造函数和 select.add()
    var newOption = new Option("optionText","optionValue");
    var relOption = selectBox.options[2];
    // 同时将一个选项添加两个地方,后面执行的语句的生效。下面两行代码:先是在relOption之前插入,接着就插入到最后并移除之前插入的选项
    selectBox.add(newOption,relOption);  //添加某个选项之前
    selectBox.add(newOption,undefined);  //添加在最后,ie8-第二个参数是可选的,若是null会报错,undefined 通用

移除选项:

// 每次操作后节点都会动态更新,下面三行代码会连续删除原来的前三个选项
  selectBox.removeChild(selectBox.options[0]); //移除,方法一
  selectBox.remove(0);//移除,方法二
  selectBox.options[0] = null;//移除,方法三

移动选项:

selectBox1.appendChild(selectBox.options[2]);  // 从第一个下拉选择框,移动一项到其他选择框中,不用删除原来的选项
  var len = selectBox.options.length;
  selectBox.insertBefore(selectBox.options[len-1],selectBox.options[1]);// 同一个下拉选择框,最后一个移动到第二个,不用删除原来位置的选项

7、HTML5约束验证API。