javascript - 无法获取 jQuery 和 Javascript If 语句以根据对象单击取消选择/选择类
问题描述
我正在尝试使用单击功能来关闭手风琴项并从所有其他元素中删除类,除了我正在与之交互的元素
我尝试了各种具有不同参数的 if 语句。
// Container For Each Accordion Item
var $expandeditemcontainer = $('.expand-wrapper');
// Accordion/Card Head - Summary Box - Once Clicked Expands .expanded-box
var $expandingsummarybox = $('.expander');
// Accordion/Card Body - Expanded Box That Appears Underneath - Absolutely Positioned - Out Of Document Flow
var $expandedbox = $('.expanded-box');
// Ghost Div replicating Accordion/Card Body's Height - Relatively Positioned - In Document Flow
var $expandedboxspacer = $('.expand-box-height-clearance');
// When $expandingsummarybox is clicked
$($expandingsummarybox).click(function() {
/** .expand-focus creates outline on $expandingsummarybox once accordion is opened **/
// If any $expandingsummarybox has a class .expander-focus applied
if ($($expandingsummarybox).hasClass('expander-focus')) {
// Remove .expander-focus from all $expandingsummarybox's
$($expandingsummarybox).removeClass('expander-focus');
// Close all Accordion Item's
$($expandingsummarybox).closest($expandeditemcontainer).find($expandedboxspacer).slideUp(200, 'swing');
// If any $expandingsummarybox does NOT have .expander-focus applied
} else if (!$($expandingsummarybox).hasClass('expander-focus')) {
// Add .expander-focus to this specific $expandingsummarybox
$(this).addClass('expander-focus');
// Open this specific Accordion Item
$(this).closest($expandeditemcontainer).find($expandedboxspacer).slideDown(200, 'swing');
} else {
// These were the parameters I was originally using affecting that specific item
$(this).toggleClass('expander-focus');
$(this).closest($expandeditemcontainer).find($expandedboxspacer).slideToggle(200, 'swing');
}
});
在与最初单击的项目交互时工作,但在尝试通过不同的方法关闭或单击另一个手风琴项目时它会中断。
解决方案
我可以在您的点击处理程序中看到一些逻辑错误,但没有更多关于它是什么/如何破坏的详细信息,这可能不是一个完整的解决方案。
您的问题是 if/else-if 块中的控制流。第一次.expander
单击它会正确打开。但是,如果您单击不同的.expander
内容,它将点击 if 语句块并关闭所有.expander-box
但从未真正打开.expander
被单击的内容。
要解决此问题,您应首先确定.expander
所单击的是打开还是关闭。然后,您可以关闭所有.expander
框。最后,如果.expander
单击的那个最初是关闭的,您可以打开它。否则,如果扩展器已打开,则关闭所有.expander
框会为您关闭它。
const $expandeditemcontainer = $('.expand-wrapper');
const $expandingsummarybox = $('.expander');
const $expandedbox = $('.expanded-box');
const $expandedboxspacer = $('.expand-box-height-clearance');
$expandingsummarybox.click(function() {
const isCurrentExpanded = $(this).hasClass("expander-focus");
// Remove .expander-focus from all $expandingsummarybox's
$expandingsummarybox.removeClass('expander-focus');
// Close all Accordion Item's
$expandingsummarybox.closest($expandeditemcontainer).find($expandedboxspacer).slideUp(200, 'swing');
if (!isCurrentExpanded) {
// The clicked expander was closed originally lets open it
$(this).addClass('expander-focus');
$(this).closest($expandeditemcontainer).find($expandedboxspacer).slideDown(200, 'swing');
}
});
推荐阅读
- c++ - Scala 中 C++ 的 std::forward 等价物
- php - 使用自定义表创建多对多多态关系
- json - logstash 聚合过滤器插件中的嵌套 json 对象
- linux - 在centos(vps)中恢复特定目录中已删除的文件
- java - 如何在java spring REST上返回由对象包装的数组字节
- exception - OfficeXml 文件异常。我该如何解决?
- angular - Angular 6在客户端打印
- xml - 关于如何将 swagger yaml 文件(仅定义部分)转换为 XSD 的任何建议?
- javascript - 尝试将工作表行数据发送到 GmailApp 时缺少变量名称;Javascript/谷歌应用脚本
- node.js - Dialogflow 自定义有效负载未在 facebook messenger 中发布消息