.val()
函数,因此当我设置
select
元素的值时,我可以自动触发更改事件。GETTER和SETETER代码可以正常工作,但是执行
$('select').val()
执行操作台两次。我不相信应该发生,所以有人知道怎么了吗? there是一个jsfiddle:
https://jsfiddle.net/41hxsam9/1/
Getter
如果我们记录了val返回的对象,我们会发现它被调用一次,并且一次为选项,这很可能就是jQuery的工作方式:
const originalVal = $.fn.val;
$.fn.extend( {
val: function() {
if ( arguments.length > 0 ) {
if ( $( this ).hasClass( 'myselect' ) ) {
console.log( 'Setter' );
const result = originalVal.apply( this, arguments );
$( this ).trigger( 'change' );
return result;
}
}
console.log( 'Getter' );
return originalVal.apply( this, arguments );
}
} );
else {
// Getter call.
console.log('Getter',this["0"]);
return originalVal.apply(this, arguments);
}
$(() => {
const originalVal = $.fn.val;
$.fn.extend({
val: function() {
if (arguments.length > 0) {
// This is a setter call.
if ($(this).hasClass('myselect')) {
console.log('Setter');
const result = originalVal.apply(this, arguments);
$(this).trigger('change');
return result;
} else {
// Normal setter for elements without the class.
return originalVal.apply(this, arguments);
}
} else {
// Getter call.
console.log('Getter',this["0"]);
return originalVal.apply(this, arguments);
}
}
});
$('#button-1').click((e) => {
$('select').val('1');
});
$('#button-2').click((e) => {
console.log($('select').val());
});
});