1

このタイプの機能が必要になった場合に備えて、現在のソリューションはこの要点に存在し ますhttps://gist.github.com/jdaly13/5581538#file-gistfile1-js

jQueryのコアエンドメソッドを、本質的に機能を追加する独自のメソッドでオーバーライドしようとしている小さな実験を試みています

たとえば、jQuery を使用している場合は、次のようにすることができます。

$('h1.clickme').click(function () {
     $(this).next('div').css("width", "+=200").parent().next().hide().end().end()
      //this should traverse you back to the div after the h1 clicked
})

たとえば、数値パラメーターを追加する機能を追加して、jQuery end メソッドをオーバーライドしたい

.end(1) 

と同じことをします

.end().end()

これが私がこれまでに持っているものです

(function(){

// Define overriding method.
jQuery.fn.end = function(no_of_times){
    var prevObject = "prevObject";
    if (!(arguments.length) || (typeof no_of_times !== "number")) {
        return this.prevObject || this.constructor(null);
    } else {
        if (no_of_times == 1) {
            return this.prevObject.prevObject || this.constructor(null)
        } else if (no_of_times == 2) {
            return this.prevObject.prevObject.prevObject || this.constructor(null)  
        } else if (no_of_times == 3) {
            return this.prevObject.prevObject.prevObject.prevObject || this.constructor(null)
        } else {
            //too many times can't type anymore
            return this.prevObject || this.constructor(null);
        }           
    }

}
})()

だから私はこのようなものを呼び出すことができます

$('.promo-carousel').parent().prev().siblings('span').hide().end(2)

しかし、明らかに、if ステートメントをすべて書き出すのは効率的ではないと思います。これを行う簡単な方法はありますか? パフォーマンスはほぼ同じだと確信していますが、読みやすさのためにこれを行っています

このように渡されたパラメーターに基づいて、prevObject変数に「prevObject」文字列を追加することを考えました

if (!(arguments.length) || (typeof no_of_times !== "number")) {
            return this.prevObject || this.constructor(null);
        } else {
            for (i=0; i <= no_of_times; i++) {
                pObj += "prevObject."           
            }
            var prevObject = pObj.slice(0, prevObject.length -1)
            console.log(prevObject);
            return this.prevObject
        }

    }

しかし、上記のコードのスニペットは機能しませんでした

4

4 に答える 4

2

これでうまくいくはずです:

var prevObject = this.prevObject;

for(i = 1; i<no_of_times; i++) {
    prevObject = prevObject.prevObject;
    if(!prevObject) {
        prevObject = this.constructor(null);
        break
    }
}

prevObjectループのprevObject各反復の を取得するだけで、untilprevObjectが見つかりません。

于 2013-05-14T21:47:26.393 に答える
1

これが私の解決策です: http://jsfiddle.net/QVxqY/
ロジックを再実装したり、以前の要素を追跡したりする必要はありません:

(function($){
    var originalEnd = $.fn.end;
    $.fn.end = function(n){
        if(!n)
            return originalEnd.call(this);
        return $.fn.end.call(originalEnd.call(this), n-1);
    }
})(jQuery);
于 2013-05-14T22:10:38.730 に答える
0

オーバーライドしている古いメソッドを再利用できます。

(function($){
    var oldfn = $.fn.end;
    $.fn.end = function(times){
        times = times || 1; // default to 1 if nothing or 0 is passed in
        var ret = this;
        for (i=0;i<times;i++) {
            ret = oldfn.call(ret);
        }
        return ret;
    };
})(jQuery);
于 2013-05-14T21:52:49.350 に答える