表单事件

    input事件的一个特点,就是会连续触发,比如用户每按下一次按键,就会触发一次input事件。

    input事件对象继承了InputEvent接口。

    该事件跟change事件很像,不同之处在于input事件在元素的值发生变化后立即发生,而change在元素失去焦点时发生,而内容此时可能已经变化多次。也就是说,如果有连续变化,input事件会触发多次,而change事件只在失去焦点时触发一次。

    下面是<select>元素的例子。

    上面代码中,改变下拉框选项时,会触发input事件,从而执行回调函数inputHandler

    select事件当在<input><textarea>里面选中文本时触发。

    1. // HTML 代码如下
    2. // <input id="test" type="text" value="Select me!" />
    3. var elem = document.getElementById('test');
    4. console.log(e.type); // "select"
    5. }, false);

    选中的文本可以通过元素的selectionDirectionselectionEndselectionStartvalue属性拿到。

    change事件当<input><select><textarea>的值发生变化时触发。它与input事件的最大不同,就是不会连续触发,只有当全部修改完成时才会触发,另一方面input事件必然伴随change事件。具体来说,分成以下几种情况。

    • 激活单选框(radio)或复选框(checkbox)时触发。
    • 用户提交时触发。比如,从下列列表(select)完成选择,在日期或文件输入框完成选择。
    • 当文本框或<textarea>元素的值发生改变,并且丧失焦点时触发。

    如果比较一下上面input事件的例子,你会发现对于<select>元素来说,inputchange事件基本是等价的。

    用户提交表单时,如果表单元素的值不满足校验条件,就会触发invalid事件。

    1. <form>
    2. <input type="text" required oninvalid="console.log('invalid input')" />
    3. <button type="submit">提交</button>
    4. </form>

    上面代码中,输入框是必填的。如果不填,用户点击按钮提交时,就会触发输入框的invalid事件,导致提交被取消。

    这两个事件发生在表单对象<form>上,而不是发生在表单的成员上。

    reset事件当表单重置(所有表单成员变回默认值)时触发。

    submit事件当表单数据向服务器提交时触发。注意,submit事件的发生对象是<form>元素,而不是<button>元素,因为提交的是表单,而不是按钮。

    InputEvent 接口

    InputEvent接口主要用来描述事件的实例。该接口继承了Event接口,还定义了一些自己的实例属性和实例方法。

    浏览器原生提供InputEvent()构造函数,用来生成实例对象。

    • inputType:字符串,表示发生变更的类型(详见下文)。
    • data:字符串,表示插入的字符串。如果没有插入的字符串(比如删除操作),则返回null或空字符串。

    InputEvent的实例属性主要就是上面三个属性,这三个实例属性都是只读的。

    (1)InputEvent.data

    InputEvent.data属性返回一个字符串,表示变动的内容。

    1. // HTML 代码如下
    2. // <input type="text" id="myInput">
    3. var input = document.getElementById('myInput');
    4. input.addEventListener('input', myFunction, false);
    5. function myFunction(e) {
    6. console.log(e.data);
    7. }

    上面代码中,如果手动在输入框里面输入abc,控制台会先输出a,再在下一行输出b,再在下一行输出c。然后选中abc,一次性将它们删除,控制台会输出null或一个空字符串。

    (2)InputEvent.inputType

    InputEvent.inputType属性返回一个字符串,表示字符串发生变更的类型。

    对于常见情况,Chrome 浏览器的返回值如下。完整列表可以参考。

    • 手动插入文本:insertText
    • 粘贴插入文本:insertFromPaste
    • 向后删除:deleteContentBackward

    (3)InputEvent.dataTransfer