首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从树上得到身份证

从树上得到身份证
EN

Stack Overflow用户
提问于 2014-12-01 15:19:26
回答 1查看 84关注 0票数 1

我有树结构:

代码语言:javascript
复制
<style>
.Container {
    padding: 0;
    margin: 0;
}

.Container li {
    list-style-type: none;
}

/* indent for all tree children excepts root */
.Node {
    margin-left: 18px;
    zoom: 1;

}

.IsRoot {
    margin-left: 0;
}
 
.ExpandOpen .Expand {
    background-image:      url(/tree_accordion/treeacc/pictures/minus.gif);
}
 
/* closed is higher priority than open */
.ExpandClosed .Expand {
    background-image: url(/tree_accordion/treeacc/pictures/plus.gif);
}
 
/* highest priority */
.ExpandLeaf .Expand {
    /* background-image: url(/tree_accordion/treeacc/pictures/leaf.gif); */
    background-image: none;
}

.Content {
    min-height: 18px;
    margin-left:18px;
}
* html  .Content {
    height: 18px;
}


.ExpandLoading   {
    width: 18px;
    height: 18px;
    float: left;
    background-image: url(/tree_accordion/treeacc/pictures/loading.gif);
}

.Expand {
    width: 18px;
    height: 18px;
    float: left;
}


.ExpandOpen .Container {
    display: block;
}

.ExpandClosed .Container {
    display: none;
}

.ExpandOpen .Expand, .ExpandClosed .Expand {
    cursor: pointer;
}
.ExpandLeaf .Expand {
    cursor: auto;
}

.Node input {
    width: 14px;
    height: 14px;
    float: left; 
    margin: 2px;
}
</style>

js

代码语言:javascript
复制
<script type="text/javascript">

function tree_toggle(event) {
    event = event || window.event
    var clickedElem = event.target || event.srcElement

    if (!hasClass(clickedElem, 'Expand')) {
        return;
    }

    // Node, onClick
    var node = clickedElem.parentNode
    if (hasClass(node, 'ExpandLeaf')) {
        return;
    }

    // new class for node
    var newClass = hasClass(node, 'ExpandOpen') ? 'ExpandClosed' : 'ExpandOpen'
    var re =  /(^|\s)(ExpandOpen|ExpandClosed)(\s|$)/
    node.className = node.className.replace(re, '$1'+newClass+'$3')
}


function hasClass(elem, className) {
    return new RegExp("(^|\\s)"+className+"(\\s|$)").test(elem.className)
}

</script>

html

代码语言:javascript
复制
<div onclick="tree_toggle(arguments[0])">
  <ul class="Container"><li class="Node ExpandClosed">
  <div class="Expand"> </div>
  <div class="Content">XXX</div>
       
                 <ul class="Container"><li class="Node ExpandClosed">
                   <div class="Expand"> </div>
                   <div class="Content">aaa</div>
                                  <ul class="Container"><li class="Node ExpandLeaf IsLast">
                                    <div class="Expand"> </div>
                                    <div class="Content"><label><input type="checkbox" id="1.1.1">a1</label></div>
                                  </li></ul>
                                  <ul class="Container"><li class="Node ExpandLeaf IsLast">
                                    <div class="Expand"> </div>
                                    <div class="Content"><label><input type="checkbox" id="1.1.2">a2</label></div>
                                  </li></ul>
                                  <ul class="Container"><li class="Node ExpandLeaf IsLast">
                                    <div class="Expand"> </div>
                                    <div class="Content"><label><input type="checkbox" id="1.1.3">a3</label></div>
                                  </li></ul>
                 </li></ul>
                 
                 <ul class="Container"><li class="Node ExpandClosed">
                   <div class="Expand"> </div>
                   <div class="Content">bbb</div>
                                  <ul class="Container"><li class="Node ExpandLeaf IsLast">
                                    <div class="Expand"> </div>
                                    <div class="Content"><label><input type="checkbox" id="1.2.1">b1</label></div>
                                  </li></ul>
                                  <ul class="Container"><li class="Node ExpandLeaf IsLast">
                                    <div class="Expand"> </div>
                                    <div class="Content"><label><input type="checkbox" id="1.2.2">b2</label></div>
                                  </li></ul>
                 </li></ul>
                                  
                 <ul class="Container"><li class="Node ExpandClosed">
                   <div class="Expand"> </div>
                   <div class="Content">ccc</div>
                                  <ul class="Container"><li class="Node ExpandLeaf IsLast">
                                    <div class="Expand"> </div>
                                    <div class="Content"><label><input type="checkbox" id="1.3.1">c1</label></div>
                                  </li></ul>
                 </li></ul>
                                  
  </li></ul>

  <ul class="Container"><li class="Node ExpandClosed">
  <div class="Expand"> </div>
  <div class="Content">YYY</div>
                 <ul class="Container"><li class="Node ExpandClosed">
                   <div class="Expand"> </div>
                   <div class="Content">ddd</div>
                                  <ul class="Container"><li class="Node ExpandLeaf IsLast">
                                    <div class="Expand"> </div>
                                    <div class="Content"><label><input type="checkbox" id="2.1.1">d1</label></div>
                                  </li></ul>
                                  <ul class="Container"><li class="Node ExpandLeaf IsLast">
                                    <div class="Expand"> </div>
                                    <div class="Content"><label><input type="checkbox" id="2.1.2">d2</label></div>
                                  </li></ul>
                 </li></ul>
  </li></ul>
</div>

我想获得单击列表元素的id。没有onClick到每个元素和JQuery。所以,我知道简单的结构:

代码语言:javascript
复制
<ul id="sss">
<li id="1.1.1"></li>
<li id="1.1.2"></li>
</ul>

作品:

代码语言:javascript
复制
var ul = document.getElementById('sss');

ul.addEventListener('click', function(e) {
if (e.target.tagName === 'LI'){
  alert(e.target.id);
}

});

我希望在点击复选框(或标签)收到我的id。例如: 1.1.1或1.1.2 .在构建树时,我可以从以下几个方面修改我的块:

代码语言:javascript
复制
<ul class="Container"><li class="Node ExpandLeaf IsLast">
  <div class="Expand"> </div>
  <div class="Content"><label><input type="checkbox" id="1.1.1">a1</label></div>
</li></ul>

代码语言:javascript
复制
<ul class="Container"><li class="Node ExpandLeaf IsLast" id="1.1.1">
  <div class="Expand"> </div>
  <div class="Content"><label><input type="checkbox">a1</label></div>
</li></ul>

但不能创建正确的功能。救命求你了。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-12-01 15:32:20

对于事件委托,重要的是找到一个正确的节点,因为事件会在DOM树上出现气泡。通常使用while循环。从e.target元素开始,然后检查它是否符合条件(CSS选择器、标记名等)。重复此操作,直到发现该事件发生在感兴趣的容器中(成功-句柄事件),或直到您到达主机元素(用于注册事件;在本例中不做任何操作)。然后搜索就结束了。

在你的例子中,情况会是这样的:

代码语言:javascript
复制
var ul = document.getElementById('sss');

ul.addEventListener('click', function (e) {
    var target = e.target;
    while (target !== ul) {
        if (target.tagName === 'LI') {
            alert(target.id);
            return;
        }
        target = target.parentNode;
    }
});

检查下面的演示。

代码语言:javascript
复制
var ul = document.getElementById('sss');

ul.addEventListener('click', function (e) {
    
    var target = e.target;
    
    // Label generates one more click event on the related input element, suppress one
    if (target.tagName === 'LABEL') {
        return;
    }
    
    while (target !== ul) {
        if (target.tagName === 'LI') {
            alert(target.id);
            return;
        }
        target = target.parentNode
    }
});
代码语言:javascript
复制
<ul class="Container" id="sss">
    <li class="Node ExpandLeaf IsLast" id="1.1.1">
        <div class="Expand">expand</div>
        <div class="Content">
            <label><input type="checkbox" />a1</label>
        </div>
    </li>
    <li class="Node ExpandLeaf IsLast" id="1.1.2">
        <div class="Expand">expand</div>
        <div class="Content">
            <label><input type="checkbox" />a2</label>
        </div>
    </li>
</ul>

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

https://stackoverflow.com/questions/27231505

复制
相关文章

相似问题

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