1

私がしたいのは、特定の要素のデフォルトの 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);
};
4

2 に答える 2

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() 関数のオーバーライドと復元の例については、この作業デモを参照してください。

val() メソッドに依存するコードまたは使用するライブラリに副作用が生じるため、これを行うことは強くお勧めしません。これらの副作用はデバッグが非常に困難です。なぜなら、それらはあなたの環境にしか存在せず、コア jQuery 機能の一部を変更したことが常に明らかであるとは限らないからです。

于 2013-08-01T15:46:18.277 に答える