2014-12-15 2 views
4

Мы все знаем, что использование val() не инициирует событие change, поэтому мы также используем .trigger('change') за val().jQuery - Обнаружить изменение значения, которое использует функцию .val()

Но проблема в том, что кто-то пишет val() did't с trigger(), и это внешний файл, который я не могу отредактировать.

Итак, как я могу обнаружить изменение значения через некоторый код, так же, как показано ниже:

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

Почему бы не добавить свой собственный слушатель событий для элемента, а затем прослушивайте .trigger() событие оттуда? – Aweary

+1

Возможно, вы захотите увидеть функцию 'watch': http://stackoverflow.com/questions/1029241/javascript-object-watch-for-all-browsers – naota

+0

@naota Я делаю демонстрацию после изучения' watch': http: //jsfiddle.net/yujiangshui/yfo7rrn8/. Он работает, но код наблюдателя должен превышать код val(), и я устанавливаю 'setInterval' для контроля изменения значения. Это способ, но я думаю, что это не изящный способ. Или я неправильно использую? –

ответ

-1

Try:

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

или

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

Спасибо,

+0

Используйте значение val() для изменения значения, оно не инициирует событие «change», а также не запускает событие 'keyup' или' lostfocus', оно не работает. –

1

Мое предложение - переопределить j запросов Query val()

var originalValFn = jQuery.fn.val; 

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

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

0

Try:

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

Спасибо,

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); 
} 
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); 
}; 
+1

Вы должны предоставить больше контекста для своего ответа, просто для отправки кода недостаточно, чтобы объяснить, почему ваш ответ правильный. – Adam

Смежные вопросы