首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在纯JavaScript中选择嵌套元素?

如何在纯JavaScript中选择嵌套元素?
EN

Stack Overflow用户
提问于 2020-05-13 01:02:26
回答 3查看 628关注 0票数 0

这可能是一件简单的事情,但我正在为如何在单击事件上瞄准一个元素而奋斗。我让它与jQuery一起工作,但我想用纯JavaScript来实现它。基本上,我有一份清单:

代码语言:javascript
复制
  <ul class= 'my-todo-list'>
     <li id="todo-1" class="todo">
            <div class="actions">
                <a href="#" class="edit">Edit</a>
                <a href="#" class="delete">Delete</a>
            </div>
     </li>
     <li id="todo-2" class="todo">
            <div class="actions">
                <a href="#" class="edit">Edit</a>
                <a href="#" class="delete">Delete</a>
            </div>
     </li>
     <li id="todo-3" class="todo">
            <div class="actions">
                <a href="#" class="edit">Edit</a>
                <a href="#" class="delete">Delete</a>
            </div>
     </li>
  </ul>

我的JavaScript看起来是这样的:

代码语言:javascript
复制
 document.querySelector('.todo a.delete').addEventListener('click', function(e){
    
    var listElement = this.parentNode.parentElement;
    var todoId = listElement.getAttribute('id').replace('todo-','');
    alert(todoId);
 });

我想要的是,如果我点击一个删除链接,我应该看到id的待办事项。例如,如果我点击第二个删除链接,我应该提醒"todo-2“。

注意:我尝试过document.querySelector('.todo a.delete'),但也没有成功。

使用jQuery的简单解决方案是

代码语言:javascript
复制
 $('.todo a.delete').live('click', function(){......})

但我想用纯JavaScript来做。我怎么能这么做?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-05-13 01:13:55

可以在ul元素上添加事件侦听器,并检查触发单击事件的元素是否包含delete类。如果是,则从包装触发事件的特定元素的li元素中获取li属性。

代码语言:javascript
复制
const $ul = document.querySelector('ul');

$ul.addEventListener('click', (e) => {
  if (e.target.matches('a.delete')) {
    const li = e.target.parentElement.parentElement;
    const id = li.getAttribute('id');
    alert(id);
  }
});
代码语言:javascript
复制
<ul>
     <li id="todo-1" class="todo">
            <div class="actions">
                <a href="#" class="edit">Edit</a>
                <a href="#" class="delete">Delete</a>
            </div>
     </li>
     <li id="todo-2" class="todo">
            <div class="actions">
                <a href="#" class="edit">Edit</a>
                <a href="#" class="delete">Delete</a>
            </div>
     </li>
     <li id="todo-3" class="todo">
            <div class="actions">
                <a href="#" class="edit">Edit</a>
                <a href="#" class="delete">Delete</a>
            </div>
     </li>
  </ul>

票数 4
EN

Stack Overflow用户

发布于 2020-05-13 01:15:06

您可以使用querySelectorAllmap将事件映射为

代码语言:javascript
复制
[...document.querySelectorAll('.todo a.delete')].map((item) => {
    item.addEventListener('click', function(e){

    var listElement = this.parentNode.parentElement;
    var todoId = listElement.getAttribute('id').replace('todo-','');
    alert(todoId);
    })
 });

代码语言:javascript
复制
[...document.querySelectorAll('.todo a.delete')].map((item) => {
    item.addEventListener('click', function(e){

    var listElement = this.parentNode.parentElement;
    var todoId = listElement.getAttribute('id').replace('todo-','');
    alert(todoId);
    })
 });
代码语言:javascript
复制
<ul class= 'my-todo-list'>
     <li id="todo-1" class="todo">
            <div class="actions">
                <a href="#" class="edit">Edit</a>
                <a href="#" class="delete">Delete</a>
            </div>
     </li>
     <li id="todo-2" class="todo">
            <div class="actions">
                <a href="#" class="edit">Edit</a>
                <a href="#" class="delete">Delete</a>
            </div>
     </li>
     <li id="todo-3" class="todo">
            <div class="actions">
                <a href="#" class="edit">Edit</a>
                <a href="#" class="delete">Delete</a>
            </div>
     </li>
  </ul>

票数 1
EN

Stack Overflow用户

发布于 2020-05-13 01:49:14

有时,当没有传播时,使用事件目标可能无法工作。下面是我制作的一个脚本,它在所有浏览器中都是100%工作的,而且使用起来也很容易:

(It works even with dynamic elements just like jQuery)

代码语言:javascript
复制
// Advanced custom dynamic real time event handler listener supported 100% cross-browsers
String.prototype.addRTListener = function(events, renderingFunction){
    let selectors = this.toString();
    events = events.trim().split(' ');
    for(let even of events){
        even = even.trim();
        if(even.length>0){
            switch(even){
                case "focus":
                    even = "focusin";
                break;
                case "blur":
                    even = "focusout";
                break;
            }
            document.addEventListener(even, function(e){
                const path = e.path;
                document.querySelectorAll(selectors).forEach(function(element){
                    for(let target of path){
                        if( target == element ){
                            if( renderingFunction && typeof renderingFunction == "function" ){
                                renderingFunction(target, e);
                            }
                            break;
                        }
                    }
                });
                return;
            });
        }
    }
    
}
代码语言:javascript
复制
<button id="testBtn">Click Me</button>

<script>

// We can add DOMContentLoaded eventListener just in case our script loads after the DOM other wise you could always load your script before and it should work just like a charm
document.addEventListener('DOMContentLoaded', ()=>{

  // it supports multiple events too
  "#testBtn".addRTListener('focus dblclick', (target, e)=>{
    console.log( target ); 
  });
  
});

</script>

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61764615

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档