2

我正在尝试学习的是如何在 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>
4

3 回答 3

9

如果需要排除temp数组中的所有选择器,可以这样做:

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

例如,如果temp = ['.item-ii', '.item-i'],上面将等价于:

$('li').not('.item-ii,.item-i').css('background', 'red');
于 2013-05-21T15:00:34.950 回答
0

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

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

jsFiddle 示例

更新:

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

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

jsFiddle 示例

于 2013-05-21T15:00:15.663 回答
0

回答您的问题“您知道为什么 .item-ii 没有被排除在选择之外吗?

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

。不是()

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

簸()

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;
    });

例子

所以你最好使用其他答案之一来获得你想要的效果:)

于 2013-05-21T15:19:36.770 回答