JQuery:切换单击的元素并隐藏所有其他元素
我希望隐藏任何可见的span元素(如果有的话),如果单击某个元素,则再次切换它
JS
$('.item span').hide(); var all_spans = $('.item a').parent().find('span'); $('.item a').click(function(e) { e.preventDefault(); // hide all span all_spans.hide(); $this = $(this).parent().find('span'); // here is what I want to do if ($this.is(':hidden')) { $(this).parent().find('span').show(); } else { $(this).parent().find('span').hide(); } });
实例http://jsfiddle.net/BGSyS/
问题是,当我点击例如’ element 1
‘时,’ span1
‘仍然可见,我想切换它
$('.item span').hide(); $('.item a').click(function(e){ e.preventDefault(); // hide all span var $this = $(this).parent().find('span'); $(".item span").not($this).hide(); // here is what I want to do $this.toggle(); });
检查演示
更新说明:
问题是当您隐藏所有跨度时,您还隐藏当前跨度=>所有跨度具有相同的状态(隐藏),并且您的下一行再次显示它。 隐藏时必须排除当前元素,并使用切换方法切换其状态(比使用if检查更简单)
另一个问题是尝试通过使用var
声明$this
来避免隐式全局:
var $this = $(this).parent().find('span');
它可以简单得多: 更新的小提琴
var all_spans = $('.item span').hide(); $('.item a').click(function(e){ var thisSpan = $(this).parent().find('span'), isShowing = thisSpan.is(":visible"); // Hide all spans all_spans.hide(); // If our span *wasn't* showing, show it if (!isShowing) { thisSpan.show(); } e.preventDefault(); });
您的代码的主要问题是您正在检查元素是否可见,而不是检查span
是否可见。
你的代码也成为了暗杀全球恐怖的牺牲品:
$this = $(this).parent().find('span');
…它创建了一个全局变量$this
因为你没有在任何地方声明它。
您可以使用跨度选择器隐藏所有跨度,然后使用$(this)关键字查找单击链接旁边的跨度:
$(".item a").click(function() { // Hide all item spans $(".item span").hide(); // Show the element next to this $(this).next().show(); });
开始片段:js hide:false
语言:lang-js
function itemshow(n,e){ var idx = "num_"+n; $(".item_title").each(function(){ var idn = $(this).next().attr("id"); if (idn == idx){ $("#"+idn).toggle(); }else{ $("#"+idn).hide(); } }); }
语言:lang-css
.item_desc{ display: none; }
语言:lang-html
1) Question Answer 2) Question Answer 3) Question Answer
结束片段