• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

[javascript] Usuwanie klas zawartych w tablicy

Object Storage Arubacloud
0 głosów
174 wizyt
pytanie zadane 14 sierpnia 2019 w JavaScript przez 42savage Bywalec (2,630 p.)

Cześć i czołem podpowie ktoś jak poradzić sobie z tym problemem?

Otóż próbuje za pomocą pętli sprawdzić, czy dany div posiada jedną z klas zawartch w tablicy, jeżeli ma powinien usunąć divowi tą klase i przejść do kolejnego.

Problem jest taki, że kod tak jakby losowo usuwa klasy kilku divom, raz jednemu, raz trzem.

<div class="container">
    <div class="card"></div>
    <div class="card"></div>
    <div class="card"></div>
    <div class="card"></div>
    <div class="card"></div>
    <div class="card"></div>
    <div class="card"></div>
    <div class="card"></div>
    <div class="card"></div>
    <div class="card"></div>
    <div class="card"></div>
    <div class="card"></div>
</div>
.container{
    display: grid;
    grid-template-columns: 1fr 1fr 1fr 1fr ;
    grid-gap: 6px;
}
.card{
    background: black;
    width: 250px;
    height: 250px;
}

.darkcyan{
    background: darkcyan;
}
.crimson{
    background: crimson;
}
.blue{
    background: blue;
}
.yellowgreen{
    background: yellowgreen;
}
.pink{
    background: pink;
}
.azure{
    background: rgb(5, 129, 230);
}
.unactive{
    background: gray;
    position: relative;
}
.unactive::before{
    content: 'UNACTIVE';
    color: white;
    text-shadow: 0 0 2px black;
    position: absolute;
    top: 125px;
    left: 84px;
}
var colorList = ['darkcyan', 'crimson', 'blue', 'yellowgreen', 'pink', 'azure', 'darkcyan', 'crimson', 'blue', 'yellowgreen', 'pink', 'azure'];
var colors = ['darkcyan', 'crimson', 'blue', 'yellowgreen', 'pink', 'azure', 'darkcyan', 'crimson', 'blue', 'yellowgreen', 'pink', 'azure'];
var cards = [...document.querySelectorAll('.card')];

function randomColors(){
    cards.forEach( card=>{
        let randomValue = parseInt(Math.random() * colorList.length);
        card.classList.add(colorList[randomValue]);
        colorList.splice(randomValue, 1);
    })
}

function resetGame(){
    let i = 0;
    cards.forEach( card=>{
        let color = colors[i];
        while(card.classList.value.includes(color)){
            card.classList.remove(color);
            i++;
        }
    } )
}

Nie wiem czy to jasno opisałem ale celem jest usunięcie każdemu divowi klasy zawartej w tablicy colors.

3 odpowiedzi

+1 głos
odpowiedź 14 sierpnia 2019 przez Mati Gaduła (3,390 p.)
wybrane 14 sierpnia 2019 przez 42savage
 
Najlepsza

Musisz najpierw sprawdzać dla pojedynczej karty, czy nie posiada jakiejkolwiek klasy z listy colors. Jeżeli posiada to ją usuń. Ja to rozwiązałem tak, że zrobiłem foreacha po każdym kolorze i jeżeli zawiera któregoś z listy to usuwa daną klasę.

Tutaj jest rozwiązanie: https://jsfiddle.net/j2wq695f/2/

function resetGame(){
    cards.forEach(card=>{
    	colors.forEach(color => {
      	if(card.classList.contains(color)) {
        	card.classList.remove(color);
        }
      });
    });
}

 

komentarz 14 sierpnia 2019 przez 42savage Bywalec (2,630 p.)

Twój kod też nie działa do końca prawidłowo

komentarz 14 sierpnia 2019 przez Mati Gaduła (3,390 p.)

Jak to? Zobacz co jest w tablicy colors

var colors = ['crimson', 'azure', 'crimson', 'blue', 'yellowgreen', 'azure'];

nie ma kolory darkcyan i pink, stąd wynika, że określone kwadraty mają stale losowy kolor. Dodaj te kolory, które mają być usuwane do tablicy colors i wtedy skrypt będzie działał prawidłowo, jeżeli rozchodzi się o te 2 kolory.

komentarz 14 sierpnia 2019 przez 42savage Bywalec (2,630 p.)
Rzeczywiście, nie wiem jakim cudem tam zabrakło tych kolorów
0 głosów
odpowiedź 14 sierpnia 2019 przez pablop76 VIP (123,180 p.)

W tym przypadku dodajesz jako drugą klasę z kolorem. Więc wystarczy zrobić pętlę po elementach i usunąć drugą klasę.

function resetGame(){
 for(let i = 0; i < cards.length; i++ ){
	cards[i].classList.remove(cards[i].classList[1])
 }
}

 

komentarz 14 sierpnia 2019 przez 42savage Bywalec (2,630 p.)
A co w przypadku, gdy klasa z kolorem nie jest druga?
1
komentarz 15 sierpnia 2019 przez pablop76 VIP (123,180 p.)
<div class="container">
    <div class="card"></div>
    <div class="card"></div>
    <div class="card"></div>
    <div class="card"></div>
    <div class="card"></div>
    <div class="card"></div>
    <div class="card"></div>
    <div class="card"></div>
    <div class="card"></div>
    <div class="card"></div>
    <div class="card"></div>
    <div class="card"></div>
</div>
<button id="losowanie">losowanie kolorów</button>
<button id="reset">reset</button>
.container{
   display: flex;
	 flex-wrap: wrap;
	justify-content: center;
}
.card{
	  margin:5px;
    background: black;
    width: 50px;
    height: 50px;
}
 
.darkcyan{
    background: darkcyan;
}
.crimson{
    background: crimson;
}
.blue{
    background: blue;
}
.yellowgreen{
    background: yellowgreen;
}
.pink{
    background: pink;
}
.azure{
    background: rgb(5, 129, 230);
}
const colorList = ['darkcyan', 'crimson', 'blue', 'yellowgreen', 'pink', 'azure', 'darkcyan', 'crimson', 'blue', 'yellowgreen', 'pink', 'azure'];
var colors = ['darkcyan', 'crimson', 'blue', 'yellowgreen', 'pink', 'azure', 'darkcyan', 'crimson', 'blue', 'yellowgreen', 'pink', 'azure'];
var cards = [...document.querySelectorAll('.card')];
 
function randomColors(){
    cards.forEach( card=>{
        let randomValue = parseInt(Math.random() * colorList.length);
        card.classList.add(colorList[randomValue]);
        // colorList.splice(randomValue, 1);
    })
}

function resetGame(arr1,arr2){
	arr1.forEach(el1=>{
		arr2.forEach(el2=>el2.classList.remove(el1))
	})
}
document.getElementById('losowanie').addEventListener('click',()=>randomColors())
document.getElementById('reset').addEventListener('click',()=>resetGame(colorList,cards))

 

komentarz 15 sierpnia 2019 przez 42savage Bywalec (2,630 p.)
Podziękował :)
–1 głos
odpowiedź 14 sierpnia 2019 przez Wraith Gaduła (4,370 p.)

Musisz zrobic cos na zasadzie

classes = ['class1', 'class2', 'class3', 'class4'];

$( "card" ).each(function( index ) {  
  if(hasClass(index, classes[i])) {
   $(this).removeClass('card');
}
});

 

komentarz 14 sierpnia 2019 przez 42savage Bywalec (2,630 p.)
Póki co unikam jquery, chce się dobrze javascripta wyuczyć, żeby mi potem w frameworkach typu vue było łatwiej

Dasz rade napisać to w czystym js?

Podobne pytania

+1 głos
3 odpowiedzi 241 wizyt
pytanie zadane 16 listopada 2018 w JavaScript przez ptaku19 Użytkownik (800 p.)
+1 głos
2 odpowiedzi 555 wizyt
pytanie zadane 1 października 2021 w JavaScript przez Doge Gaduła (3,370 p.)
+1 głos
1 odpowiedź 499 wizyt
pytanie zadane 17 października 2020 w JavaScript przez poldeeek Mądrala (5,980 p.)

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...