开发者社区 问答 正文

jquery怎么用undelegate去掉用delegate为动态创建元素绑定的事件?

其实是需要添加一次性事件,原本用one方法,就可以解决。

实现这样的功能,如:name为abc开始的a元素 第一次点击时输出它的内容

$("a[name^='abc']").one(function(
    console.log($(this).html());
));
但是one方法不支持动态创建的元素。所有用 delegate

$(document).delegate("a[name^='abc']","click",function(){
    console.log($(this).html());

    //这里我需要点击一次后 再删除此click绑定

    $(document).undelegate($(this),"click"); //这句不管用
    $(this).undelegate("click"); //也不管用

    //手册上说undelegate第一个参数需要指定一个单独的selector,
    //a[name^='abc']取到的是一个元素集,用它后会删除掉所有绑定。
    //没有被点过的也删除了。求解,我只需要被点一次后的元素删除click事件

})

展开
收起
小旋风柴进 2016-03-26 10:08:11 2304 分享 版权
1 条回答
写回答
取消 提交回答
  • 页面有多个 a[name=^'abc']的元素, 通过委托在document绑定了click事件,绑定成功,需要在点击一次后,再次点击不再触发事件;

    解决方法:

    1. 利用 $object.data()存储数据,判断是否被点击过;
    $(document).on('click', 'a[name^="abc"]', function(e) {   //委托,实现绑定click事件
                if (!$(this).data('clicked')) {   //判断是否已经被点击,
                                                  // 第一次点击因为 $(this).data('click')为 undefined 
                    linkClickHandler.call(this);  //调用处理函数
                    $(this).data('clicked', true); //设置  "已点击"
                }
    
                return false;   //返回false,阻止默认行为,因为 <a>自动跳转
            });
    
    
    function linkClickHandler() { // 事件处理函数
                // 函数中的this指向触发的元素 , 为 DomElement类型
                //TODO 
                console.log($(this).text());
            }
    2019-07-17 19:15:29
    赞同 展开评论