$("li").click(function(event){
event.stopPropagation();
var list = $(this).closest("ul");
var children = list.children();
var values = [];
for(var i = 0; i < children.length; i++){
values.push(parseInt((children[i].getAttribute("data-weight") !== null) ? children[i].getAttribute("data-weight") : "0"));
}
var sum = 0;
for(var j = 0; j < values.length; j++){
sum += values[j];
}
$("#summed").html(sum);
});
li{
cursor: pointer;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<ul class="level-1 yes" data-weight="12" data-weight-total="0">
<li class="item-i" data-weight="22" >I</li>
<li class="item-ii" data-weight="4" data-weight-total="0">II
<ul class="level-2 yes" data-weight="12">
<li class="item-a" data-weight="1.4">A</li>
<li class="item-b" data-weight="128" data-weight-total="0">B
<ul class="level-3" data-weight="63" data-weight-total="0">
<li class="item-1" data-weight="54">1</li>
<li class="item-2" data-weight="23">2</li>
<li class="item-3" data-weight="107">3</li>
</ul>
</li>
<li class="item-c" data-weight="231">C</li>
</ul>
</li>
<li class="item-iii">III</li>
</ul>
<div id="summed"></div>
好的,让我们一步一步来解决这个问题。我们要做的第一件事是为每个“li”项目创建一个点击事件。如果单击 li 项目,我们将执行我们的函数(“function(event)”)。
第一行阻止事件传播。否则,jQuery 会上升到第一个“ul”项并执行每个“ul”元素的代码。我们会一直收到第一个列表。
http://api.jquery.com/event.stopPropagation/
然后我们得到最接近的“ul”元素并将其存储在变量“list”中。我们不想要列表本身,这就是我们将其子项(“li”元素)存储在变量“children”中的原因。
然后我们遍历每个孩子并将“数据权重”属性(方法“getAttribute”)存储在数组“values”中。请注意,我们仅在属性实际存在时才存储该属性。如果不是,我们只存储“0”。
https://developer.mozilla.org/en-US/docs/Web/API/Element/getAttribute
然后我们创建一个变量“sum”,它存储我们总结的属性。为此,我们遍历数组并将值 (+= values[j]) 添加到 sum 变量。
最后一步将 sum 变量写入 id 为 #summed 的 div 的 html 中(检查 html 部分)。
进一步阅读:
https://developer.mozilla.org/en-US/docs/Web/API/Element/getAttribute
http://api.jquery.com/closest/
http://api.jquery.com/click/
http://api.jquery.com/event.stopPropagation/
http://api.jquery.com/children/
http://www.sitepoint.com/shorthand-javascript-techniques/
http://api.jquery.com/html/
版本 2:
$("li").click(function(event){
event.stopPropagation();
var list = $(this).find("ul").first();
console.log(list);
var children = list.children();
var values = [];
for(var i = 0; i < children.length; i++){
values.push(parseInt((children[i].getAttribute("data-weight") !== null) ? children[i].getAttribute("data-weight") : "0"));
}
var sum = 0;
for(var j = 0; j < values.length; j++){
sum += values[j];
}
$("#summed").html(sum);
});
li{
cursor: pointer;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<ul class="level-1 yes" data-weight="12" data-weight-total="0">
<li class="item-i" data-weight="22" >I</li>
<li class="item-ii" data-weight="4" data-weight-total="0">II
<ul class="level-2 yes" data-weight="12">
<li class="item-a" data-weight="1.4">A</li>
<li class="item-b" data-weight="128" data-weight-total="0">B
<ul class="level-3" data-weight="63" data-weight-total="0">
<li class="item-1" data-weight="54">1</li>
<li class="item-2" data-weight="23">2</li>
<li class="item-3" data-weight="107">3</li>
</ul>
</li>
<li class="item-c" data-weight="231">C</li>
</ul>
</li>
<li class="item-iii">III</li>
</ul>
<div id="summed"></div>
请注意答案中的第三行。我已将其更改为:
var list = $(this).find("ul").first();
版本 3:
$("li").click(function(event){
event.stopPropagation();
var children = $(this).find("ul").first().children();
if(children.length === 0){
children = $(this);
}
console.log(children);
var values = [];
for(var i = 0; i < children.length; i++){
values.push(parseFloat((children[i].getAttribute("data-weight") !== null) ? children[i].getAttribute("data-weight") : "0"));
}
var sum = 0;
for(var j = 0; j < values.length; j++){
sum += values[j];
}
$("#summed").html(sum);
});
li{
cursor: pointer;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<ul class="level-1 yes" data-weight="12" data-weight-total="0">
<li class="item-i" data-weight="22" >I</li>
<li class="item-ii" data-weight="4" data-weight-total="0">II
<ul class="level-2 yes" data-weight="12">
<li class="item-a" data-weight="1.4">A</li>
<li class="item-b" data-weight="128" data-weight-total="0">B
<ul class="level-3" data-weight="63" data-weight-total="0">
<li class="item-1" data-weight="54">1</li>
<li class="item-2" data-weight="23">2</li>
<li class="item-3" data-weight="107">3</li>
</ul>
</li>
<li class="item-c" data-weight="231">C</li>
</ul>
</li>
<li class="item-iii">III</li>
</ul>
<div id="summed"></div>