2015-04-26 9 views
8

Chcę użyć jquery: nie selektora w taki sposób, że gdy grono elementów nie ma określonej klasy, to chcę dodać klasa do jednego z nich.Jak używać jQuery: nie selektor dla więcej niż jednego elementu na raz

Co chcę osiągnąć to: "kiedy podgląd projektu 1, podgląd projektu 2 podgląd projektu 3 i podgląd projektu 4 nie mają klasy" wybrany ", dodaj klasę" wybrano "do" podgląd projektu-1 " ".

próbowałem tego, ale to nie działa:

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

Każda pomoc będzie bardzo mile widziane

Nowość

To mój pełny kod 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'); 


Zasadniczo to, czego chcę, to to, że gdy .design-preview1, .design-preview2, .design-preview3 i .design-preview4 nie są wyświetlane lub nie są wybrane, domyślnie powinienem wyświetlać .design-preview1.
żywo Link: http://www.expertfrontend.com/test/2.html

+0

Proszę zobaczyć moją odpowiedź i daj mi znać, jeśli to nie działa dla Ciebie. –

Odpowiedz

3

Co chcę osiągnąć jest: kiedy projekt-preview1, design-preview2 design-preview 3 i design-podgląd 4 nie mają klasę "wybrany", dodać klasę "wybrany" na „Design preview1 "

Zgodnie z twoim pytaniem, powiedziałeś, że chcesz użyć .not(), aby to osiągnąć. Poniżej znajduje się sposób, w jaki można to zrobić za pomocą funkcji addSelectedClassIfNotExists().

Można także refaktoryzować nasłuchiwaczy kliknięć, więc uruchamiasz tylko jedną zdefiniowaną funkcję. Poniżej jest to, co zmodyfikowany kod z pytaniem mógłby wyglądać po proponowanych zmian:

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(); 
}); 
+0

Próbowałem tego, ale nie osiągnęło to, czego chcę. Mam zaktualizowane pytanie z większą ilością szczegółów, sprawdź to. Wielkie dzięki –

+0

hmm .. nadal nie działa. Myślę, że od poprzedniego kodu mówi, że po kliknięciu usunąć .selected z .design-preview1, więc potrzebujemy skryptu, który mówi po dwukrotnym kliknięciu, powinien dodać go ponownie, co oznacza, że ​​dodanie skryptu do "zdarzenia" = mouseclick –

+0

nie działa. myślę, że potrzebujemy do tego innego sposobu myślenia. coś takiego jak "w każdej drugiej instancji kliknięć następujących przycisków" .pop-design1, pop-design2, .pop-design3 'dodaj klasę zaznaczoną do' design-preview1 ' –

1

Jeśli chcesz sprawdzić, czy żaden z nich nie ma klasę selected następnie można użyć warunku if i dodać klasę do design-preview1

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

Jeśli chcesz sprawdzić, czy wszystkie mają klasę, to

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

ma to więcej sensu. Niestety to nie działa: link na żywo: www.expertfrontend.com/test/2.html –

+0

@AlexZahir chcesz sprawdzić, czy wszystkie z nich ma klasę .... lub tylko jeden z nich ma klasę –

+0

@AlexZahir Jeśli chcesz sprawdzić wszystkie z nich .. to co zrobić, gdy 'preview3' nie ma, ale' preview1' ma już klasę –

9

:not jest trochę zbyt proste za to, co staramy się robić, co trzeba zmienić klasę wielu elementów, a nie w taki sam sposób. Będziesz potrzebować kilku kroków. Między innymi, trzeba użyć metody .filter celu ustalenia, czy któryś z tagów mieć klasę 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(); 
    } 
); 

Funkcja selektor domyślna (doDefaultSelection) wybiera wszystkie elementy ze swoimi wyznaczonych klas, wybiera tylko te, które mają klasa selected i sprawdza, czy zostały jeszcze jakieś.Jeśli nie ma pasujących elementów, dodaje klasę selected do elementu (-ów) .design-preview1.

Klasyfikacja kliknięć wyłącza klasę selected dla wszystkiego oprócz klikniętego elementu, a następnie przełącza klasę dla tej, którą kliknięto. Następnie w razie potrzeby ustawia ponownie wartość domyślną.

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>

+0

nie działa. myślę, że potrzebujemy do tego innego sposobu myślenia. coś takiego jak "w każdej drugiej instancji kliknięć następujących przycisków" .pop-design1, pop-design2, .pop-design3 "dodaj klasę zaznaczoną do" design-preview1 " –

+0

Jestem zdezorientowany, co próbujesz Dlaczego pytasz o co drugą instancję kliknięć? Jeśli chcesz przełączyć klasę, gdy ludzie klikną, oczywiście będziesz potrzebować dodatkowych skryptów, ale to nie jest jasne z twojego pytania. –

+0

Proszę sprawdzić ten link: http: // www.expertfrontend.com/test/2.html Po lewej stronie małe żółte kółka po kliknięciu pokazują różne obrazy/pola treści w obszarze ekranu, domyślnie wyświetla się obraz ekranu, ale gdy kliknięty jest widok pełnego projektu , ekran się ukrywa i pojawia się pełny obraz projektu, teraz jeśli ponownie klikniesz znak minus, to ukryje pełny obraz projektu Teraz chcę, aby obraz ekranu ponownie się wyświetlał. puste, co wygląda dość brzydko –

1

można użyć nie selektora coś takiego:

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

co robię tutaj wybierając najpierw wszystkie elementy para z danym klasa. Następnie stosuję pętlę w tablicy zwróconych elementów i sprawdzam, czy bieżący element ma klasę selected. Jeśli nie ma wybranej klasy, którą dodamy, nie dodajemy.

Mam nadzieję, że ta logika pomaga.

Powiązane problemy