【问题标题】:How to get data attribute of element when click on it or it child单击元素或其子元素时如何获取元素的数据属性
【发布时间】:2018-12-12 21:39:28
【问题描述】:

我正在制作表格

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时,我不能。

我想修复它,如果我点击&lt;td/&gt;中的&lt;span/&gt;,我想从&lt;td /&gt;获取data-item属性。

【问题讨论】:

  • 你可以使用e.target.closest("[data-item]").dataset.item,如果supported

标签: javascript html onclick custom-data-attribute


【解决方案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】:

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

【讨论】:

  • 谢谢你的回答:)
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    你为什么一开始就听整张桌子?

    只听“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/

    【讨论】:

    • 因为在我的表中,&lt;tbody /&gt; 是动态渲染的
    猜你喜欢
    • 2013-04-02
    • 2012-05-03
    • 2020-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-27
    • 1970-01-01
    • 2012-10-01
    相关资源
    最近更新 更多