JQuery - 如何修改特定元素的jquery方法

时间:2013-08-01 15:39:07

标签: jquery

我想要做的是更改特定元素的默认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);
};

2 个答案:

答案 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文档