Подтвердить что ты не робот

Переопределить функцию jQuery.val()?

Есть ли способ легко переопределить функцию jQuery val()?

Причина, по которой я хочу переопределить это, заключается в том, что я хочу добавить некоторую обработку каждый раз, когда значение устанавливается для элемента. И я не хочу создавать другой настраиваемый набор значений, например myVal().

4b9b3361

Ответ 1

Вы можете сохранить ссылку на исходную функцию val, затем переопределить ее и выполнить свою обработку, а затем вызвать ее с помощью call, чтобы использовать правильный контекст:

(function ($) {
  var originalVal = $.fn.val;
  $.fn.val = function(value) {
    if (typeof value != 'undefined') {
      // setter invoked, do processing
    }
    return originalVal.call(this, value);
  };
})(jQuery);

Обратите внимание, что вы можете различать геттер-вызов $(selector).val(); и вызов setter $(selector).val('new value');, просто проверяя, является ли аргумент value undefined или нет.

Ответ 2

Я знаю, что это старый вопрос, но он сначала в поиске Google, и ответ не совсем прав...

Например, если вы попробуете в консоли $('#myinput').val(), вы должны получить значение #myinput.

Но если вы делаете $('#myinput').val(undefined), вы должны установить значение #myinput! ( С текущим ответом и комментариями к нему вы не укажете значение #myinput)

Вот обновленный ответ, который использует arguments.

(function ($) {
  var originalVal = $.fn.val;
  $.fn.val = function(value) {
    if (arguments.length >= 1) {
      // setter invoked, do processing
      return originalVal.call(this, value); 
    }
    //getter invoked do processing
    return originalVal.call(this);
  };
})(jQuery);

если вы хотите передать все аргументы, которые вы также можете использовать, примените

(function ($) {
  var originalVal = $.fn.val;
  $.fn.val = function(value) {
    if (arguments.length >= 1) {
      // setter invoked, do processing
    } else {
      //getter invoked do processing
    }
    return originalVal.apply(this, arguments);
  };
})(jQuery);

Надеюсь, это поможет!

Ответ 3

Я знаю, что проблема старая, но просто для полного решения. Для того, чтобы как jQuery.val(), так и jQuery.val(значение) работать после переопределения, вам необходимо переопределить его правильно и отдельно. Потому что при вызове jQuery.val() тогда originalVal.call(это, значение); будет работать неправильно.

Чтобы сделать это правильно, вам нужно сделать что-то подобное при получении значения: originalVal.call(это);

Вот сайт, где все объясняется: http://extremedev.blogspot.com/2012/01/override-jqueryval-and-jqueryvalvalue.html

С уважением, Roman

Ответ 4

Если я понимаю вас правильно, что-то вроде этого должно сделать трюк просто отлично:

jQuery.fn.val = function (new_val) {
    alert("You set a val! How wonderful!");
    this.value = new_val;
};

Просто убедитесь, что вы включили обычную функциональность: получение значений выбора и т.д. Просто придерживайтесь этого кода после обычной библиотеки jQuery.

Ответ 5

У меня есть что добавить в ответ CMS, моя реализация будет отличаться и быть примерно такой:

(function ($) { var fnVal = $.fn.val;
    $.fn.val = function(value) {
        if (typeof value == 'undefined') {
            return fnVal.call(this);
        }
        var result = fnVal.call(this, value);
        $.fn.change.call(this);
        // here you can add some more implementation
        return result;
    };
})(jQuery);

наблюдать за $. fn.change.call(this); будет вызываться перед выходом из функции val (''), это вызовет также .change() для каждого val ('').