oninput,onpropertychange,onchange的用法

onchange触发事件必须满足两个条件:

a)当前对象属性改变,并且是由键盘或鼠标事件激发的(脚本触发无效)

b)当前对象失去焦点(onblur);

onpropertychange的话,只要当前对象属性发生改变,都会触发事件,但是它是IE专属的;

 

关于oninput事件

oninput 是 HTML5 的标准事件,对于检测 textarea, input:text, input:password 和 input:search 这几个元素通过用户界面发生的内容变化非常有用,在内容修改后立即被触发,不像 onchange 事件需要失去焦点才触发。 oninput 事件兼容为ie9+, ie下可以onpropertychange事件,不是本节内容。

只要内容又发生变化都会触发oninput事件,对于用键盘直接输入的纯字符时比较好用,但当输入中文时,由于中文是由多个汉语拼音组成一个汉字,没输入一个汉语拼音都要触发一次oninput,但你最终想要监听的只有最后输入的中文字。也就是说input事件无法区分键盘直接输入和非直接(输入法)输入。对于非直接(输入法)输入,则需要用到下面两个事件。

compositionstart和compositionend属于复合事件,用来处理IME的输入序列。

IME(input MEthod Editor,输入法编辑器)可以让用户输入物理键盘上找不到的字符,例如汉字“龙”。先简单理解为对输入法程序的监听。

compositionstart

在IME的文本复合系统打开时出发,例如使用中文输入法输入中文时, compositionstart事件会以同步模式触发.

compositionend

在IME的文本复合系统关闭时触发,表示返回正常键盘输入状态。

看了两个事件就明白,开始中文输入时会触发compositionstart事件选词结束后会触发compositionend事件,忽略这两个事件之间的input事件即可,为元素添加这个两个事件,做一个开关,如下:

<input type="text" id="sample" />

var node = document.querySelector('#sample');
var inputLock = false;
node.addEventListener('compositionstart', function(){
    inputLock = true;
})
node.addEventListener('compositionend', function(){
    inputLock = false;
})
node.addEventListener('input', function(){
    if(!inputLock )
    // do something for input limit

<input type="text" id="sample" />

var node = document.querySelector('#sample');
var inputLock = false;
node.addEventListener('compositionstart', function(){
    inputLock = true;
})
node.addEventListener('compositionend', function(){
    inputLock = false;
})
node.addEventListener('input', function(){
    if(!inputLock )
    // do something for input limit

});

 

compositionstart 、compositionend和input三个事件的执行顺序是compositionstart  -->  input (一次或多次) --> compositionend。

下面是一个对input的输入进行监听的一段实例代码,通过inputLock来过滤IME时的input事件。

function initNameInputEvent(){ 
    var $name = $("#name"); 
    var inputLock = false;
    $name.bind('input propertychange',
        function(e){    
            if(!inputLock)
                onInputChange(e.target);    
        }); 
    $name.bind('compositionstart', 
        function(){ 
            console.log("start");    
            inputLock = true; 
        }); 
    $name.bind('compositionend', 
        function(e){ 
            inputLock = false; 
            onInputChange(e.target); 
        }); 
}