使用jQuery的.not()数组

时间:2013-05-21 14:57:27

标签: jquery arrays

我正在学习的是如何在jQuery中使用带有.not()的数组。我的代码如下。你知道为什么.item-ii没有被排除在选择之外吗?提前谢谢!

<ul class="level-1">
  <li class="item-i">I</li>
  <li class="item-ii">II
    <ul class="level-2">
      <li class="item-a">A</li>
      <li class="item-b">B
        <ul class="level-3">
          <li class="item-1">1</li>
          <li class="item-2">2</li>
          <li class="item-3">3</li>
        </ul>
      </li>
      <li class="item-c">C</li>
    </ul>
  </li>
  <li class="item-iii">III</li>
</ul>
<script>
    var temp = new Array();
    temp[0] = '.item-ii';
    console.log(temp);
    $('li').not(temp).css('background', 'red');
</script>

3 个答案:

答案 0 :(得分:8)

如果您需要排除temp数组中的所有选择器,您可以执行以下操作:

$('li').not(temp.join(',')).css('background', 'red');

例如,如果temp = ['.item-ii', '.item-i'],则上述内容将等同于:

$('li').not('.item-ii,.item-i').css('background', 'red');

答案 1 :(得分:0)

因为你需要指定数组元素,而不是整个数组。

$('li').not(temp[0]).css('background', 'red');

<强> jsFiddle example

更新:

要使用多个元素执行此操作,请尝试(请注意删除数组中类名称之前的句点):

 var temp = new Array();
 temp[0] = 'item-ii';
 $('li').not(function () {
     return ($.inArray($(this).attr('class'), temp) > -1);
 }).css('background', 'red');

<强> jsFiddle example

答案 2 :(得分:0)

回答你的问题&#34; 你知道为什么.item-ii没有被排除在选择之外吗?&#34;

当您将数组作为选择器提供时,jQuery使用$.grep() ...

.not()

not: function( selector ) {
    return this.pushStack( winnow(this, selector, false), "not", selector);
},

winnow()

function winnow( elements, qualifier, keep ) {

    // Can't pass null or undefined to indexOf in Firefox 4
    // Set to 0 to skip string check
    qualifier = qualifier || 0;

    if ( jQuery.isFunction( qualifier ) ) {
        return jQuery.grep(elements, function( elem, i ) {
            var retVal = !!qualifier.call( elem, i, elem );
            return retVal === keep;
        });

    } else if ( qualifier.nodeType ) {
        return jQuery.grep(elements, function( elem ) {
            return ( elem === qualifier ) === keep;
        });

    } else if ( typeof qualifier === "string" ) {
        var filtered = jQuery.grep(elements, function( elem ) {
            return elem.nodeType === 1;
        });

        if ( isSimple.test( qualifier ) ) {
            return jQuery.filter(qualifier, filtered, !keep);
        } else {
            qualifier = jQuery.filter( qualifier, filtered );
        }
    }

    return jQuery.grep(elements, function( elem ) {
        return ( jQuery.inArray( elem, qualifier ) >= 0 ) === keep;
    });
}

...将DOM节点与您的字符串进行比较 - 当然必须失败:)

所以你必须添加应排除的DOM元素,而不仅仅是它们的选择器。

var temp = $(".item-ii").map(function() {
        return this;
    });

Example

所以你应该更好地使用其中一个答案来获得你想要的效果:)