jQuery显示/隐藏未按预期运行
jQuery show/hide not behaving as expected
使用jQuery在列表中显示/隐藏LI元素时遇到了一些问题,以下是我目前所拥有的:
$(document).ready(function(){
$("ul.news").find("li.hidden").hide();
$("ul.news a.show").click(function() {
$("ul.news").find("li.hidden").toggle();
$("ul.news").find("li.hide").show();
});
$("ul.news a.hide").click(function() {
$("ul.news").find("li.hidden").toggle();
$("ul.news").find("li.show").show();
});
$("ul.articles").find("li.hidden").hide();
$("ul.articles a.show").click(function() {
$("ul.articles").find("li.hidden").toggle();
$("ul.articles").find("li.hide").show();
});
$("ul.articles a.hide").click(function() {
$("ul.articles").find("li.hidden").toggle();
$("ul.articles").find("li.show").show();
});
});
以及HTML:
<h3 class="gray-default">Press Releases</h3>
<ul class="news-landing news span8">
<li><a href="" target="_blank">xxx</a></li>
<li><a href="" target="_blank">xxx</a></li>
<li><a href="" target="_blank">xxx</a></li>
<li class="hidden"><a href="" target="_blank">xxx</a></li>
<li class="hidden"><a href="" target="_blank">xxx</a></li>
<li class="hidden"><a href="" target="_blank">xxx</a></li>
<li class="hidden"><a href="" target="_blank">xxx</a></li>
<li class="show"> <a class="view-more show">To view more >></a> </li>
<li class="hide"> <a class="view-more hide">To view less >></a> </li>
</ul>
<h3 class="gray-default">Articles & Reports</h3>
<ul class="news-landing articles span8">
<li><a href="" target="_blank">xxx</a></li>
<li><a href="" target="_blank">xxx</a></li>
<li><a href="" target="_blank">xxx</a></li>
<li class="hidden"><a href="" target="_blank">xxx</a></li>
<li class="hidden"><a href="" target="_blank">xxx</a></li>
<li class="hidden"><a href="" target="_blank">xxx</a></li>
<li class="hidden"><a href="" target="_blank">xxx</a></li>
<li class="show"> <a class="view-more show">To view more >></a> </li>
<li class="hide"> <a class="view-more hide">To view less >></a> </li>
</ul>
但正在发生的事情:
在最初的页面加载中,一切都很好,每个列表中只有3个项目,正确的"查看更多"链接
点击新闻下的查看更多;列表正确展开,但或多或少的链接都可见,单击任一链接都会折叠列表,但两个链接都可见。
点击文章下的查看更多;列表展开,但只有查看更多链接可见,再次单击它会折叠列表,更多链接仍然可见。越少的链接永远不会出现。
我做错了什么?
可以简化整个过程并使用消除代码重复
CSS:
.hidden,li.hide{display:none}
JS:
$(document).ready(function(){
$('li.show,li.hide').click(function(){
$(this).toggle().siblings('.hide,.hidden,.show').toggle();
});
})
演示
通过使用siblings()
,您可以在每个UL
中保持DOM搜索的隔离,因此不需要为每组控件指定不同的处理程序
现场演示
简化HTML:
<h3 class="gray-default">Press Releases</h3>
<ul class="news-landing span8">
<li><a href="" target="_blank">xxx0</a></li>
<li><a href="" target="_blank">xxx1</a></li>
<li><a href="" target="_blank">xxx2</a></li>
<li><a href="" target="_blank">xxx3</a></li>
<li><a href="" target="_blank">xxx4</a></li>
<li><a href="" target="_blank">xxx5</a></li>
<li><a href="" target="_blank">xxx6</a></li>
</ul>
<a href="#" class="news-landing-toggle"></a>
这是你的超级简单jQuery:
$(function(){ // DOM ready
var btnTxt = ["View more", "View less"];
$('.news-landing').find('li:gt(2)').hide();
$(".news-landing-toggle").click(function( e ) {
e.preventDefault();
$(this).text( btnTxt.reverse()[0] ).prev('ul').find('li:gt(2)').slideToggle();
}).text( btnTxt[0] );
});
另一个使用更多CSS的解决方案是:
现场演示
.news-landing li:nth-child(n+4){
display:none;
}
.news-landing + .news-landing-toggle:after{
content:"View more";
}
.news-landing.opened li:nth-child(n+4){
display:inherit;
}
.news-landing.opened + .news-landing-toggle:after{
content:"View Less";
}
jQ:
$('.news-landing-toggle').click(function(e){
e.preventDefault();
$(this).prev('ul').toggleClass('opened');
});
您永远不会在代码中的适当时间隐藏showmore/showless链接。尝试更新您的JavaScript如下(请参阅fiddle):
$(document).ready(function(){
$("ul.news").find("li.hidden").hide();
$("ul.news").find("li.hide").hide(); // hide the hide button by default
$("ul.news li.show").click(function() {
$(this).hide(); // hide the show button
$("ul.news").find("li.hidden").toggle();
$("ul.news").find("li.hide").show(); // and show the hide button
});
$("ul.news li.hide").click(function() {
$(this).hide(); // hide the hide button
$("ul.news").find("li.hidden").toggle();
$("ul.news").find("li.show").show(); // and show the show button
});
$("ul.articles").find("li.hidden").hide();
$("ul.articles").find("li.hide").hide();
$("ul.articles li.show").click(function() {
$(this).hide();
$("ul.articles").find("li.hidden").toggle();
$("ul.articles").find("li.hide").show();
});
$("ul.articles li.hide").click(function() {
$(this).hide();
$("ul.articles").find("li.hidden").toggle();
$("ul.articles").find("li.show").show();
});
});
您可以对此进行重构以避免代码重复,但我认为这可能是一个良好的开端。
如果我理解正确,您不想使用show()
和hide()
而不是使用toggle()
吗?
也就是说,当您单击查看更多时,您将使用show()
,而当您单击view less
此外,当您单击查看更多时,需要hide()
显示更多链接,show()
查看更少
相关文章:
- Append元素在运行两次函数后不显示
- 谷歌图表在运行应用程序时只能显示一次
- 在函数运行时显示对话
- InvalidOperationException:当应用程序未在UserInteractive模式下运行时显示模式对话
- 如何显示由ajax调用运行的PHP文件的echo
- 为什么我的脚本正在运行动画,但没有显示它
- 运行POST时显示图像
- 如何在MVC5中运行时在HTML5 Canvas中显示图像
- JQuery 在页面上显示时不会运行视差,而是使用绝对链接
- 在浏览器上显示实习运行程序功能测试的结果
- 如何在运行时突出显示量角器中的元素
- 隐藏/显示 js 代码不会在 IE8 或更低版本上运行
- 运行 python 脚本并在网站上显示打印值
- 在命令运行时以Grunt显示输出
- 如何计算一个函数在javascript中运行的次数?然后在页面上显示
- 使用ajax运行php脚本不会显示任何结果
- 脚本点击Css显示属性更改不正常运行Asp.net
- 为什么我的html弹出窗口显示我的函数的文本,而不是运行它们
- 在 JavaScript 中运行显示
- 运行显示在网站上的计数器