2

.first()元のソースコードに大きな影響を与えることなく、述語パラメーターを受け入れることができるようにjQueryメソッドを拡張することは可能ですか?基本的に私がやりたいのは、LINQの.First()C#メソッドに似たものです。JavaScriptでは、次のようになります。

function first(arr, predicate) {
    for (var i = 0; i < arr.length; i++) {
        // return the first item fulfilling the predicate
        if (predicate.call(arr[i])) {
            return arr[i];
        }
    }
}

var myArray = [1, 3, 5],
    myPredicate = function() {
        return this >= 2;
    };

var result = first(myArray, myPredicate); // should give '3'

JavaScriptで簡単に実現できることは知っています。jQuery内の既存のメソッドを簡単に拡張できるかどうかだけが気になります。

使用したソリューション:

$.fn.firstOne = function(predicate) {
    // validate the predicate is a function
    if ($.isFunction(predicate)) {
        // iterate through each item, finding the first match
        for (var i = 0; i < this.length; i++) {
            if (predicate.call(this.eq(i), i)) {
                return this.eq(i);
            }
        }
    }

    // maintain chainability
    return $();
};
4

2 に答える 2

3

必要に応じて、簡単に(そして安全に)独自のメソッドを作成できます。

$.fn.firstfn = function(fn) {
    return this.filter(fn).first()
}

$("#nav > li").firstfn(function() {
    return $(this).text() === "John Smith";
});

ただし、既存のメソッドをオーバーライドすることはお勧めしません。独自のメソッドを追加するだけです。

于 2012-09-17T14:32:18.287 に答える
1

独自の関数を使用してjQueryを簡単に拡張できます。これを行う方法については、この質問を参照してください

first()ただし、述語/セレクターを処理するためのセレクターがすでに組み込まれています。下記は用例です

$("#mycontainer li.classYouWant").first();
$("#mycontainer").find("another selector").first();
$("#mycontainer li a:first");
于 2012-09-17T14:26:44.217 に答える