#javascript #jquery #jquery-events
Вопрос:
Я добавляю список дочерних дивов (карточек), просматривая массив. Я хочу создать прослушиватель onclick
событий для каждого дочернего div (карточки) родительского div (доски).
$.each(cardArray, function(i,value){
if(i<9){
var tCard = $('<div class="cardContainer" title="' cardArray[i]['name'] '" data-id="' i '">' cardArray[i]['damage'] '</div>')
$("#area_myCards").append(tCard)
}
});
$("#area_myCards > .cardContainer").on('click',cardClick())
<div id="area_myCards"></div>
но я не уверен, как узнать, на какой дочерний div был нажат, и передать его cardClick()
?
Я также собираюсь использовать идентификатор данных ребенка внутри cardClick()
, и я хотел бы знать, как это получить-должен ли я каким — то образом передать его функции в прослушивателе при нажатии или сделать это внутри функции?
Ответ №1:
Что-то вроде этого?
const cardArray = [
{name: 'A', damage: 'A-D'},
{name: 'B', damage: 'B-D'},
{name: 'C', damage: 'C-D'},
{name: 'D', damage: 'D-D'},
{name: 'E', damage: 'E-D'},
{name: 'F', damage: 'F-D'},
{name: 'G', damage: 'G-D'},
{name: 'H', damage: 'H-D'},
{name: 'I', damage: 'I-D'}
];
$.each(cardArray, function(i,value){
if(i<9){
var tCard = $('<div class="cardContainer" title="' cardArray[i]['name'] '" data-id="' i '">' cardArray[i]['damage'] '</div>')
$("#area_myCards").append(tCard)
}
});
$("#area_myCards > .cardContainer").on('click',e => cardClick(e.target))
const cardClick = (div) => {
$(div).toggleClass('clicked');
};
.cardContainer { margin: 2px; padding: 10px; border: 1px solid #eee; }
.cardContainer.clicked { background-color: red; }
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id="area_myCards"></div>
Ответ №2:
Предполагая, что cardClick()
это определено где-то еще, прежде всего, вы бы назвали это с $("#area_myCards > .cardContainer").on('click',cardClick)
(без скобок в конце).
Эта функция передаст событие в качестве своего первого аргумента (обычно вызываемого e
), и у события есть вызываемое свойство currentTarget
, которое можно использовать, чтобы увидеть, какой экземпляр был нажат.
Из MDN:
Свойство
currentTarget
только для чтения интерфейса события определяет текущую цель для события, когда событие проходит через DOM. Он всегда ссылается на элемент, к которому был прикреплен обработчик события, в отличие от Event.target, который идентифицирует элемент, на котором произошло событие и который может быть его потомком.
Таким образом, функция cardClick будет выглядеть примерно так:
const cardClick = (e) => {
const targetInstance = e.currentTarget;
// Do stuff with your specific card...
// To access data-id: targetInstance.getAttribute('data-id')
// or targetInstance.dataset.id
}