2016-08-31 7 views
1

Как настроить таргетинг на правильный .card-элемент, даже если у него есть дети, которые нажали?Как переключить класс элемента между target и currentTarget?

< .card.animate - я хочу это

если currentTarget используется, он будет делать что-то вроде этого

wine_content.animate < - не то, что я хочу

или

< .card h4.animate - - Не то, что я хочу.

Редактировать: Я действительно искушаюсь, просто делаю цикл for и addListener на каждой карте из массива элементов. Это так неправильно?

var card = document.getElementById('wine_content'); 
 
    
 
    card.addEventListener("click", function (e) { 
 
     if (e.target !== e.currentTarget) { 
 
      e.target.classList.toggle('animate'); 
 
     } 
 
     e.stopPropagation() 
 
    }, false);
/********************/ 
 
/* WINE CARDS */ 
 
/********************/ 
 

 
#wine_content { 
 
    background-color: #e5e5e5; 
 
} 
 
.cards { 
 
    display: flex; 
 
    flex-wrap: wrap; 
 
} 
 

 
/* NOT WHAT I WANT */ 
 
.card h4.animate { 
 
    color: #F00; 
 
} 
 
/* EXACTLY WHAT I WANT no matter the node in the child family line.*/ 
 
.card.animate h4 { 
 
    color: #0F0; 
 
} 
 
.card { 
 
    flex-grow: 1; 
 
    flex-basis: 30em; 
 
    height: 150px; 
 
    margin: 0 10px; 
 
} 
 
.card-face { 
 
    background-color: #fff; 
 
}
<div class="content"> 
 
    <section id="wine_content"> 
 
     <div class="cards"> 
 
     <div class="card"> 
 
      <div class="card-face"> 
 
       <h4>The Prisoner</h4> 
 
       <p>Merlot</p> 
 
       <p>Diamond Peaks</p> 
 
      <p>2012</p> 
 
      </div> 
 
     </div> 
 
     <div class="card"> 
 
      <div class="card-face"> 
 
       <h4>The Prisoner</h4> 
 
       <p>Merlot</p> 
 
       <p>Diamond Peaks</p> 
 
      <p>2012</p> 
 
      </div> 
 
     </div> 
 
     <div class="card"> 
 
      <div class="card-face"> 
 
       <h4>The Prisoner</h4> 
 
       <p>Merlot</p> 
 
       <p>Diamond Peaks</p> 
 
      <p>2012</p> 
 
      </div> 
 
     </div> 
 
     <div class="card"> 
 
      <div class="card-face"> 
 
       <h4>The Prisoner</h4> 
 
       <p>Merlot</p> 
 
       <p>Diamond Peaks</p> 
 
      <p>2012</p> 
 
      </div> 
 
     </div> 
 
     <div class="card"> 
 
      <div class="card-face"> 
 
       <h4>The Prisoner</h4> 
 
       <p>Merlot</p> 
 
       <p>Diamond Peaks</p> 
 
      <p>2012</p> 
 
      </div> 
 
     </div> 
 
     <div class="card"> 
 
      <div class="card-face"> 
 
       <h4>The Prisoner</h4> 
 
       <p>Merlot</p> 
 
       <p>Diamond Peaks</p> 
 
      <p>2012</p> 
 
      </div> 
 
     </div> 
 
     <div class="card"> 
 
      <div class="card-face"> 
 
       <h4>The Prisoner</h4> 
 
       <p>Merlot</p> 
 
       <p>Diamond Peaks</p> 
 
      <p>2012</p> 
 
      </div> 
 
     </div> 
 
     
 
     </div> 
 
    </section> 
 
</div>

+0

Вы уже знаете о 'currentTarget', так почему бы вам не просто использовать его? 'e.currentTarget.classList.toggle ('animate');' или 'this.classList.toggle ('animate');' – Bergi

+0

Это не то, что я ищу. –

ответ

1

Выбор closest карты в храповой слушателя вы можете выбрать card, на котором вы думаете, что Нажать на можете взять его вперед из кода ниже.

Оставьте свой отзыв. Ура!

var card = document.getElementById('wine_content'); 
 

 
card.addEventListener("click", function(e) { 
 
    e.stopPropagation(); 
 
    var cardElement = closest(e.target, function(el) { 
 
    return el.classList.contains('card'); 
 
    }); 
 
    if (cardElement) 
 
    cardElement.classList.toggle('animate'); 
 
}, false); 
 

 
// getting the closest in the parent hierarchy 
 
// reference: http://stackoverflow.com/questions/22100853/dom-pure-javascript-solution-to-jquery-closest-implementation 
 
function closest(el, fn) { 
 
    while (el) { 
 
    if (fn(el)) return el; 
 
    el = el.parentNode; 
 
    } 
 
}
/********************/ 
 

 
/* WINE CARDS */ 
 

 
/********************/ 
 

 
#wine_content { 
 
    background-color: #e5e5e5; 
 
} 
 
.cards { 
 
    display: flex; 
 
    flex-wrap: wrap; 
 
} 
 
/* NOT WHAT I WANT */ 
 

 
.card h4.animate { 
 
    color: #F00; 
 
} 
 
/* EXACTLY WHAT I WANT no matter the node in the child family line.*/ 
 

 
.card.animate h4 { 
 
    color: #0F0; 
 
} 
 
.card { 
 
    flex-grow: 1; 
 
    flex-basis: 30em; 
 
    height: 150px; 
 
    margin: 0 10px; 
 
} 
 
.card-face { 
 
    background-color: #fff; 
 
}
<div class="content"> 
 
    <section id="wine_content"> 
 
    <div class="cards"> 
 
     <div class="card"> 
 
     <div class="card-face"> 
 
      <h4>The Prisoner</h4> 
 
      <p>Merlot</p> 
 
      <p>Diamond Peaks</p> 
 
      <p>2012</p> 
 
     </div> 
 
     </div> 
 
     <div class="card"> 
 
     <div class="card-face"> 
 
      <h4>The Prisoner</h4> 
 
      <p>Merlot</p> 
 
      <p>Diamond Peaks</p> 
 
      <p>2012</p> 
 
     </div> 
 
     </div> 
 
     <div class="card"> 
 
     <div class="card-face"> 
 
      <h4>The Prisoner</h4> 
 
      <p>Merlot</p> 
 
      <p>Diamond Peaks</p> 
 
      <p>2012</p> 
 
     </div> 
 
     </div> 
 
     <div class="card"> 
 
     <div class="card-face"> 
 
      <h4>The Prisoner</h4> 
 
      <p>Merlot</p> 
 
      <p>Diamond Peaks</p> 
 
      <p>2012</p> 
 
     </div> 
 
     </div> 
 
     <div class="card"> 
 
     <div class="card-face"> 
 
      <h4>The Prisoner</h4> 
 
      <p>Merlot</p> 
 
      <p>Diamond Peaks</p> 
 
      <p>2012</p> 
 
     </div> 
 
     </div> 
 
     <div class="card"> 
 
     <div class="card-face"> 
 
      <h4>The Prisoner</h4> 
 
      <p>Merlot</p> 
 
      <p>Diamond Peaks</p> 
 
      <p>2012</p> 
 
     </div> 
 
     </div> 
 
     <div class="card"> 
 
     <div class="card-face"> 
 
      <h4>The Prisoner</h4> 
 
      <p>Merlot</p> 
 
      <p>Diamond Peaks</p> 
 
      <p>2012</p> 
 
     </div> 
 
     </div> 
 

 
    </div> 
 
    </section> 
 
</div>

+0

Даже если это не работает, я уверен, что смогу заставить его работать с небольшим количеством изменений. Очень приятно с ближайшей функцией. Я проверю это завтра. Именно поэтому я использую чистую JS прямо сейчас. JQuery скучно :) –

+0

он будет работать. Позвольте мне знать завтра. :) – kukkuz

+0

Это был отличный ответ, и я узнал тонну. Я переписал его сегодня, и я публикую редактирование, потому что у меня все еще есть проблема. –

 Смежные вопросы

  • Нет связанных вопросов^_^