Обнаружение JQuery Onchange - PullRequest
       2

Обнаружение JQuery Onchange

1 голос
/ 18 марта 2011

Я хочу выполнить javascript, который находится в атрибуте «onchange» html-элемента.Итак ..

<input id="el" type="text" onchange="alert('test');" value="" />

Используя этот пример, я хотел бы выполнить часть al ert('test'); через jQuery, проблема в том, что обработчик события .change() не работает, потому что я хочу его выполнитьпосле того, как другой элемент изменит свое значение.Итак ..

$('#el').val('test');

Это когда я хотел бы выполнить onchange.После этого .val val был вызван.Есть идеи?

Ответы [ 5 ]

6 голосов
/ 18 марта 2011

.val() не запускает change события. Вы должны сделать это самостоятельно, вручную. Например:

$('#el').val('test').change();

Вы можете заключить это в небольшой плагин jQuery, например:

(function ($) {
    $.fn.changeVal = function (text) {
        this.val(text).change();
    };
}(jQuery));

$('#el').changeVal('test');
2 голосов
/ 28 апреля 2011

Я думаю, что имеет смысл, что событие onchange ВСЕГДА срабатывает при изменении значения поля.Таким образом, я бы изменил функцию val в самом JQuery, а не сделал бы пользовательскую функцию.Таким образом, вам не нужно беспокоиться о том, какую функцию вы используете для установки значения объекта, и не нужно менять все свои вызовы val, если вы уже использовали JQuery для кодирования своего приложения.Вот код:

//Store the old val function
$.fn.custom_oldVal = $.fn.val;

//Update the val function to fire the change event where appropriate:
$.fn.val = function(value) {
    if(value == null || value == undefined){
        return this.custom_oldVal();
    } else {
        //Only call onchange if the value has changed
        if(value == this.custom_oldVal()){
            return this;//Return this object for chain processing
        } else {
            return this.custom_oldVal(value).change();
        }
    }
}
0 голосов
/ 19 октября 2012

Я бы изменил дизайн и начал бы использовать knockout.js плагин, который использует привязку данных, где позволяет довольно легко использовать все привязки.

пример кода ниже:

var ViewModel = function(first, last) {
this.firstName = ko.observable(first);
this.lastName = ko.observable(last);

this.fullName = ko.computed(function() {
    // Knockout tracks dependencies automatically. It knows that fullName depends on firstName and lastName, because these get called when evaluating fullName.
    return this.firstName() + " " + this.lastName();
}, this);

};

ko.applyBindings (новая ViewModel ("Планета", "Земля"));

0 голосов
/ 18 марта 2011

если вы первый
input.focus(); затем $.val('abcd'); событие изменения будет запущено.
взято с сайта jquery .

0 голосов
/ 18 марта 2011

У меня была такая же проблема некоторое время назад, но я не мог найти какие-либо хорошие решения для нее. Похоже, что лучшее решение - это «вытянуть» ввод или запустить функцию onchange (как показано в Domenic) из кода, который фактически изменяет содержимое ввода.

...