行的 JavaScript 单击处理程序接收单元格作为目标

问题描述 投票:0回答:1

我有一个多列、多行的表。每行都有一个唯一的“数据索引”属性。我在每一行添加了一个单击事件侦听器。但是,当我单击该行时,我单击时恰好经过的单元格成为回调的目标。为了获得“data-index”属性,我必须使用

event.target.parentElement.getAttribute( "data-index" )

考虑一下...

<!DOCTYPE html>
<html>
  <body>
    <table>
      <tr data-index="0" onclick="handler(event)">
        <td>11</td><td>12</td><td>13</td>
      </tr>
      <tr data-index="1" onclick="handler(event)">
        <td>21</td><td>22</td><td>23</td>
      </tr>
      <tr data-index="2" onclick="handler(event)">
        <td>31</td><td>32</td><td>33</td>
      </tr>
    </table>

    <script>
      function handler ( event ) {
        console.log( event.target.innerText );
        console.log( event.target.getAttribute( "data-index" ) );
        console.log( event.target.parentElement.getAttribute( "data-index" ) );
      }
    </script>
  </body>
</html>

澄清一下;我对行感兴趣,而不是它的单元格。这是“拥有”数据属性的行,所以...

为什么事件目标是单元格而不是行? (没有单元格有事件侦听器。)至少,这是非常不直观的;我做错了什么吗?

javascript event-handling
1个回答
0
投票

请使用

event.currentTarget
代替。
target
是触发事件的元素(您无法单击该行,因为单元格位于其中并覆盖该行以防止直接单击)。

    <table>
      <tr data-index="0" onclick="handler(event)">
        <td>11</td><td>12</td><td>13</td>
      </tr>
      <tr data-index="1" onclick="handler(event)">
        <td>21</td><td>22</td><td>23</td>
      </tr>
      <tr data-index="2" onclick="handler(event)">
        <td>31</td><td>32</td><td>33</td>
      </tr>
    </table>

    <script>
      function handler ( event ) {
        console.log( event.currentTarget.innerText );
        console.log( event.currentTarget.getAttribute( "data-index" ) );
        console.log( event.currentTarget.parentElement.getAttribute( "data-index" ) );
      }
    </script>

© www.soinside.com 2019 - 2024. All rights reserved.