1

我想在输入字段中的每个实际更改触发一次事件处理程序。例如,要验证(每次按键)信用卡号的输入(每次更改都必须进行更改,因此去抖动/节流不是答案)。

我不能input单独使用,因为 IE9 不会从退格或剪切/删除触发此事件。

我不能keyup单独使用,因为它不能处理来自鼠标的更改(例如粘贴)。

我不能使用change,因为这只会触发blur.

我可以这样做$('input').bind('input keyup', handler),但这在大多数情况下会触发两个单独的事件。假设处理程序很昂贵并且运行两次是不可接受的。

我可以包装处理程序,使其仅在当前值与上次检查的值不同时运行,但有更好的方法吗?

4

5 回答 5

5

您检查最后一个输入所做的就是您需要做的。

这是存储最后一个值的一种方法。

function handler(){ 
    var tb = jQuery(this);
    var currentValue = tb.val();
    if (tb.data("lastInput") !== currentValue) {
        tb.data("lastInput", currentValue);
        console.log("The current value is " + currentValue);
    } 
}
$('input').bind('input keyup', handler);

jsFiddle

如果你真的不想在你的函数中使用那个逻辑,你总是可以扩展 jQuery。这是一堆更多的代码,但是一种方法。

(function(){
    $.fn.oneinput = function(callback) {        
        function testInput(){ 
            var tb = jQuery(this);
            var currentValue = tb.val();
            if (tb.data("lastInput") !== currentValue ) {
                tb.data("lastInput",currentValue );
                if(callback) { 
                    callback.call(this) 
                };
            }
            return this;
        }    
        jQuery(this).bind("keyup input", testInput);
    };
}(jQuery));

$('input').oneinput( function(){ console.log(this.value); });
​

jsfiddle

于 2012-09-28T13:04:11.390 回答
0

尝试这个

    $('input').bind('keyup cut paste', function (event) {
         console.log('value changed');
    });

小提琴http://jsfiddle.net/sXvK2/1/

于 2012-09-28T12:52:30.893 回答
0

如果您不需要处理程序返回值,则可以使其return false不会再次触发。

于 2012-09-28T12:37:33.877 回答
0

我认为你必须用它setInterval来监控文本框中的变化

试试这个演示

objTextBox = document.getElementById("trackChange");
oldValue = objTextBox.value;

console.log(oldValue);

function track_change()
   {
     if(objTextBox.value != oldValue)
     {
       oldValue = objTextBox.value;
       console.log("changed")
     }

   }

setInterval(function() { track_change()}, 100);

注意:我个人认为这不是最好的解决方案。但我找不到更好的解决方案,至少它在任何情况下都可以肯定地工作键盘或鼠标;)

于 2012-09-28T12:45:21.953 回答
-3

关于什么

$el.bind('input', handler);
$el.bind('keyup', handler);
...
于 2012-09-28T12:19:51.603 回答