2013-07-26 77 views
1
$('.option').click(function(){ 
     $(this).addClass('selected'); 
     }); 
    $('.selected').click(function(){ 
     $(this).removeClass('selected'); 
     }); 

尝试删除选定的类时,我单击具有类(选定)的元素。如何删除类当我单击我想要删除的类

addClas工作,但删除没有。 :/

+0

您需要委派事件。 – pmandell

回答

3

您的问题是您将事件附加到尚未准备好接收该事件的元素。您应该将事件附加到父元素,然后您可以筛选.selected。这样,当你的可点击元素被添加时它并不重要,它可以工作。这被称为事件代表团。您正在将处理事件的任务委托给另一个元素。

您的JS:

$(document).on("click", ".selected", function() { 
    $(this).removeClass('selected'); 
}); 

$(document).on("click", ".option", function() { 
    $(this).addClass('selected'); 
}); 

如果您不需要在各个按钮不同的功能(我假设你会)你可以两者结合成这样:

$(document).on('click','.selected.option',(function() { 
    $(this).toggleClass('selected'); 
}); 

此外,当这样做,不要将其附加到树上太高的父级。您想将它附加到最近的可能父元素。我们不需要像document这样的点击事件,因为明确哪些元素会获得此事件是个不错的主意。将它附加到document将意味着任何具有.selected级别的元素都将可点击并响应相同的代码。如果您想在不同的按钮中使用不同的功能,则不能,因为它们都响应与document相同的代码。

+0

谢谢,现在我终于明白了。 :D – user1804119

+0

with'toggleClass'你不一定需要'.on()',你仍然可以使用'$('。option')。click(function(){$(this).toggleClass('selected') });'因为在这种情况下'.option'选择器不会改变(唯一的变化是是否存在'selected'类) – MikeM

+0

@MikeM yes你是对的,不需要委托那种情况。如果在处理程序之后引入'.option'元素,则会出现异常。 –

4

您可以使用toggleClass

$('body').on('click', '.option', function() { 
    $(this).toggleClass('selected'); 
}); 
+0

添加'.on()'代表团,这是最好的答案。 – DevlshOne

+0

在目标选择器中删除'.selected',我的不好 –

1
$('.option').on('click', function(){ 
    if(!$(this).hasClass("selected")) { 
     $(this).addClass('selected'); 
    } 
}); 
$('.selected').on('click', function(){ 
    $(this).removeClass('selected'); 
}); 

但是,你会得到最好的使用切换类的方法!