Как указывают другие ответы, вы можете расширить (переписать) функцию val (), но не стоит жестко кодировать в нее несвязанное поведение.
Однако я считаю, чтоУдобный способ вызвать что-либо, когда значение изменяется программно, - это переписать функцию val () и вызвать событие изменения вашего элемента - НО ТОЛЬКО ЕСЛИ УКАЗАНО этим элементом.
Вы можете определить этот запрос, добавиватрибут данных (или класс и т. д.) для вашего элемента, например, так:
<!-- Add the data-trigger-change attribute -->
<input data-trigger-change class="dark-when-changed" name="test" value="123">
Затем ваша новая функция val может проверить этот атрибут.
const fnVal = $.fn.val;
$.fn.val = function(value) {
// check if the value is actually changing
let changed = typeof value!=='undefined' && typeof $(this)[0] !=='undefined' && value !== $(this)[0].value;
// change the value by the standard method
let $return = fnVal.apply(this, arguments);
// if this element wants to trigger the change method (and it has actually changed)
if(changed && $(this).is('[data-trigger-change]')) {
// trigger the change method
$(this).trigger("change");
// return the original response
return $return;
}
// return the original response without doing anything else
return $return;
};
... и тогда вы можете написать обработчик изменений, который будет делать что угодно:
$(document).on('change','input.dark-when-changed',function(){
$(this).addClass('dark');
});
ПРЕДУПРЕЖДЕНИЕ! Это может привести к бесконечному циклу, если вы, очевидно, измените значение в вашем обработчике изменений с помощью val ().Если вам действительно нужно, вы можете избежать этого, используя $ ('input.dark-when-change') [0] .value = 'blah';