2

次のようなテーブル行があります。

<tr class="parent0 row3" data-parent="0">
   <td>...</td>
</tr>
<tr class="parent3 row7" data-parent="3">
   <td>...</td>
</tr>
<tr class="parent3 row12" data-parent="3">
   <td>...</td>
</tr>
<tr class="parent0 row8" data-parent="0">
   <td>...</td>
</tr>
<tr class="parent0 row9" data-parent="0">
   <td>...</td>
</tr>

したがって、クリック ハンドラーがある場合:

$(document).on({
   "click": function(){
      var parentId = $(this).data("parent");
      //get previous sibling:
      //OPTION A:
      var prevParentA = 
              $(this).prev("parent" + parentId); //works sometimes
      //OPTION B:
      var prevParentB = 
              $(this).prevAll("parent" + parentId).eq(0); //works all the time but ugly...
   }

}, "tr");

オプション Aは、直前のアイテムが同じ親を持つ場合にのみ機能しますが、そうでない場合は、望ましい結果prevParentA === []ではありません。
オプション Bは常に機能しているように見えますが、そのクラスに一致する以前のアイテムをすべて選択し、最初に見つかったアイテムを選択するという点で醜いです。

オプション Bよりも優れたオプションはありますか?

4

1 に答える 1

5

jQueryには、オプションBよりも優れたものはありません。私も定期的にこのようなものが欲しかったので、これは機能の欠如であると長い間考えていました。幸い、独自のメソッドを作成するのはそれほど難しくありません。

jQuery.fn.prevFind = function(selector) {
    var elems = [];
    this.each(function(i, item) {
        while (item = item.previousSibling) {
            if (item.nodeType == 1) {
                if ($(item).is(selector)) {
                    elems.push(item);
                    break;
                }
            }
        }
    });
    return(this.pushStack(elems, "prevFind", selector));
}

同じことが同様に行うことができますnextFind()

あなたの例では、これの代わりに:

$(this).prevAll("parent" + parentId).eq(0);

これを使用します:

$(this).prevFind("parent" + parentId)

そして、これが両方の実装であり、prevFind()いくつnextFind()かの一般的なコードを使用しています。

(function($) {

    $.each({
        'prevFind' : 'previousSibling',
        'nextFind' : 'nextSibling'
    }, function(method, dir) {

        $.fn[method] = function (selector) {

            var elems = [];

            this.each(function(i, item) {
                while (item = item[dir]) {
                    if (item.nodeType == 1) {
                        if ( $.find.matches(selector, [item]).length ) {
                            elems.push(item);
                            break;
                        }
                    }
                }
            });

            return this.pushStack(elems, method, selector);
        };
    });

}(jQuery));

これがフィドルです:http://jsfiddle.net/nDYDL/1/

于 2012-07-23T17:24:04.267 に答える