如何获得父LI索引和子LI索引
How to get the parent LI index and the sub LI index
小提琴:http://jsfiddle.net/fyrx459k/
脚本:
$(function() {
$('.ul1 li').click( function(e) {
e.preventDefault();
var liIndex = $(this).index('li');
console.log(liIndex);
);
});
HTML:
<ul class="ul1" id="ul1">
<li><a href="">Test</a></li>
<li><a href="">Test2</a></li>
<li><a href="">Test3</a>
<ul class="ul2">
<li><a href="">Test3 - 1</a></li>
<li><a href="">Test3 - 2</a></li>
</ul>
</li>
<li><a href="">Test4</a>
<ul class="ul2">
<li><a href="">Test4 - 1</a></li>
<li><a href="">Test4 - 2</a></li>
</ul>
</li>
</ul>
如何修改脚本,使其具有以下内容:
- 当单击父LI (
Test#
)时,控制台将显示索引-例如,单击Test4
将输出3
(第四项) - 当点击子LI (
Test# - #
)时,它将显示父索引和子索引-例如,点击Test3 - 1
将输出2.0
(2是父LI, 0是第一个子LI)
这是一种方法:
$(function () {
$('.ul1 li').click(function (e) {
e.preventDefault();
e.stopPropagation();
var i = $(this).parentsUntil('#ul1').add(this).map(function () {
return this.tagName === 'LI' ? $(this).index() : null;
}).get().join('.');
});
});
使用$(this).parents("li")
的基本解决方案
$(function() {
$('.ul1 li').click(function(e) {
e.preventDefault();
e.stopPropagation();
var liIndex = "";
var $parents = $(this).parents("li");
if ($parents.length > 0)
liIndex += ($parents.index() + 1) + ".";
liIndex += ($(this).index() + 1);
alert(liIndex);
});
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<ul class="ul1" id="ul1">
<li><a href="">Test</a>
</li>
<li><a href="">Test2</a>
</li>
<li><a href="">Test3</a>
<ul class="ul2">
<li><a href="">Test3 - 1</a>
</li>
<li><a href="">Test3 - 2</a>
</li>
</ul>
</li>
<li><a href="">Test4</a>
<ul class="ul2">
<li><a href="">Test4 - 1</a>
</li>
<li><a href="">Test4 - 2</a>
</li>
</ul>
</li>
</ul>
我喜欢html5标签,所以检查一下这个解决方案是否有用。否则,您可以对ID或您喜欢的任何内容执行相同的操作。
function checkIndex(element) {
deepCheck(element, '');
}
function deepCheck(element, index) {
if($(element).data('index') && $(element).is('li')) {
var newIndex = '';
if(index.length === 0) {
newIndex = 'Element indexes: ' + $(element).data('index')
} else {
newIndex = index + ' - ' + $(element).data('index');
}
deepCheck($(element).parent(), newIndex);
} else if($(element).data('root')) {
alert(index);
} else {
deepCheck($(element).parent(), index)
}
}
$(document).ready(function() {
$('a').click(function(e) {
e.preventDefault();
checkIndex(this);
});
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<ul data-root="true" class="ul1" id="ul1">
<li data-index="1"><a href="#">Test</a></li>
<li data-index="2"><a href="#">Test2</a></li>
<li data-index="3"><a href="#">Test3</a>
<ul class="ul2">
<li data-index="1"><a href="#">Test3 - 1</a></li>
<li data-index="2"><a href="#">Test3 - 2</a></li>
</ul>
</li>
<li data-index="4"><a href="#">Test4</a>
<ul class="ul2">
<li data-index="1"><a href="#">Test4 - 1</a></li>
<li data-index="2"><a href="#">Test4 - 2</a></li>
</ul>
</li>
</ul>
使用parents('li')
检查被点击的li
是否有li
的祖先,.index()
确定li
的索引,.preventDefault()
阻止点击跟随链接,.stopPropagation
阻止事件冒泡。应该这样做:
$('#ul1 li').on('click', function(e) {
e.preventDefault();
e.stopPropagation();
var arr = [];
arr.push( $(this).index() );
!$(this).parents('li').length ||
arr.push( $(this).parents('li').index() );
console.log( arr.reverse().join('.') );
});
$(function() {
$('#ul1 li').on('click', function(e) {
e.preventDefault();
e.stopPropagation();
var arr = [];
arr.push( $(this).index() );
!$(this).parents('li').length ||
arr.push( $(this).parents('li').index() );
console.log( arr.reverse().join('.') );
});
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<ul class="ul1" id="ul1">
<li><a href="">Test</a></li>
<li><a href="">Test2</a></li>
<li><a href="">Test3</a>
<ul class="ul2">
<li><a href="">Test3 - 1</a></li>
<li><a href="">Test3 - 2</a></li>
</ul>
</li>
<li><a href="">Test4</a>
<ul class="ul2">
<li><a href="">Test4 - 1</a></li>
<li><a href="">Test4 - 2</a></li>
</ul>
</li>
</ul>
我建议返回false。它不需要同时使用preventDefault和stopPropagation,也不需要将事件存储在e中。
此外,一些更结构化的选择在这里会很有帮助。只有两种情况需要处理,一类为ul2的父元素存在和不存在的情况。在这种情况下,需要两个查询来确定父索引和与ul2元素相关的当前索引。如果不是,则只需要确定相对ul1索引。
我包含了一些额外的元素,以显示需要更有针对性的方法。
$(function(){
$('.ul1 li').click(function() {
var ul2 = $(this).closest('.ul2'),
location = ul2.length > 0 ?
ul2.parent().index('.ul1 > li')+"."+ul2.find('li').index(this) :
$(this).index('.ul1 > li');
log(location);
return false;
});
});
function log(msg){ $("#result").text(msg); }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<ul class="ul1" id="ul1">
<li><a href="">Test</a></li>
<li><a href="">Test2</a></li>
<li><a href="">Test3</a>
<ul class="ul2">
<li><a href="">Test3 - 1</a></li>
<li><a href="">Test3 - 2</a></li>
</ul>
</li>
<li><a href="">Test4</a>
<ul class="ul2">
<li><a href="">Test4 - 1</a></li>
<li><a href="">Test4 - 2</a></li>
</ul>
</li>
</ul>
<div id="result"></div>
相关文章:
- 名称输入的索引
- 在jQuery中获取表的行索引
- 测试索引值是否等于某个数字的倍数
- 循环遍历数组中的特定索引
- 按照选项卡索引的顺序循环一个jQuery选择
- 在JavaScript中通过索引从对象数组中获取值
- 使用CSS或js,使用动态选择器选择任意li的下一个元素
- 引导程序:在导航栏中,显示悬停在单个位置的基于Li Link的不同内容
- 更改li标记文本的Javascript
- 尝试在PHP中回显输入文本时出现未定义的索引错误
- 完全可链接的li元素
- 在索引.html和应用.js [node.js] 之间共享变量
- 如何为高图中的区域线创建z索引
- 如何在一个索引不等于2的ul中获取li,我知道如何获得索引gt或lt 2
- 如何查找列表项的索引 (ul-li)
- JavaScript在ul中查找li索引
- jquery选择器:如何从某个索引到末尾选择所有li项
- 如何通过在ul中的索引将类设置为li标记
- 如何获得父LI索引和子LI索引
- 为什么我不能得到这个li的索引?