jquery - 按下上一个和下一个按钮时模拟元素列表中的元素单击
问题描述
我需要创建一个 jQuery 脚本来模拟另一个元素的单击,从元素列表中,每次按下按钮时,单击列表中的下一个元素,每次按下按钮时,上一个元素从单击列表。
这是部分有效的代码,但只点击一次
$('#next').click(function() {
$('li a').trigger('click');
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<ul>
<li>
<span>
<span>
<a href="#" class="current">image</a>
</span>
</span>
</li>
<li>
<span>
<span>
<a href="#" class="">image</a>
</span>
</span>
</li>
<li>
<span>
<span>
<a href="#" class="">image</a>
</span>
</span>
</li>
</ul>
<div id="prev">prev</div>
<div id="next">next</div>
简而言之,当我按下“下一个”按钮时,我想模拟在具有类“当前”的元素之后单击标记,但是当我按下按钮“上一个”时,我想模拟在具有类的元素之前单击标记“当前的”。
可悲的是,这种布局需要跨度,如果它们不存在,我很可能会使用 .next() 函数,就像我在类似的堆栈帖子中看到的那样,但因为在我的情况下,元素不是一个接一个地直接定位,这个功能不起作用,或者我不能让它起作用。
谢谢!
解决方案
根据@Taplar 的评论创建答案。
此代码示例基于a
当前类的 prev/next 改进。它找到closest li
,然后转到下一个(或上一个)并触发点击。
最接近():给定一个代表一组 DOM 元素的 jQuery 对象,.closest() 方法在 DOM 树中搜索这些元素及其祖先
$('#next').click(function() {
var $next = $('a.current').closest('li').next().find("a");
$next = $next.length > 0 ? $next : $("ul li:first-child a"); //if the end get the first one.
$next.trigger('click');
});
$('#prev').click(function() {
var $prev = $('a.current').closest('li').prev().find("a");
$prev = $prev.length > 0 ? $prev : $("ul li:last-child a"); //if the start get the last one.
$prev.trigger('click');
});
//sample "click" event to toggle the current class
$("li a").click(function(e) {
e.preventDefault();
$("li a").removeClass("current");
$(this).addClass("current");
});
.current {
background-color: orange;
}
div[id] {
border: 1px solid #ccc;
border-radius: 10px;
height: 20px;
width: 50px;
display: inline-block;
text-align: center;
cursor: pointer;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<ul>
<li>
<span>
<span>
<a href="#" class="current">image</a>
</span>
</span>
</li>
<li>
<span>
<span>
<a href="#" class="">image</a>
</span>
</span>
</li>
<li>
<span>
<span>
<a href="#" class="">image</a>
</span>
</span>
</li>
</ul>
<div id="prev">prev</div>
<div id="next">next</div>
推荐阅读
- php - CakePHP 4 和 Authentication 2 插件 - 记住我不会创建 Cookie
- android - 尝试在空对象引用 (MessageActivity.java:150) 上调用虚拟方法“boolean java.lang.String.equals(java.lang.Object)”
- html - 构建后未找到 Angular 11 资产
- c# - Entity Framework 6 可以从分隔字符串列映射外键吗?
- asynchronous - 暂时挂起或停用 futures::select 中使用的间隔流
- c - 如何禁止编译器预先计算常量值的乘积
- ansible - 如何使用 json_query 过滤器提取所有项目等于一个值
- sql - Teradata 中的多语句请求与分隔插入
- javascript - 为什么我的 addEventListener 函数在本地为变量赋值,而不是全局?
- ansible - Ansible 循环项目列表并将项目作为变量传递给具有“何时”条件的“包含”任务