如何从事件目标最接近的(名称)获取元素

zum*_*mon 9 html javascript google-apps-script

我不确定如何使用事件目标,closest([name="..."])因为我理解closest()在更改输入字段中的值进行计算后应该获取元素,但我得到的元素是null

function calculate(e) {
    if (e.target.name == 'qty') {
      var elemPrice = e.target.closest('[name="price"]') //***
      var elemAmount = e.target.closest('[name="amount"]') //***
      console.log(elemPrice)
      console.log(elemAmount)
      elemAmount.value = elemPrice.value * e.target.value
    }
}
document.addEventListener('DOMContentLoaded',function(){
    document.getElementsByName('qty').forEach(t => { t.addEventListener('change',calculate) })
})
Run Code Online (Sandbox Code Playgroud)
<table>
      <tbody>
                <tr class="uk-hidden">
                    <td>1</td>
                    <td><input name="price"></td>
                    <td><input name="qty"></td>
                    <td><input name="amount"></td>
                </tr>
                <tr class="uk-hidden">
                    <td>2</td>
                    <td><input name="price"></td>
                    <td><input name="qty"></td>
                    <td><input name="amount"></td>
                </tr>
                <tr class="uk-hidden">
                    <td>3</td>
                    <td><input name="price"></td>
                    <td><input name="qty"></td>
                    <td><input name="amount"></td>
                </tr>
      </tbody>
</table>
Run Code Online (Sandbox Code Playgroud)

我试过了

   ...
      var elemPrice = e.target.parentElement.previousElementSibling.lastElementChild  //***
      var elemAmount = e.target.parentElement.nextElementSibling.lastElementChild  //***
   ...
Run Code Online (Sandbox Code Playgroud)

但我想做closest有没有办法做到这一点?

不管怎样,提前谢谢你

Mik*_*ans 18

阅读文档总是一个好主意。如果我们看一下https://developer.mozilla.org/en-US/docs/Web/API/Element/closest它说:

Closest ()方法遍历Element及其父节点(指向文档根),直到找到与提供的选择器字符串匹配的节点。将返回自身或匹配的祖先。如果不存在这样的元素,则返回null

所以它不会做你假设的事情:它只检查从你的元素到文档根的路径。您想要的是找到最接近的<tr>,然后找到name=price元素内部的元素:

e.target.closest(`tr`).querySelector(`[name=price]`)
Run Code Online (Sandbox Code Playgroud)