我正在使用jQuery隐藏和淡入淡出同一页面上的不同内容,具体取决于单击的链接。

它可以按我想要的方式工作,但是我写的方式

$("#navItem1").on('click', function(){
    $('#content-wrap1').hide();
    $('#content-wrap2').hide();
    $('#content-wrap3').hide();
    $('#content-wrap4').hide();
    $('#content-wrap5').hide();
    $('#content-wrap1').fadeIn(1000);
});
$("#navItem2").on('click', function(){
    $('#content-wrap1').hide();
    $('#content-wrap2').hide();
    $('#content-wrap3').hide();
    $('#content-wrap4').hide();
    $('#content-wrap5').hide();
    $('#content-wrap2').fadeIn(1000);
});
$("#navItem3").on('click', function(){
    $('#content-wrap1').hide();
    $('#content-wrap2').hide();
    $('#content-wrap3').hide();
    $('#content-wrap4').hide();
    $('#content-wrap5').hide();
    $('#content-wrap3').fadeIn(1000);
});
$("#navItem4").on('click', function(){
    $('#content-wrap1').hide();
    $('#content-wrap2').hide();
    $('#content-wrap3').hide();
    $('#content-wrap4').hide();
    $('#content-wrap5').hide();
    $('#content-wrap4').fadeIn(1000);
});
$("#navItem5").on('click', function(){
    $('#content-wrap1').hide();
    $('#content-wrap2').hide();
    $('#content-wrap3').hide();
    $('#content-wrap4').hide();
    $('#content-wrap5').hide();
    $('#content-wrap5').fadeIn(1000);
});


function fadeInFirstContent(){
    $('#content-wrap1').fadeIn(1000);

}
fadeInFirstContent();


这是一个jfiddle

我该如何重写jQuery,使其完全相同但是用更少的代码?

评论

由于某种原因,所有当前答案似乎都希望您更改HTML或添加随机循环。没有必要。我的回答是使用jQuery基本功能,仅用5行即可实现所有这些功能:codereview.stackexchange.com/a/26236/24039。您将从官方jQuery交互式教程中受益:try.jquery.com。

@JamesDonnelly,应该将HTML更改为使用类,而不是这些重复的[id]。它使HTML更能表达这些元素显然共享相似类的事实。

尽管@crm可能会受到限制并且无法更新HTML,但我同意zzzzBov的观点,这是最好的选择。

#1 楼

也许更改HTML:

Navitem:

<span class="navItem" data-content-id="1"></span>


内容

<div id="content-wrap1" class="content-wrap"></div>


jQuery

$('.navItem').on('click',function(){
   $('.content-wrap').hide();
   $('#content-wrap'+$(this).data('content-id')).fadeIn(1000);
});


评论


\ $ \ begingroup \ $
这比使用ID的子字符串好得多。另外,您还缺少。在navItem前面…
\ $ \ endgroup \ $
– Ry-
13年5月16日在20:03



\ $ \ begingroup \ $
这比接受的答案要好,尽管我认为使用content-wrap元素上的数据属性代替ID会更干净。像.content-wrap [data-wrapid = VAR]这样的选择器不会明显变慢。另外,只需使用eq()选择第n个元素。
\ $ \ endgroup \ $
–心怀不满的山羊
13年5月16日在22:51

#2 楼

您根本不需要更改HTML标记。您可以使用带CSS的启动器选择器(^=):

// All elements with an ID starting with navItem...
$('[id^="navItem"]').on('click', function() {
    var
        // Get the ID as a string
        id = this.id,
        // Get the last character from the ID
        num = id.charAt(id.length-1)
    ;
    // Hide all elements with an ID starting with content-wrap...
    $('[id^="content-wrap"]').hide();
    // Fade in the relevant ID
    $('#content-wrap'+num).fadeIn(1000);
});


如果我们假设使用了“ navItem5”,则变量将包含以下内容:

id == "navItem5"
num == "5"
$('#content-wrap'+num) == "#content-wrap5"


JSFiddle示例。

这是非常基本的jQuery。通过阅读官方jQuery交互式教程,您会受益匪浅:http://try.jquery.com。

评论


\ $ \ begingroup \ $
为什么不这样做:var id = this.id ;?不需要$(this).attr('id')...速度也大大提高。
\ $ \ endgroup \ $
– RobH
13年5月16日在12:59

\ $ \ begingroup \ $
这是一个简单的疏忽,我修改了答案。 :)
\ $ \ endgroup \ $
–詹姆斯·唐纳利(James Donnelly)
13年5月16日在13:01



\ $ \ begingroup \ $
如果OP要使用相同的单击来显示/淡出,则可能包括.toggle()。
\ $ \ endgroup \ $
–尊尼·苏特
13年5月16日在16:15

\ $ \ begingroup \ $
尽管此答案有效,但从ID属性中提取数字非常不明智。
\ $ \ endgroup \ $
–心怀不满的山羊
13年5月16日在22:43

\ $ \ begingroup \ $
我将在几个小时前对我的投票发表评论:这非常脆弱,并且肆意滥用ID。例如,如果数字超过9怎么办?为什么不只使用干净高效的类呢?为什么不缓存该集合,或将其放入数组中,或其他类似的东西?
\ $ \ endgroup \ $
– Ry-
13年5月16日23:37



#3 楼

我认为这应该可以解决问题

for (var j = 1; j <= 5; j++) {  
    (function(i){
        $("#navItem" + i).on('click', function(){
            $('#content-wrap1').hide();
            $('#content-wrap2').hide();
            $('#content-wrap3').hide();
            $('#content-wrap4').hide();
            $('#content-wrap5').hide();
            $('#content-wrap' + i).fadeIn(1000);
        });
    })(j);
}


评论


\ $ \ begingroup \ $
您好,您能解释一下for循环中发生了什么吗?
\ $ \ endgroup \ $
– crmepham
13年5月16日在12:37

\ $ \ begingroup \ $
@crm:在循环内部,我定义了一个将数字作为参数的函数。定义函数后,我立即通过该语句(j)对其进行调用。这是一个关闭。
\ $ \ endgroup \ $
– Claudio Redi
13年5月16日在12:41



\ $ \ begingroup \ $
我如何持有价值?您不应该在循环中调用j吗?还有为什么最后括号中的j是这样的呢?
\ $ \ endgroup \ $
– crmepham
13年5月16日在12:44

\ $ \ begingroup \ $
@crm:这是闭包的魔力:)在这里,您有一个非常普遍的问题,可以澄清此主题stackoverflow.com/questions/111102/…。最后括号中的j是调用我刚刚用参数j定义的函数的方式
\ $ \ endgroup \ $
– Claudio Redi
13年5月16日在12:54



#4 楼

是的,有...有很多方法可以简化此操作。.我正在通过对data标签使用<a>属性来实现这一点...并向所有内容<div>添加相同的类。(我在这里使用的是内容)...

HTML

<nav>
<!-- Start of side menu -->
<ul id="mainNav">
    <li class="mainNavItem"><a href="#" id="navItem1" data-content="content-wrap1">Home</a>
    </li>
    <li class="mainNavItem"><a href="#" id="navItem2" data-content="content-wrap2">Prices</a>
    </li>
    <li class="mainNavItem"><a href="#" id="navItem3" data-content="content-wrap3">Find us</a>
    </li>
    <li class="mainNavItem"><a href="#" id="navItem4" data-content="content-wrap4">Reviews</a>
    </li>
    <li class="mainNavItem"><a href="#" id="navItem5" data-content="content-wrap5">Gallery</a>
    </li>
   </ul>
</nav>
<!-- closes mainNav -->
<div id="content-wrap1" class="content">Home</div>
<div id="content-wrap2" class="content">Prices contents</div>
<div id="content-wrap3" class="content">find us contents</div>
<div id="content-wrap4" class="content">review contents</div>
<div id="content-wrap5" class="content">gallery contents</div>



$('ul#mainNav li a').click(function () {
    $('.content').hide();
    $('#' + $(this).data('content')).fadeIn(1000);
});



function fadeInFirstContent() {
    $('#content-wrap1').fadeIn(1000);

}
fadeInFirstContent();


或不向内容添加类..

 $(function(){
   $('ul#mainNav li a').click(function () {
     $('div[id^="content-wrap"]').hide();
     $('#' + $(this).data('content')).fadeIn(1000);
  });
   $('#content-wrap1').fadeIn(1000);
});


在这里拨弄

#5 楼

它可以做得更短:
http://jsfiddle.net/2ADyp/

function hideAll(){
    $('#content-wrap1').hide();
    $('#content-wrap2').hide();
$('#content-wrap3').hide();
$('#content-wrap4').hide();
$('#content-wrap5').hide();
}

function showSelected(e){
    hideAll();
    $(e.target.hash).fadeIn(100);
}

$("#mainNav").find("a").each(function(i,o){ 
    $(o).click(showSelected);
});


评论


\ $ \ begingroup \ $
hideAll()可以最小化为$('#content-wrap1,#content-wrap2,#content-wrap3,#content-wrap4,#content-wrap5')。hide()
\ $ \ endgroup \ $
–穆罕默德·奥默·阿斯兰
19年4月26日在18:13

#6 楼

假设您使用的表达结构如下:

<nav>
    <a href="#content-wrap1" id="navItem1" class="navItem">One</a>
    <a href="#content-wrap2" id="navItem2" class="navItem">Two</a>
    <a href="#content-wrap3" id="navItem3" class="navItem">Three</a>
</nav>
<div id="content-wrap1" class="content-wrap">...</div>
<div id="content-wrap2" class="content-wrap">...</div>
<div id="content-wrap3" class="content-wrap">...</div>


然后可以以简短的表达方式切换content-wrap项目的显示。

$('.navItem').on('click', function (e) {
    $('.content-wrap').hide();
    $($(this).prop('hash')).fadeIn(1000);
    e.preventDefault();
});


这确实建议更改HTML,但仅以使内容具有语义的方式进行。