Как получить атрибут данных элемента при нажатии на него или его дочерний элемент? - PullRequest
0 голосов
/ 12 декабря 2018

Я делаю Стол .

document.querySelector('table').addEventListener('click', (e) => {
  console.log(e.target);
  console.log(e.target.dataset.item);
})
td {
  padding: 8px;
  border: 1px solid black;
  background-color: blue;
}

span {
  background-color: red;
  padding: 4px;
}
<table>
  <tr>
    <td data-item="item1"><span>1</span></td>
    <td data-item="item2"><span>2</span></td>
    <td data-item="item3"><span>3</span></td>
    <td data-item="item4"><span>4</span></td>
    <td data-item="item5"><span>5</span></td>
  </tr>
</table>

Когда я нажимаю СИНИЙ ЧАСТЬ , я могу получить атрибут data-item.Но когда я нажимаю RED PART , я не могу.

Я хочу исправить это, если я нажму <span/> в <td/>, я хочу получить атрибут data-item из <td />.

Ответы [ 4 ]

0 голосов
/ 12 декабря 2018

Вы можете проверить наличие ключей в наборе данных для элемента, по которому щелкнули, и если у него есть некоторые свойства, используйте e.target, в противном случае поднимитесь на один уровень вверх e.target.parentNode:

document.querySelector('table').addEventListener('click', (e) => {
  var el = Object.keys(e.target.dataset).length ? 
           e.target: e.target.parentNode;
  console.log(el.dataset.item);
})
td {
  padding: 8px;
  border: 1px solid black;
  background-color: blue;
}

span {
  background-color: red;
  padding: 4px;
}
<table>
  <tr>
    <td data-item="item1"><span>1</span></td>
    <td data-item="item2"><span>2</span></td>
    <td data-item="item3"><span>3</span></td>
    <td data-item="item4"><span>4</span></td>
    <td data-item="item5"><span>5</span></td>
  </tr>
</table>
0 голосов
/ 12 декабря 2018

Попробуйте использовать closest в качестве дочернего тега вместо dataset.

document.querySelector('table').addEventListener('click', (e) => {
  console.log(e.target.closest("td").dataset.item);
})
td {
  padding: 8px;
  border: 1px solid black;
  background-color: blue;
}

span {
  background-color: red;
  padding: 4px;
}
<table>
  <tr>
    <td data-item="item1"><span>1</span></td>
    <td data-item="item2"><span>2</span></td>
    <td data-item="item3"><span>3</span></td>
    <td data-item="item4"><span>4</span></td>
    <td data-item="item5"><span>5</span></td>
  </tr>
</table>
0 голосов
/ 12 декабря 2018

Почему вы слушаете весь стол в первую очередь?

Слушаете только элементы "td":

let cells = document.getElementsByTagName('td');
for (var i=0; i < cells.length; i++) {
  let cell = cells[i];
  cell.addEventListener('click', (e) => {
    let element = e.target.nodeName;
    if (element === 'TD') {
      console.log(e.target.dataset.item);
    } else if (element === 'SPAN') {
      console.log(e.target.parentNode.dataset.item);
    }      
  });
}

Я не думаю, что установил слушателя на столимеет значение, потому что в вашем случае это не вызывает событие на столе в любом случае.

Некоторые стили для лучшей проверки:

table {
  background-color: orange;
  border-spacing: 10px;
}

https://jsfiddle.net/aleks351/p0b46wqs/6/

0 голосов
/ 12 декабря 2018

Проверьте, является ли имя выбранного элемента span, выберите его родительский элемент, используя parentNode свойство

document.querySelector('table').addEventListener('click', (e) => {
  var ele = e.target.nodeName == "SPAN" ? e.target.parentNode : e.target;
  console.log(ele.dataset.item);
})
td {
  padding: 8px;
  border: 1px solid black;
  background-color: blue;
}
span {
  background-color: red;
  padding: 4px;
}
<table>
  <tr>
    <td data-item="item1"><span>1</span></td>
    <td data-item="item2"><span>2</span></td>
    <td data-item="item3"><span>3</span></td>
    <td data-item="item4"><span>4</span></td>
    <td data-item="item5"><span>5</span></td>
  </tr>
</table>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...