我想要做的是更改特定元素的默认jquery方法。
例如,我想更改某些(不是全部)val()
列表的方法select
。然后在必要时恢复原状。
我的第一次尝试是以下但不起作用。
$('#list').val = function(){ alert('toto'); };
//and then
$('#list').val() //not work
解
var old_val = $.fn.val;
$.fn.val = function(value){
//some condition to trigger
if (this.hasClass('someclass')){
//getter
if (value===undefined){
//do something to get the values
return val;
}
//setter
else {
//do something with the value
return this;
}
}
return old_val.apply(this, arguments);
};
答案 0 :(得分:4)
每次调用$('#list')
时,都会创建一个新的jQuery对象。因此,当您执行$('#list').val = function(){ alert('toto'); };
时,您已为仅覆盖该实例的val()方法。如果缓存该对象,则可以继续使用覆盖的val()方法:
var list = $('#list');
list.val = function(){ alert('toto'); };
list.val(); //alerts 'toto'
然而,这是一个不好的做法,因为你不知道还有什么依赖于val()正常工作。更好的方法是创建自己的插件:
$.fn.totoVal = function() {
alert('toto');
return this;
};
然后,您可以将其称为$('#list').totoVal()
修改强>
如果你真的,真的想这样做(这也是一个坏主意),你可以用这种方式覆盖原生的val()实现:
var originalValueFunct = $.fn.val;
//update value function
$.fn.val = function () {
return "custom value";
}
//do something with val()
//restore value function
$.fn.val = originalValueFunct;
有关覆盖和恢复本机val()函数的示例,请参阅此working demo。
我强烈反对这样做,因为您将在代码或您使用的依赖val()方法的任何库中创建副作用。这些副作用将很难调试,因为它们只会出现在您的环境中,并且您已经更改了一段核心jQuery功能并不总是很明显。
答案 1 :(得分:1)
jquery提供了valHooks对象,您可以将任何要附加到.val()函数的函数附加到该对象。 你的例子看起来像这样,把它放在一行。
$。valHooks.select = {get:function(elem){if($(elem).attr('id')=='list')alert('toto')}}
有关valHooks的更多详细信息,您可以查看http://api.jquery.com/val/上的jquery api文档