有没有一种简单的方法可以覆盖 jQuery 的 val()
函数?
我想要覆盖它的原因是每次设置元素的值时都要添加一些处理,而我不想再创建另一个自定义的值设置器,比如 myVal()
。
有没有一种简单的方法可以覆盖 jQuery 的 val()
函数?
我想要覆盖它的原因是每次设置元素的值时都要添加一些处理,而我不想再创建另一个自定义的值设置器,比如 myVal()
。
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);
请注意,您可以通过检查value
参数是否为undefined
来区分获取器调用$(selector).val();
和设置器调用$(selector).val('new value');
。
let afterOriginalFunc = originalVal.call(this,value); CallMyFunction_DependentOnThatExecution(); return afterOriginalFunc;
这样的代码非常完美,可以执行原始函数并在该函数评估后立即触发我的依赖代码。感谢您提供示例并分享解决方案。 - sanpat我知道这是一个老话题,但它在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);
如果您想传递所有参数,也可以使用apply
(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);
我希望它能够帮到你!
我知道这个问题比较老,但为了给出完整的解决方案,需要正确且分别重写jQuery.val()和jQuery.val(value)。
因为在调用jQuery.val()时,原始的originalVal.call(this, value);无法正常工作。
要以正确的方式获取值,应该像这样做:
originalVal.call(this);
在这里有一个详细解释的网站:http://extremedev.blogspot.com/2012/01/override-jqueryval-and-jqueryvalvalue.html
祝好, Roman
.val()
的“get”和“set”:(function () {
var __val = $.fn.val;
$.fn.val = function (value) {
if (this[0] && (this[0].$val_get || this[0].$val_set)) {
if (arguments.length === 0) return this[0].$val_get();
else return this[0].$val_set(value) || this;
}
return __val.apply(this, arguments);
};
})();
$val_get
和$val_set
:<input type="text" id="myInput" />
<input type="text" id="someOtherInput" />
<script>
$('#myInput')[0].$val_get = function () {
console.log('Got value from myInput!');
return this.value;
};
$('#myInput')[0].$val_set = function (value) {
console.log('Set value of myInput!');
this.value = value;
}
//----
$('#myInput').val('Hello!'); //Console: "Got value from myInput!"
$('#myInput').val(); //Hello! | Console: "Set value to myInput!"
$('#someOtherInput').val('Hello!'); //Console: ""
$('#someOtherInput').val(); //Hello! | Console: ""
</script>
jQuery.fn.val = function (new_val) {
alert("You set a val! How wonderful!");
this.value = new_val;
};
只需确保包括常规功能:获取选择值等。将该代码粘贴在常规jQuery库之后即可。
我有一些要补充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('')函数之前被调用,这将同时触发每个val('')赋值上的.change()。