2011-12-07 45 views
3

我在创建一个抓取在之前的事件之后被修改过的选择器的jquery时遇到了问题。Jquery修改过的选择器类没有被拾起

例如,我有一些HTML看起来像这样:

<div class='1'>test</div> 

,如果我用下面单击它:

$(".1").click(function(){ 
    alert('found 1!'); 
    $(this).attr('class', '2'); 
}); 

警报的作品,当我检查的元素时,类已被切换为'2'

现在当我再次单击它时,使用以下内容:

$(".2").click(function(){ 
    alert('found 2!'); 
    $(this).attr('class', '1'); 
}); 

我还是会'找到1!'作为警报。

是我想不可能出于某种原因,我做错了,还是有一个更好的办法吗?谢谢!

+1

您应该使用[.removeClass()](http://api.jquery.com/removeclass/)/ [.addClass()](http://api.jquery.com/addclass/)来处理类。此外,CSS类名不能以数字开头([spec](http://www.w3.org/TR/CSS2/syndata.html#characters)) –

+0

并尝试使用.live()(http:// api。 jquery.com/live/)。 –

回答

4

您需要使用jquery .on()(或.delegate())功能绑定了动态更新元素的事件。

如以下代码,

$(".1").on("click", function(){ 
    alert('found 1!'); 
    $(this).attr('class', '2'); 
}); 

$(".2").on("click",function(){ 
    alert('found 2!'); 
    $(this).attr('class', '1'); 
}); 
+0

我会说“你应该使用.on()(或.delegate())”。由于.delegate()在1.4.2中添加,因此不应再提及.live(),因为它已被弃用。 –

+0

谢谢@DidierG。我不知道那件事。根据您的评论更新。 –

3

。点击()只在执行时结合。你正在寻找的是.live()或.on()。当你这样做

$(document).on("click", ".1", function() { 
    console.log('1 clicked'); 
    $(this).attr('class', '2'); 
}); 
$(document).on("click", ".2", function() { 
    console.log('2 clicked'); 
    $(this).attr('class', '1'); 
}); 
+0

'.live()'已被弃用,甚至不应该被提及 –

+0

这是事实,但如果他使用传统的jQuery,.on()将不可用。 – Interrobang

+0

'.delegate()'('.on()'的前身)被添加到1.4中,现在有点遗留;-) –

1

$(".1").click(function() 

您绑定到特定的DOM元素我会用。对(),jQuery的1.7语法。一旦受到约束,它就不再重要。事件处理程序绑定到对象本身。 jQuery执行此语句的方式是,它找到所有与class="1"对象的DOM对象,并在其上设置事件侦听器。

如果你想的事件处理程序来处理页面的动态变化,那么你需要使用jQuery的.live().delegate()(jQuery的1.6或之前)或jQuery的.on()(jQuery的1.7+)。