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)
您编写代码的方式存在结构性问题.当你这样做:
$(".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)