• 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

VPS Starter Arubacloud
0 głosów
203 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,340 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,340 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 377 wizyt
pytanie zadane 16 listopada 2018 w JavaScript przez ptaku19 Użytkownik (800 p.)
+1 głos
2 odpowiedzi 757 wizyt
pytanie zadane 1 października 2021 w JavaScript przez Doge Gaduła (3,420 p.)
+1 głos
1 odpowiedź 566 wizyt
pytanie zadane 17 października 2020 w JavaScript przez poldeeek Mądrala (5,980 p.)

93,008 zapytań

141,975 odpowiedzi

321,256 komentarzy

62,350 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

Wprowadzenie do ITsec, tom 2

Można już zamawiać tom 2 książki "Wprowadzenie do bezpieczeństwa IT" - będzie to około 650 stron wiedzy o ITsec (17 rozdziałów, 14 autorów, kolorowy druk).

Planowana premiera: 30.09.2024, zaś planowana wysyłka nastąpi w drugim tygodniu października 2024.

Warto preorderować, tym bardziej, iż mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy dodatkowe 15% zniżki! Dziękujemy zaprzyjaźnionej ekipie Sekuraka za kod dla naszej Społeczności!

...