为什么我的警报不起作用?
$('.checkprice').click(function(el){
$(this).addClass('checkcheck');
});
$( '.checkcheck' ).on( "click", function() {
alert('yes');
});
可能.checkcheck创建的时间比.on()更长?
我必须这样做吗?
答案 0 :(得分:1)
jQuery将立即在所有匹配的元素上设置事件处理程序。例如,以下代码仅适用于在代码运行时将.checkcheck
作为类的任何元素,而不是将来某个时间:
$( ".checkcheck" ).on( "click", handleCheck );
如果该类在将来添加到元素中,则此处理程序将不会处理它的单击事件,因为它在$.fn.on
时没有该类原来叫。
解决此问题的最常用方法是利用事件委派,它利用JavaScript事件的冒泡性质。我们可以将一个处理程序直接放在所有.checkcheck
元素上,而不是在DOM树上放置一个:
$( document ).on( "click", ".checkcheck", handleCheck );
现在我们不关心在运行此脚本时元素是否有.checkcheck
作为类,我们只关心当事件冒泡到文档时它是否具有该类。这意味着我们可以为DOM添加全新的元素,并为其提供.checkcheck
类,并在点击时触发handleCheck
。
答案 1 :(得分:0)
正如罗宾所说,尝试类似于
的东西var checked = false;
$('.checkprice').click(function(){
$(this).addClass('checkcheck');
$(this).click(function(){
if ( checked == false ) {
alert('yes');
checked = true;
}
});
});
我也没有意识到one()
这个奇特的事件,并且无需检查变量并触发多个冗余事件。
$('.checkprice').click(function(){
$(this).addClass('checkcheck');
$(this).one('click', function(){
alert('yes');
});
});
如果您需要检查只能触发一次,那么one()
可用于这两个事件。
$('.checkprice').one('click.checkprice', function(){
$(this).addClass('checkcheck');
$(this).one('click', function(){
alert('yes');
});
});
你也可以像Jonathan提到的那样使用身体上的on()
代表团
var checked = false;
$('body').on('click', '.checkprice', function(){
$(this).addClass('checkcheck');
});
$('body').on('click', '.checkcheck', function() {
alert('yes');
checked = true;
});