简体   繁体   English

jQuery-已读和未读项目

[英]jQuery - read and unread items

I have a click handler that changes the icon and adds an active class to the item. 我有一个click处理程序,可以更改icon并将active类添加到该项目。

The function works as intended except if the item proceeds a read item, it takes two clicks to fire instead of one. 该功能按预期工作,除了如果该项目继续read项目,则需要单击两次才能触发,而不是单击一次。

Why isn't the status changing on first click? 为什么第一次点击时状态没有变化?

 $(".activity__button").on("click", function(e) { e.stopPropagation(); e.preventDefault(); var icon = $(this).find("svg"); var status = $(this).attr("data-status"); if (status === "read") { $(this) .removeClass("activity__button--read") .attr("data-status", "unread"); icon.attr("data-icon", "envelope"); $(this) .closest(".activity__item") .removeClass("activity__item--read") .attr("data-status", "unread"); } else { $(this) .addClass("activity__button--read") .attr("data-status", "read"); icon.attr("data-icon", "envelope-open"); $(this) .closest(".activity__item") .addClass("activity__item--read") .attr("data-status", "read"); } }); 
 .activity__item { position: relative; height: 100px; width: 300px; border: 1px solid whitesmoke; margin-top: -1px; } .activity__button { cursor: pointer; width: 50px; height: 50px; display: flex; align-items: center; justify-content: center; border: 2px solid; font-size: 21px; } .activity__button svg { color: #f8971d; } .activity__button.activity__button--read svg { color: #47a877; } .activity__item--read { background: #fafafa !important; } 
 <script src="https://pro.fontawesome.com/releases/v5.8.1/js/all.js"></script> <link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.8.1/css/all.min.css" rel="stylesheet" /> <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <div> <div class="activity__item"> <div class="activity__button" data-status="unread"><i class="fas fa-envelope"></i> </div> </div> <div class="activity__item"> <div class="activity__button" data-status="unread"><i class="fas fa-envelope"></i> </div> </div> <div class="activity__item activity__item--read"> <div class="activity__button activity__button--read" data-status="read"> <i class="fas fa-envelope-open"></i> </div> </div> <div class="activity__item"> <div class="activity__button" data-status="unread"> <i class="fas fa-envelope"></i> </div> </div> </div> 

you don't need to check status and add/remove classes, just change your javascript code like this, it'll work: 您无需检查状态并添加/删除类,只需像这样更改您的javascript代码,即可使用:

$(document).ready(function () {
 $(document).on("click", '.activity__button', function (e) {
    e.stopPropagation();
    e.preventDefault();
    $(this).toggleClass('activity__button--read');
    if ($(this).hasClass('activity__button--read'))
        $(this).attr('data-status', 'read')
    else
        $(this).attr('data-status', 'unread')
 });
});

Rest all your code remains as is. 其余所有代码保持原样。 Try this 尝试这个

Because on the first click of the 4th element it will go into the first if statement. 因为在第四个元素的第一次单击上,它将进入第一个if语句。 (Since you set data-status = "read") (因为您设置了data-status =“ read”)

You are missing the necessary class (activity__button--read) to visually show that the element is indeed has been read. 您缺少必要的类(activity__button--read)以直观地显示该元素确实已被读取。

The script is actually triggered, you didn't see anything because it is removing nothing. 该脚本实际上是触发的,您什么也看不到,因为它什么也没删除。

Initial html class declaration was wrong in last element.That means missing class of read activity__item--read and activity__button--read in last envelope. 最初的html类声明在最后一个元素中是错误的,这意味着缺少最后一个信封中的read activity__item--readactivity__button--read That why its open only on second click 那就是为什么只在第二次点击时才打开

  1. For first click its added the class of to the element .Then second click applied the read status condition 第一次单击将其类添加到元素。然后第二次应用读取状态条件
  2. First two element is unread .last two element are read 前两个元素是unread后两个元素是read
  3. compare last two its a same status but missing read class in last one 比较最后两个,它们的状态相同,但是在最后一个中缺少读取类
  4. Change the status or add the read class to parent 更改status或将读取的类添加到父类

 $('.activity__button').on("click", function(e) { e.stopPropagation(); e.preventDefault(); var status = $(this).attr("data-status"); if (status === "read") { $(this) .removeClass("activity__button--read") .attr("data-status", "unread"); $(this) .closest(".activity__item") .removeClass("activity__item--read") .attr("data-status", "unread"); } else { $(this) .addClass("activity__button--read") .attr("data-status", "read"); $(this) .closest(".activity__item") .addClass("activity__item--read") .attr("data-status", "read"); } }); 
 .activity__item { position: relative; height: 100px; width: 300px; border: 1px solid whitesmoke; margin-top: -1px; } .activity__button { cursor: pointer; width: 50px; height: 50px; display: flex; align-items: center; justify-content: center; border: 2px solid; font-size: 21px; } .activity__button .fas:before { color: #f8971d; } .activity__button.activity__button--read .fas:before { content: "\\f2b6"; color: #47a877; } .activity__item--read { background: #fafafa !important; } 
 <link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.8.1/css/all.min.css" rel="stylesheet" /> <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <div> <div class="activity__item"> <div class="activity__button" data-status="unread"><i class="fas fa-envelope"></i> </div> </div> <div class="activity__item"> <div class="activity__button" data-status="unread"><i class="fas fa-envelope"></i> </div> </div> <div class="activity__item activity__item--read"> <div class="activity__button activity__button--read" data-status="read"> <i class="fas fa-envelope"></i> </div> </div> <div class="activity__item activity__item--read"> <div class="activity__button activity__button--read" data-status="read"> <i class="fas fa-envelope"></i> </div> </div> </div> 

data status for the last item was "read" so we have to double click on it.i have changed it to "unread" and updated the js code too. 最后一项的数据状态为“已读”,因此我们必须双击它。我已将其更改为“未读”并更新了js代码。 please look at the code it works fine 请看一下能正常工作的代码

 $('.activity__button').on("click", function(e) { e.stopPropagation(); e.preventDefault(); $(this).toggleClass('activity__button--read '); $(this).attr('data-status', 'unread') $(this).parent().toggleClass('activity__item--read'); }); $('div[data-status="read"]').each(function(){ $(this).addClass('activity__item--read'); }) $('div[data-status="unread"]').each(function(){ $(this).removeClass('activity__item--read'); }) 
 .activity__item { position: relative; height: 100px; width: 300px; border: 1px solid whitesmoke; margin-top: -1px; } .activity__button { cursor: pointer; width: 50px; height: 50px; display: flex; align-items: center; justify-content: center; border: 2px solid; font-size: 21px; } .activity__button .fas:before { color: #f8971d; } .activity__button.activity__button--read .fas:before { content: "\\f2b6"; color: #47a877; } .activity__item--read { background: #fafafa !important; } 
 <link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.8.1/css/all.min.css" rel="stylesheet" /> <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <div> <div class="activity__item"> <div class="activity__button" data-status="unread"><i class="fas fa-envelope"></i> </div> </div> <div class="activity__item"> <div class="activity__button" data-status="unread"><i class="fas fa-envelope"></i> </div> </div> <div class="activity__item activity__item--read"> <div class="activity__button activity__button--read" data-status="read"> <i class="fas fa-envelope"></i> </div> </div> <div class="activity__item"> <div class="activity__button" data-status="read"> <i class="fas fa-envelope"></i> </div> </div> </div> 

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM