Переопределить функцию jQuery.val()?
Есть ли способ легко переопределить функцию jQuery val()
?
Причина, по которой я хочу переопределить это, заключается в том, что я хочу добавить некоторую обработку каждый раз, когда значение устанавливается для элемента. И я не хочу создавать другой настраиваемый набор значений, например myVal()
.
Ответы
Ответ 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 ('').