jQuery 异或选择器

jQuery XOR selector

我想从一组 div 中 select 所有包含特定属性的 div,然后 select 所有不包含任何属性的 div。

示例:

<div data-attr="1"></div>
<div data-attr="2"></div>
<div data-attr="3"></div>
<div data-attr="4"></div>
<div data-attr="5"></div>
var attrList = [3,4];

// I want to process every div containing attr 3 and 4
attrList.forEach(function(item){
    var div = $("[data-attr='"+item+"']");
    div.operation_here()
});

// but I also want to process the remaining divs that do not contain neither attr 3 and 4
/* HELP ME HERE - this would select divs with attr 1, 2 and 5 */

如何实现?

var $divs = $('div').filter(function() {
  // returns all divs with data-attr not equal 1 or 2 or 5
  return [1, 2, 5].indexOf(this.data('attr')) == -1;
});

HTML:

<div data-attr="2">not matched</div>
<div data-attr="5">not matched</div>
<div data-attr="6">matched</div>

循序渐进。首先,select全部div:

var $div = $('div[data-attr]');

那么,select你需要的:

var $valid_div = $div.filter(function(){
     return attrList.indexOf($(this).data('attr')) > -1;
});

现在您可以对 div 与您的变量进行匹配操作:

$valid_div.operation_here();

至select剩余div,可以使用.not():

var $invalid_div = $div.not($valid_div);
$invalid_div.operation_here();

给定一个元素列表,您可以使用 jQuery.not 从另一个选择器中排除这些元素

$(function(){
  
    // I want to process every div containing attr 3 and 4
   var divs = $('div[data-attr="3"], div[data-attr="4"]');      
   console.log(divs);  // logs 2
  
   var notDivs = $('div[data-attr]').not(divs);
   console.log(notDivs); // logs the other 3
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div data-attr="1"></div>
<div data-attr="2"></div>
<div data-attr="3"></div>
<div data-attr="4"></div>
<div data-attr="5"></div>