[英]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--read
和activity__button--read
。 That why its open only on second click 那就是为什么只在第二次点击时才打开
unread
.last two element are read
前两个元素是unread
后两个元素是read
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.