如何在jquery中选择新元素?

时间:2014-11-01 23:39:17

标签: jquery

为什么我的警报不起作用?

$('.checkprice').click(function(el){      
    $(this).addClass('checkcheck');
});

$( '.checkcheck' ).on( "click", function() {
   alert('yes');
});

可能.checkcheck创建的时间比.on()更长?

我必须这样做吗?

2 个答案:

答案 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;
});