利用js输出ul下li的index索引值

<!DOCTYPE html>
<html>
	<head>
	 	<meta charset="UTF-8">
	    <title>打印索引</title>
	</head>
	<style type="text/css">
		li{background: pink;margin-bottom: 10px;height: 40px;}
	</style>
	<body>
                <ul>
		    <li>click</li>
		    <li>click</li>
		    <li>click</li>
		    <li>click</li>
		    <li>click</li>
		</ul>
	</body>
	<script>
            var nodeList = document.getElementsByTagName(‘li‘);
	    for (var i = 0; i < nodeList.length; i++) {
	       nodeList[i].addEventListener("click", function(e) {
	            console.log(i)
	        }, false);
	    }
        </script>
</html> 

  上面代码会和我们预期的结果不应,每次点击输出的都是最后一个元素的索引。
  function(e){}的匿名函数,在执行时,每一个都会创建一个新的作用域。这些匿名函数不会立即执行,仅仅是被定义,只有在点击时才执行,被当做参数传入addEventListener函数。所以在执行时i的值已经变为最后一个索引值。

  要解决这个问题,我们可以用以下几种方案:

方案1----使用闭包;

<script>
    var nodeList = document.getElementsByTagName(‘li‘);
       for (var i = 0; i < nodeList.length; i++) {
        (function(j){
            nodeList[j].addEventListener("click", function(e) {
               console.log(j);
            }, false);
        })(i) ;
    }
</script>

方案2-----使用es6中let的块级作用域;

<script>
    var nodeList = document.getElementsByTagName(‘li‘);
    for (let i = 0; i < nodeList.length; i++) {
       nodeList[i].addEventListener("click", function(e) {
            console.log(i)
        }, false);
    }
</script>

方案3----利用事件委托机制;

  如果li较少的话,利用上面方式实现是可以的,但是如果li的数量过多,为每个li添加事件侦听就会对页面性能产生很大的影响,我们可以采用委托实现。 利用Array.prototype.slice.call(nodeList)的作用是将具有length属性的元素转为数组,这样可利用indexOf方法获取li的索引值。

<script>
    var nodeList = document.getElementsByTagName(‘li‘);
    arrNodes = Array.prototype.slice.call(nodeList);
    nodeUls = document.getElementsByTagName(‘ul‘);
    nodeUls[0].addEventListener("click",function(event){
        var event = event || window.event;
        var target = event.target || event.srcElement;
        console.log(arrNodes.indexOf(target))
    },false);
</script>

方案4-----使用虚拟属性;

<script>
    var nodeList = document.getElementsByTagName(‘li‘);
    for(var i=0; i< nodeList.length; i++){
        nodeList[i].index = i;
        nodeList[i].addEventListener("click",function(e){
            console.log(this.index)
        },false)
    }
</script>

方案5----利用自定义属性;

  ul>li结构中给li标签加上自定义属性

<ul>
    <li data-index="0">click</li>
    <li data-index="1">click</li>
    <li data-index="2">click</li>
    <li data-index="3">click</li>
    <li data-index="4">click</li>
</ul>

  然后js代码如下

<script>
    var nodeList = document.getElementsByTagName("li");
    for(var i=0; i<nodeList.length ; i++){
        nodeList[i].addEventListener("click",function(e){
            console.log(e.target.dataset.index);//自定义属性用data-index格式的,可以使用dataset获取;
           console.log(this.getAttribute("data-index"));
        },false)
    }
</script>

  

时间: 2024-08-10 21:29:35

利用js输出ul下li的index索引值的相关文章

Jquery和JS获取ul中li标签

js 获取元素下面所有的li var content=document.getElementById("content"); var items=content.getElementsByTagName("ul"); var itemss=items[2].getElementsByTagName("li");//获取第二个li标签 或 var div=document.getElementById('a'); var ul=div.childN

利用js取到下拉框中选择的值

现在的需求是:下拉框中要是选择加盟商让其继续选择学校,要是选择平台管理员则不需要选择学校.隐藏选择下拉列表. 选择枚举值: /// <summary> /// 平台角色 /// </summary> public enum AdministratorRole { [Display(Name = "平台管理员")] PlatformAdministrator = 1, [Display(Name = "加盟商")] JoiningTrader

鼠标滑过,解决ul下 li下a的背景与父级Li不同宽的问题

我们在写导航或者页面有超链接的地方,有一些是需要超链接的背景和Li的宽度一样的.但是,却没有达到这种效果?为什么? 我们做的效果图:如下 期望的效果:如下 出现这样的原因:由于a是个行内元素,它没有宽高这种概念,a的大小全凭内容撑,所以,为了解决这个问题我们给a这标签加一个display:block;样式,这样就可以达到目的. 样式表 还有一个小技巧,我们在给li前面自定义小图标时候,发现图标离文字特别近,有重合的现象,我们这时候,就可以给li加一个内填充,padding-left:20px:

JS如何给ul下的所有li绑定点击事件,点击使其弹出下标和内容

这是一个非常常见的面试题,出题方式多样,但考察点相同,下面我们来看看这几种方法:方法一: var itemli = document.getElementsByTagName("li"); for(var i = 0; i<itemli.length; i++){ itemli[i].index = i; //给每个li定义一个属性索引值 itemli[i].onclick = function(){ alert(this.index+this.innerHTML); } } 方

遍历ul下的li,点击弹出li的索引

首先我们需要一个html结构 <div > <ul> <li>a</li> <li>a</li> <li>a</li> <li>a</li> <li>a</li> </ul> </div> 我们遍历ul 下所有的li 并添加点击事件,一般我们会在for循环里面添加点击事件,但是结果和我们所期盼不一样,那么是为什么呢???? 接下来看看我们的

将一个ul下的li转移到另外一个ul里面 【appendTo】

<1> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>将一个ul下的li转移到另外一个ul里面</title> <script src="script/jquery-1.11.0.min.js" type="text/javascript"></script> <script type=&

JS动态增加删除UL节点LI及相关内容示例

<ul id="ul"> <li id=1>11111111111111111<a href="javascript:del(1);">del</a></li> <li id=2 >22222222222222222<a href="javascript:del(2);">del</a></li> <li id=3>333333

JS动态增加删除UL节点LI

JS如何动态增加删除UL节点LI及相关内容. <ul id="ul"> <li id=1>11111111111111111<a href="javascript:del(1);">del</a></li> <li id=2 >22222222222222222<a href="javascript:del(2);">del</a></li>

jqury控制&lt;ul&gt;下的&lt;li&gt;选中效果

这里是引用art-template模板的版本(具体不详说啦) css部分 .wk_res_ul li.active a ,.wk_res_ul li:hover a{    color: #f90 !important;} ---------------------------------------- html部分 <ul class="wk_res_ul fl_ul" style="border-bottom:none" id="subject_