jQuery - 检测使用.val()函数的值更改

时间:2014-12-15 04:01:11

标签: javascript jquery

我们都知道使用val()不会触发change事件,因此我们也会在.trigger('change')后面使用val()

但问题是有人用val()写了trigger()并且它是一个我无法编辑它的外部文件。

那么,如何通过以下相同的代码检测值变化:

$('.elem').on('change', function(){
   // do something
});

5 个答案:

答案 0 :(得分:1)

我的建议是覆盖jquery' val()

var originalValFn = jQuery.fn.val;

jQuery.fn.val = function() {
    this.trigger('change');
    originalValFn.apply( this, arguments );
}

jsfiddle:http://jsfiddle.net/2L7hohjz/js

答案 1 :(得分:1)

var originalValFn = jQuery.fn.val;

function getErrorObject(){
    try { throw Error('') } catch(err) { return err; }
}

jQuery.fn.val = function() {
    if ($(this).hasClass( "element" )) {
        var err = getErrorObject();
        var caller_line = err.stack.split("\n")[4];
        var index = caller_line.indexOf("at ");
        var clean = caller_line.slice(index+2, caller_line.length);

        console.log(clean);
        console.log(arguments);
    }
    originalValFn.apply( this, arguments );
};

答案 2 :(得分:0)

尝试:

setTimeout(function() {
     if (currentValue != previousValue)
     {
        // do something
     }
}, 500);

谢谢,

答案 3 :(得分:0)

我通常使用这篇文章中的解决方案来解决像这样的问题:

hidden input change event

watchField('.elem', function(){
    //do some stuff here
});

function watchField(selector, callback) {
   var input = $(selector);
   var oldvalue = input.val();
   setInterval(function(){
      if (input.val()!=oldvalue){
          oldvalue = input.val();
          callback();
      }
   }, 100);
}

答案 4 :(得分:-1)

尝试:

$('.elem').on('keyUp', function(){
   // do something
});

$('.elem').on('lostFocus', function(){
   // do something
});

谢谢,