我有一个项目列表,其中包含不同的事件处理程序。

...
<li>
   <div class="item" data-id="1234">
     <h3>Item</h3>
     <div class="description">...</div>
     <ul class="lists">
        <li data-list-id="1">Add to list A<li>
        <li data-list-id="2">Add to list B<li>
        <li data-list-id="3">Add to list C<li>
     </ul>
     <button class="delete">delete</button>
   </div>
</li>
...
li 下的每个 .list 都注册了一个单击事件,如下所示:
function addToList(event){
   var id = event.target.getAttribute('data-id');
   var listId = event.target.parentNode.parentNode.getAttribute('data-id');
   // XHR stuff
}

这段代码没有问题,但 parentNode.parentNode 看起来真的很脆弱。
对于按钮将只有一个 parentNode 而对于更深的嵌套元素 parentNode^n

我想这是一个常见问题,有更强大的解决方案吗?
使用 jQuery 我会使用 $(target).parentNode('.item')
在没有 jQuery 的情况下,最好的方法是什么?

最佳答案

作为我项目的一部分,我总是编写自己的工具箱。当然,我可以使用 jQuery,但我会坚持使用我的精密工具包而不是大锤,谢谢!

考虑到这一点,看看这个:

function findParent(source,filter,root) {
    root = root || document.documentElement;
    while(source != root) {
        if( filter(source)) return source;
        source = source.parentNode;
    }
}

在您的情况下,您现在可以调用:
var listId = findParent(
        event.target,
        function(e) {return e.attributes && e.attributes['data-id'];}
    ).getAttribute("data-id");
// note that you should probably break that down, checking if an element
// is found before getting its attribute value... or let the error
// kill your script. Either works.

现在,它看起来确实比简单的 .parentNode.parentNode 更困惑,但它更健壮,因为它不依赖于某个数字的深度,我相信这就是您的目标。

关于javascript - 如何防止 parentNode 疯狂?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23779076/

10-11 23:52