jQuery:无法删除类

sor*_*u26 2 html javascript css jquery

我制作了一个喜欢/不喜欢的脚本,其工作方式如下:2个带有rate_deal课程的按钮.单击like或dislike按钮时,它会rate_deal从两个按钮中删除该类以防止再次单击,然后添加一些类以使其更好看.

我有个问题.我不知道我做错了什么但是rate_deal当我点击按钮时我无法删除这两个按钮的类.

这是代码:

HTML:

<div class="content_r_d_left_rate" id="deal-1">
<span class="rate_deal content_r_d_l_rate_img_up"></span>
<span class="rate_deal content_r_d_l_rate_img_down"></span>
</div>
Run Code Online (Sandbox Code Playgroud)

jQuery的:

$(".rate_deal").click(function(){

        var dealIdRaw = $(this).parent().attr('id');
        var dealId = dealIdRaw.replace('deal-', '');

        $('#'+dealIdRaw).children().removeClass('rate_deal');

        if($(this).hasClass('content_r_d_l_rate_img_up'))
        {
            $('#'+dealIdRaw+' > .content_r_d_l_rate_img_down').addClass('content_r_d_l_rate_img_down_i');
            $('#'+dealIdRaw+' > .content_r_d_l_rate_img_down').removeClass('content_r_d_l_rate_img_down');
        }
        else
        {
            $('#'+dealIdRaw+' > .content_r_d_l_rate_img_up').addClass('content_r_d_l_rate_img_up_i');
            $('#'+dealIdRaw+' > .content_r_d_l_rate_img_up').removeClass('content_r_d_l_rate_img_up');
        }
    });
Run Code Online (Sandbox Code Playgroud)

jfr*_*d00 5

您编写代码的方式存在结构性问题.当你这样做:

$(".rate_deal").click(function(){
Run Code Online (Sandbox Code Playgroud)

从现在开始,这将锁定那些用于点击处理程序的DOM对象,无论它们是否继续将rate_deal类附加到它们.因此,在结构上,删除类时不会删除单击处理程序.

您可以通过使用委托事件处理来解决该问题,如下所示:

$(".content_r_d_left_rate").on("click", ".rate_deal", function(){
Run Code Online (Sandbox Code Playgroud)

然后,当".rate_deal"类在单击的对象上时,这将仅触发单击处理程序.

这个块:

    var dealIdRaw = $(this).parent().attr('id');
    var dealId = dealIdRaw.replace('deal-', '');

    $('#'+dealIdRaw).children().removeClass('rate_deal');
Run Code Online (Sandbox Code Playgroud)

也可以替换为以下任何一个选项:

    $(this).siblings().add(this).removeClass("rate_deal");

    $(this).parent().find(".rate_deal").removeClass("rate_deal");

    $(this).closest(".content_r_d_left_rate").find(".rate_deal").removeClass("rate_deal");

    $(this).parent.children().removeClass("rate_deal");
Run Code Online (Sandbox Code Playgroud)

我更喜欢第三种变体,因为如果你稍微修改HTML,它最容易破坏.

整个简化代码块将是这样的:

$(".content_r_d_left_rate").on("click", ".rate_deal", function(){

    // get our common parent
    var parent = $(this).closest(".content_r_d_left_rate");

    // remove existing .rate_deal classes in this block    
    // so no more clicks get processed
    parent.find(".rate_deal").removeClass("rate_deal");

    // toggle classes based on what was clicked
    if($(this).hasClass("content_r_d_l_rate_img_up")) {
        parent.find(".content_r_d_l_rate_img_down")
            .addClass("content_r_d_l_rate_img_down_i")
            .removeClass("content_r_d_l_rate_img_down");
    } else {
        parent.find(".content_r_d_l_rate_img_up")
            .addClass("content_r_d_l_rate_img_up_i")
            .removeClass("content_r_d_l_rate_img_up");
    }
});
Run Code Online (Sandbox Code Playgroud)