7

したがって、基本的に私のdivは次のように生成されます。

<div class="test className">content</div>
<div class="test className">content</div>
<div class="test className">content</div>
..
<div class="test className">content</div>

重複したdivを削除して、最後のdivのみを保持しようとしています。簡単なアイデアはありますか?ありがとう!

4

3 に答える 3

13

提供されたマークアップに基づく簡単なアイデア

var $div = $('div.test.className:contains(content)');

if ($div.length > 1) {
   $div.not(':last').remove()
}

しかし、私はそもそも重複を防ぎます。

編集filter:これは、と方法を使用した別の代替slice手段です:

$('.test.className').filter(function() {
    return this.textContent === 'content';
}).slice(0, -1).remove();

-1メソッドの2番目の引数として使用する上記のスニペット.sliceでは、セットの最後の要素は無視されます。

于 2012-12-09T20:06:14.700 に答える
7

このようなもの:

​$('.className').not(':last')​.remove();​​​​​​​​​​​​​

ですべてのdivを選択し.className、選択から最後のdivを削除し、divのコレクションを削除すると、最後のdivだけが保持されます。

デモ: http: //jsfiddle.net/j5728/

于 2012-12-09T20:02:48.850 に答える
1

オリジナル(以下の編集を参照)

Jan Dvorakが尋ねたように、要素が別の要素の複製であるとあなたが信じるプロパティはわかりませんが、以下は特に迅速ではありませんが、問題に対するより一般的な解決策です。

(function($) {
  $.fn.removeDuplicates = function() {
    var original = [];

    this.each(function() {
      var el = this, $el, isDuplicate;

      $.each(original, function() {
        $el = $(el);

        // check whichever properties 
        // you believe determine whether 
        // it's a duplicate or not
        if (el.tagName === this.tagName && 
            el.className === this.className && 
            el.id === this.id && 
            el.value === this.value && 
            el.href === this.href && 
            $el.html() === $(this).html()) {
          isDuplicate = true;
          $el.remove();
        }
      });

      if (!isDuplicate) {
        original.push(el);
      }
    });
  };
}(jQuery));

次のように使用します。

$('.test').removeDuplicates();

// .. or even
$('div').removeDuplicates();

// .. or even
$('.test.className').removeDuplicates();

ここに示すように、上記のすべてが期待どおりに機能するはずです

編集

これを書いてから数年が経ち、Node.isEqualNodeについて学びました。これを行うためのはるかにクリーンな方法が提供されるため、更新されたプラグインは次のようになります(そして元の要素をチェーンに対して返します)。

(function($) {
  'use strict';

  $.fn.removeDuplicates = function() {
    var $original = $([]);

    this.each(function(i, el) {
      var $el = $(el),
          isDuplicate;

      $original.each(function(i, orig) {
        if (el.isEqualNode(orig)) {
          isDuplicate = true;
          $el.remove();
        }
      });

      if (!isDuplicate) {
        $original = $original.add($el);
      }
    });

    return $original;
  };

}(jQuery));

実例をここに示します

于 2012-12-09T21:26:57.190 に答える