使用jQuery重新注册事件
在我的一些项目中,我一直在通过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="
$('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元素而不是在单击时更改文本和类名?除了创建元素,还有很多事情要做。这只是一个正在发生的事情的简单例子,而不是字面意思。由于实际事件的复杂性,这不是一个真正可行的解决方案。给出的示例只是一个简单的示例;在每个事件中实际发生的事情要多得多。保持事件简单并根据目标应用方法(事件委派)仍然是一个好主意