Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用jQuery重新注册事件_Jquery - Fatal编程技术网

使用jQuery重新注册事件

使用jQuery重新注册事件,jquery,Jquery,在我的一些项目中,我一直在通过jQuery添加新元素,我偶然发现了一个有点麻烦的问题 考虑以下几点: $('span.claim').click(function() { $(this).parent().html('<span class="unclaim">Unclaim</span>'): }); $('span.unclaim').click(function() { $(this).parent().html('<span class="

在我的一些项目中,我一直在通过jQuery添加新元素,我偶然发现了一个有点麻烦的问题

考虑以下几点:

$('span.claim').click(function() {
    $(this).parent().html('<span class="unclaim">Unclaim</span>'):
});

$('span.unclaim').click(function() {
    $(this).parent().html('<span class="claim">Claim</span>'):
});
$('span.claim')。单击(函数(){
$(this.parent().html('Unclaim'):
});
$('span.unclaim')。单击(函数(){
$(this.parent().html('Claim'):
});
下面的标记

<ul>
    <li><span class="claim">Claim</span></li>
    <li><span class="unclaim">Unclaim</span></li>
    <li><span class="claim">Claim</span></li>
    <li><span class="unclaim">Unclaim</span></li>
</ul>
  • 主张
  • 解开
  • 主张
  • 解开
不幸的是,在触发初始事件之后,不会处理后续事件

我意识到我可以完全重新构造并使用
.bind()
函数,但由于我的项目的复杂性,这并不完全可行


在创建新元素后,我如何在不放弃匿名函数的情况下重新绑定事件,或者这是否可能?

您可能想看看jQuery live events:

更新:

如上页所述:

从jQuery1.7开始,不推荐使用.live()方法。使用.on()来 附加事件处理程序。jQuery旧版本的用户应使用 .delegate()优先于.live()

备选案文1:

$('a.claim').click(function() {
    $(this).html('Unclaim').addClass('unclaim').removeClass('claim');
});

$('a.unclaim').click(function() {
    $(this).html('Claim').addClass('claim').removeClass('unclaim');
});
备选案文2:

function bindClaim(){
$('a.claim').unbind('click').click(function() {
    $(this).parent().html('<span class="unclaim">Unclaim</span>');
    bindUnclaim();
});
}

function bindUnclaim(){
$('a.unclaim').unbind('click').click(function() {
    $(this).parent().html('<span class="claim">Claim</span>');
    bindClaim();
});
}

bindClaim();
bindUnclaim();
函数bindClaim(){
$('a.claim')。解除绑定('click')。单击(函数(){
$(this.parent().html('Unclaim');
bindUnclaim();
});
}
函数bindUnclaim(){
$('a.unclaim')。解除绑定('click')。单击(函数(){
$(this.parent().html('Claim');
bindClaim();
});
}
bindClaim();
bindUnclaim();
备选案文3(建议):

无需绑定。

无需使用
.live()
或重新绑定此文件。您只需要一种方法:

$('.claim,.unclaim').click(function() {
    var claimed = $(this).hasClass('claim') ? 'Unclaim' : 'Claim';
    $(this).text(claimed).attr('class', claimed.toLowerCase());
});
例如:

clickBtn.on("click.claim", evt => {
    clickBtn.off("click.claim");
    });

+1-我不知道现场直播,这非常非常方便。这正是我需要的。谢谢有没有理由创建新的HTML元素而不是在单击时更改文本和类名?除了创建元素,还有很多事情要做。这只是一个正在发生的事情的简单例子,而不是字面意思。由于实际事件的复杂性,这不是一个真正可行的解决方案。给出的示例只是一个简单的示例;在每个事件中实际发生的事情要多得多。保持事件简单并根据目标应用方法(事件委派)仍然是一个好主意