继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

分析DOM绑定click事件无效及解决办法

墨色风雨
关注TA
已关注
手记 302
粉丝 75
获赞 351

在项目中我们经常会遇到给DOM元素绑定click事件无效的问题,在此记录一下我所遇到的原因及解决办法。同时也加深对js事件处理机制(事件冒泡、事件捕获)的理解。

1.事件在某处被解绑

对DOM事件解绑一般不会导致click失效,但是在以下的情况,click事件会失效:

$(function(){
    $("#btn").unbind();
})
$("#btn").click(function(){    //...});

由于$(function(){})是DOM元素加载完毕后执行的函数,因此函数外部的绑定click事件函数先与$(function(){})执行,在DOM元素加载完毕后对.button元素的监听事件进行解绑,所以点击事件失效,如果需要解绑事件,可以这样写:

$(function(){
    $("#btn").unbind();
    $("#btn").click(function(){
        alert("点击了我!");
    });
})

2.DOM元素是js动态加载、绑定事件的js文件是通过ajax异步加载的

这种情况DOM元素加载出来都需要一定的等待时间,在等待时间前对DOM元素添加事件是无效的。解决办法有两种:

1. 延迟DOM事件的添加时间
$(function(){
    setTimeout(function(){
        $("#btn").click(function(){            //...
        });
    },500)
})
2. 事件委托(事件代理)给父元素
$(function(){
    $(".parent").on("click","#btn",function(){        //...
    });
})

3.ajax异步加载的DOM元素

当需要用ajax载入某部分的html文件时,点击事件也会失效:一、可以在ajax执行成功的回调函数done()中添加事件;二、可以参照2中事件委托的方法。

4.点击a元素链接无跳转

这种情况可能有代码阻止了元素的默认行为导致无法跳转。

$(function(){
    $("a").on("click",function(e){
        e.preventDefault();        //...
    });
})

对事件进行解绑即可:

$(function(){
    $("a").on("click",function(e){
        e.preventDefault();        //...
    });
    $("a").unbind();
})

最后小结一下,涉及知识:事件绑定、事件监听、事件捕获、事件冒泡、事件代理(委托)、js执行顺序。



作者:Joydezhong
链接:https://www.jianshu.com/p/7d94839914aa

打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP