2013-04-01 53 views
0

对不起,我是jQuery新手。所以我有这两个if else语句的jQuery代码,我想合并,因为我觉得这是一个不必要的重复。他们有些不同的代码,因为一旦采取行动ul#tabs li a和其他ul.tabs li a。我如何合并它们以提高性能?以下是代码:合并这两个if ... else语句

$(document).ready(function() 
{ 
    var hash = location.hash; 

    $(".tab_content").hide(); //Hide all content 

    if ($("ul#tabs li a[href='" + hash + "']").length) 
    { 
     $("ul#tabs li a[href='" + hash + "']") 
      .addClass("active") 
      .parent() 
      .addClass("active"); //Activate tab 

     $(hash).show(); 
    } 
    else 
    { 
     do stuff 
    } 

    if ($("ul.tabs li a[href='" + hash + "']").length) 
    { 
     $("ul.tabs li a[href='" + hash + "']") 
      .addClass("active") 
      .parent() 
      .addClass("active"); //Activate tab 

     $(hash).show(); 
    } 
    else 
    { 
     do stuff 
    } 
}); 

如何合并这两个代码?

+0

你可以简单地将类“标签”添加到ID为“#tabs”的元素,只运行第一个if/else语句吗? –

+0

都是“做的东西”是相同的代码? btw的性能,你运行相同的选择器两次(一次为ifs,再次为类添加),你应该只运行一次选择器并保存到一个变量。 – smerny

回答

3

逗号操作符,,,在CSS和jQuery用于指定多个选择:

var sel = $("ul.tabs li a[href='" + hash + "'], ul#tabs li a[href='" + hash + "']"); 
    if (sel.length) { 
     sel.addClass("active").parent().addClass("active"); //Activate tab 
     $(hash).show(); 
    } 
    else { 
     do stuff 
    } 

可以减少重复更进一步:

var sel = $("ul.tabs, ul#tabs").find("li a[href='" + hash + "']"); 
.... 
+0

哇!哥们你真了不起。一个问题,但。它具有链接跳跃效果。 'e.preventDefault()';应该做魔术吧? –

+1

@JoePaul是的,'e.preventDefault()'会工作。 – SomeShinyObject

2

You could utilize multiple selectors with a comma

if ($("ul.tabs li a[href='" + hash + "'], ul#tabs li a[href='" + hash + "'] ").length) { 

为你的情况,你可以去与each()方法:

var el = $("ul.tabs li a[href='" + hash + "'], ul#tabs li a[href='" + hash + "']"); 

if(el.length) { 
    el.each(function() { 
     $(this).addClass("active").parent().addClass("active"); 
     $(hash).show(); 
    }); 
} else { 
    // do else stuff 
} 
+0

非常感谢兄弟。同样的答案。只是他的第一个来;)..你偶然知道我可以防止链接跳跃效应? –

+1

@JoePaul在回调定义中添加一个事件变量:'el.each(function(evt){'然后在调用'$(hash).show();'do'evt.preventDefault()'之后,或者简单地'返回false;' –