简体   繁体   English

如何使用jQuery:不是一次选择多个元素

[英]How to use jQuery :not selector for more than one element at a time

I want to use the jquery :not selector in such a way that when a bunch of elements don't have a specified class, then i want to add a class to one of them. 我想使用jquery:not selector这样一种方式,当一堆元素没有指定的类时,我想在其中一个类中添加一个类。

What I want to achieve is: 'when design-preview1, design-preview2 design-preview 3 and design-preview 4 do not have the class "selected", add class "selected" to "design-preview1" '. 我想要实现的是:'当design-preview1,design-preview2 design-preview 3和design-preview 4没有“selected”类时,将“selected”类添加到“design-preview1”'。

I tried this but it is not working: 我试过这个,但它不起作用:

   $(".design-preview1, .design-preview2, .design-preview3, .design-preview4").not(".selected").$(".design-preview1").addClass('selected');
    });

Any help would be highly appreciated 任何帮助将受到高度赞赏

New

This is my full jQuery code: 这是我的完整jQuery代码:

$('.pop-design1').click(function(){
            $(".design-preview li:not(.design-preview2).selected").removeClass('selected');
            $(".design-list li:not(.design-list2).selected").removeClass('selected');
            $(".design-preview2").toggleClass('selected');
            $(".design-list2").toggleClass('selected');
            $(".overlay").toggle();
        });
        $('.pop-design2').click(function(){
            $(".design-preview li:not(.design-preview3).selected").removeClass('selected');
            $(".design-list li:not(.design-list3).selected").removeClass('selected');
            $(".design-preview3").toggleClass('selected');
            $(".design-list3").toggleClass('selected');
            $(".overlay").toggle();
        });
        $('.pop-design3').click(function(){
            $(".design-preview li:not(.design-preview4).selected").removeClass('selected');
            $(".design-list li:not(.design-list4).selected").removeClass('selected');
            $(".design-preview4").toggleClass('selected');
            $(".design-list4").toggleClass('selected');
            $(".overlay").toggle();
        });
        if ($('.design-preview1, .design-preview2, .design-preview3, .design-preview4').not('.selected').length) {
    $('.design-preview1').addClass('selected');


Basically what I want is that when .design-preview1, .design-preview2, .design-preview3 and .design-preview4 are not showing or are not selected, I want .design-preview1 to show by default. 基本上我想要的是当.design-preview1,.design-preview2,.design-preview3和.design-preview4未显示或未被选中时,我希望.design-preview1默认显示。
Live link: http://www.expertfrontend.com/test/2.html 实时链接: http //www.expertfrontend.com/test/2.html

:not is a little too simple for what you are trying to do, as you need to change the class of multiple elements, and not all the same way. :not对于你想要做的事情来说, :not有点过于简单,因为你需要改变多个元素的类,而不是以同样的方式。 So, you're going to need a few steps. 所以,你需要几个步骤。 Among other things, you need to use the .filter method to determine whether any of your tags have the selected class: 除此之外,您还需要使用.filter方法来确定您的任何标记是否具有selected类:

var group = ".design-preview1, .design-preview2, .design-preview3, .design-preview4",
    $group = $(group);

function doDefaultSelection() {
    if ($(".design-preview1, .design-preview2, .design-preview3, .design-preview4")
        .filter(".selected").length === 0) { // note use of .filter here
        $(".design-preview1").addClass('selected');
    }
}

doDefaultSelection();

$group.click(
    function() {
        $group.not(this).removeClass('selected');
        $(this).toggleClass('selected');
        doDefaultSelection();
    }
);

The default selector function ( doDefaultSelection ) selects all elements with your designated classes, picks only ones that have the selected class, and checks to see if there are any left. 默认选择器函数( doDefaultSelection )选择具有指定类的所有元素,仅selected具有selected类的元素,并检查是否有任何剩余元素。 If there are no matching elements, then it adds the selected class to the .design-preview1 element(s). 如果没有匹配的元素,则将selected类添加到.design-preview1元素中。

The click handler turns off the selected class for everything except for the clicked element, then toggles the class for the one you clicked on. 单击处理程序将关闭除所单击元素之外的所有内容的selected类,然后切换所单击的类的类。 It then sets the default again if necessary. 然后,如有必要,它会再次设置默认值。

Demo 演示

 var group = ".design-preview1, .design-preview2, .design-preview3, .design-preview4", $group = $(group); function doDefaultSelection() { if ($(".design-preview1, .design-preview2, .design-preview3, .design-preview4") .filter(".selected").length === 0) { $(".design-preview1").addClass('selected'); } } doDefaultSelection(); $group.click( function() { $group.not(this).removeClass('selected'); $(this).toggleClass('selected'); doDefaultSelection(); } ); 
 .selected { color: red; } 
 <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script> <p class="design-preview1">blah</p> <p class="design-preview2">blah</p> <p class="design-preview3">blah</p> <p class="design-preview4">blah</p> 

What I want to achieve is: when design-preview1, design-preview2 design-preview 3 and design-preview 4 do not have the class "selected", add class "selected" to "design-preview1" 我想要实现的是:当design-preview1,design-preview2 design-preview 3和design-preview 4没有“selected”类时,将“selected”类添加到“design-preview1”

As requested in your question, you said you want to use .not() to achieve this. 根据你的问题的要求,你说你想用.not()来实现这个目的。 Below is a way you can do this via the addSelectedClassIfNotExists() function. 以下是通过addSelectedClassIfNotExists()函数执行此操作的方法。

You can also refactor your click listeners, so you only run one defined function. 您还可以重构单击侦听器,因此您只能运行一个已定义的函数。 Below is what your modified code from your question could look like after the suggested changes: 以下是在建议的更改后,您的问题中修改后的代码可能如下所示:

var previews = $('.design-preview1, .design-preview2, .design-preview3, .design-preview4');

function addSelectedClassIfNotExists() {
    if (previews.not('.selected').length === previews.length) {
        $('.design-preview1').addClass('selected');
    }
}

function toggleClasses(num) {
    $('.design-preview li:not(.design-preview' + num + ').selected').removeClass('selected');
    $('.design-list li:not(.design-list' + num + ').selected').removeClass('selected');
    $('.design-preview' + num).toggleClass('selected');
    $('.design-list' + num).toggleClass('selected');
    $('.overlay').toggle();
}

previews.click(function () {
    toggleClasses(this.className.slice(-1));
    addSelectedClassIfNotExists();
});

If you want to check if none of them has the class selected then you can use a if condition and add the class to design-preview1 如果要检查它们是否都没有selected类,则可以使用if条件并将类添加到design-preview1

if (!$(".design-preview1, .design-preview2, .design-preview3, .design-preview4").hasClass('selected')) {
    $(".design-preview1").addClass('selected');
}

If you want to check whether all of them has the class then 如果你想检查是否所有人都有班级

if($(".design-preview1, .design-preview2, .design-preview3, .design-preview4").not('.selected').length){
    $(".design-preview1").addClass('selected');
}

You can use the not selector something like this: 你可以使用not选择器:

var elements = $("p[class^='design-preview']");
elements.each(function(para, i){
if(!$(para).hasClass('selected'))
{
   $(para).addClass('selected');
}
});

What I am doing here is selecting firstly all the para elements with the given class. 我在这里做的是首先选择给定类的所有para元素。 After that I apply the loop on the array of returned elements and check if the current element has the selected class. 之后,我在返回元素数组上应用循环,并检查当前元素是否具有selected类。 If it does not have the selected class we add else we don't add. 如果它没有所选的类我们添加其他我们不添加。

Hope this logic helps. 希望这个逻辑有所帮助

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM