单击元素或子元素时如何获取元素的数据属性

时间:2018-12-12 12:58:46

标签: javascript html onclick custom-data-attribute

我正在制作表格

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属性。但是,当我单击红色部分时,我不能。

我想修复它,如果我在<span/>中单击<td/>,我想从data-item获取<td />属性。

4 个答案:

答案 0 :(得分:1)

检查被单击元素的名称是否为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>

答案 1 :(得分:1)

尝试通过您的子标记而不是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>

答案 2 :(得分:0)

为什么首先要在整个桌子上听音乐?

仅侦听“ 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/

答案 3 :(得分:0)

您可以检查单击项的数据集中的键,如果它确实具有某些属性,请使用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>