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

2020-12-08

这是一个非常常见的面试题,出题方式多样,但考察点相同,下面我们来看看这几种方法:

方法一:

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); 
    }
}

方法二:

复制代码
var itemli = document.getElementsByTagName("li");
 
for(var i = 0; i<itemli.length; i++){
    (function(n){
        itemli[i].onclick = function(){
            alert(n+itemli[n].innerHTML);  
        }
    })(i)
}
复制代码

方法三:

复制代码
var itemli = document.getElementsByTagName("li");

for(var i = 0; i<itemli.length; i++){
    itemli[i].onclick = function(n){
        return function(){
            alert(n+itemli[n].innerHTML);
        }
    }(i)
}
复制代码

方法四:

$("ul li").click(function(){
    var item = $(this).index();  //获取索引下标 也从0开始
    var textword = $(this).text();  //文本内容
    alert(item+textword);
})

上面这四种方法都可以实现循环绑定,但是我们知道,频繁的操作DOM是非常消耗性能的,如果有1000个li,怎么办呢?我们还有另一种思路,事件代理,又称事件委托。简单的来讲就是利用JS中事件的冒泡属性,把原本需要绑定的事件委托给父元素,让父元素担当事件监听的职务。下面我们来看看。

方法五(JS事件代理):

复制代码
var ul = document.querySelector("ul");
ulItem.onclick = function (e) {
    e = e || window.event; //这一行及下一行是为兼容IE8及以下版本
    var target = e.target || e.srcElement;
    if (target.tagName.toLowerCase() === "li") {
        var li = this.querySelectorAll("li");
        index = Array.prototype.indexOf.call(li, target);
        alert(target.innerHTML + index);
    }
}
复制代码

上述代码中,为什么需要 “index = Array.prototype.indexOf.call(li,target);” 这样使用数组的indexOf方法呢,这是因为querySelectorAll方法获取到的元素列表不是数组,和函数的arguments一样是一种类数组类型,不可以直接使用数组的方法。

方法六(jQuery事件代理):

$(document).ready(function () {
    $("ul").on("click", function (event) {
        var target = $(event.target);
        alert(target.html() + target.index())
    });
});

 

参考:https://blog.csdn.net/web_j/article/details/83900073?utm_medium=distribute.pc_relevant.none-task-blog-title-2&spm=1001.2101.3001.4242

posted @   秦时明月0515  阅读(1139)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示