2011-08-10 37 views
7

Tôi đang làm việc trên menu mới, nơi tôi có nhiều div ẩn, nhưng tôi chỉ muốn hiển thị một div trên trang bất kỳ lúc nào.jQuery - Chỉ hiển thị một div bất kỳ lúc nào

Đây là mã của tôi; http://jsfiddle.net/sXqnD/

HTML đẹp và đơn giản;

<div id="linkwrapper"> 
<a id="link1" href="#">link1</a><br/> 
<a id="link2" href="#">link2</a><br/> 
<a id="link3" href="#">link3</a> 
</div> 

<div id="infocontent"> 
    <div id="link1content">Information about 1.</div> 
    <div id="link2content">Information about 2.</div> 
    <div id="link3content">Information about 3.</div> 
</div> 

Đây là nỗ lực của tôi tại jQuery, có vẻ như không chơi độc đáo.

$(document).ready(function(){ 

$('#infocontent').children().hide(); 

$('#linkwrapper a').click(function(){ 

    var chosen1 = this.id; 

    $('#infocontent').children('div').each(function(i) { 
     var i = i+1; 
     if($("#" + this.id).is(":visible") == true) { 
      $("#" + this.id).hide(function(){ 
       $("#" + chosen1 + "content").show(); 
      }); 
      return false; 

     } else { 
     $("#" + this.id).show(); 
     return false; 
     } 
    }); 
}); 
}); 

Mọi người có thể thấy tôi đã đi sai hoặc đề xuất giải pháp thanh lịch hơn không?

Trả lời

0

Cảm ơn tất cả những lời khuyên.

Tôi thấy đây là giải pháp tốt nhất cho những gì tôi đang cố gắng đạt được.

http://jsfiddle.net/sXqnD/15/

HTML

<div id="linkwrapper"> 
    <a id="link1" href="#">link1</a><br/> 
    <a id="link2" href="#">link2</a><br/> 
    <a id="link3" href="#">link3</a> 
</div> 

<div id="infocontent"> 
    <div id="link1content">Information about 1.</div> 
    <div id="link2content">Information about 2.</div> 
    <div id="link3content">Information about 3.</div> 
</div> 

jQuery

$("#infocontent").hide(); 
$("#infocontent div").hide(); 


    $('#linkwrapper a[id]').click(function(){ 

    var vsubmen = this.id +"content"; 

    if($("#infocontent").is(":visible") == false) { 
     $("#" + vsubmen).show('fast',function() { 
      $("#infocontent").slideDown(); 
     }); 
    } else if ($("#" + vsubmen).is(":visible") == false) { 
    $("#infocontent").slideUp('slow',function(){ 
     $("#infocontent div").hide(); 
     $("#" + vsubmen).show(); 
     $("#infocontent").slideDown('slow');  
     }); 
    } else { 
    $("#infocontent").slideUp('slow',function(){ 
     $("#infocontent div").hide(); 
    }); 
    } 
    return false; 
}); 
6
$('div').filter('#idOfDivToShow').show(); 
$('div').not('#idOfDivToShow').hide(); 

$('div') sẽ tìm tất cả các div trên trang web của bạn. .filter sẽ tìm kiếm trong các kết quả phù hợp với $('div') và so khớp các phần tử có id = idOfDivToShow. .not sẽ tìm kiếm trong các kết quả phù hợp với $('div') và so khớp các phần tử không có id = idOfDivToShow.

Cuối cùng, nếu bạn muốn tìm kiếm chỉ trong vòng một yếu tố đặc biệt, nói #infocontent, sau đó bạn có thể viết:

$('#infocontent').filter('div').filter('#idOfDivToShow').show(); 
$('#infocontent').filter('div').not('#idOfDivToShow').hide(); 
+1

Tôi có thể đề nghị: '$ ('div') hide() lọc ('# idOfDivToShow') hiển thị (...); Điều này sẽ đảm bảo rằng nếu bạn thay đổi bộ chọn thứ 2, bạn chỉ cần thay đổi nó ở 1 vị trí thay vì 2. – Exelian

+0

+1 để sử dụng bộ lọc - mà nhiều người không sử dụng. – JonH

+1

Lợi ích của việc sử dụng bộ lọc qua bộ chọn kiểu CSS trực tiếp hơn như '#infocontent div' là gì? –

0
$(window).ready(function(){ 
    /* hide the content divs */ 
    $('#infocontent div').css('display', 'none'); 

    /* add click events */ 
    $('#linkwrapper a').click(function(){ 
     $('#infocontent div').css('display', 'none'); 
     $('#'+this.id+'content').css('display', 'block'); 
    }); 
}); 

Tôi cũng sẽ mất một chút thời gian để thay đổi href liên kết của bạn thuộc tính " javascript: void (null); " để ngăn trang nhảy nếu các liên kết nằm dưới "nếp gấp" của trang.

+0

jQuery * không * có '.hide()' và '.show()' quá ... – JJJ

+1

Juhana, việc sử dụng không quan trọng. Nó cũng có slideUp, toggles, và tuy nhiên nhiều chuyển tiếp khác từ ẩn sang hiển thị. Tôi muốn hiển thị áp phích các tùy chọn khác ngoài chỉ ẩn() hoặc hiển thị(). –

0

Làm thế nào về điều này? http://jsfiddle.net/sXqnD/2/

<div id="linkwrapper"> 
    <a id="link1" href="#">link1</a><br/> 
    <a id="link2" href="#">link2</a><br/> 
    <a id="link3" href="#">link3</a> 
</div> 

<div id="infocontent"> 
    <div class="content" id="link1content">Information about 1.</div> 
    <div class="content" id="link2content">Information about 2.</div> 
    <div class="content" id="link3content">Information about 3.</div> 
</div> 

JS:

$(document).ready(function(){ 

    $('#infocontent').children().hide(); 

    $('#linkwrapper a').click(function(){ 
     var chosen1 = this.id; 
     $('.content').hide(); 
     $('#' + chosen1 + 'content').show(); 
    }); 
}); 

Tôi nghĩ rằng bạn sẽ tìm thấy thao tác thứ bằng ID tương tự có định dạng không sẽ rất thoải mái để làm việc với trong dài hạn mặc dù.

+0

Đây là giải pháp tốt đẹp. nhưng cách tải trang chỉ hiển thị phần tử đầu tiên? –

1

tôi sẽ đề nghị đơn giản hóa nó trong hàm nhấp chuột đơn giản giấu tất cả mọi thứ và sau đó hiển thị một trong những bạn muốn

$('#linkwrapper a').click(function(){ 
    $('#infocontent').children('div').each(function(i) { this.hide(); }); 
    $('#' + this.id + 'content').show(); 
}); 
+0

+1 _ Tôi thích cái này – JonH

0

Đối với sự thay đổi nhanh nhất:

Từ

$(document).ready(function(){ 

$('#infocontent').children().hide(); 

$('#linkwrapper a').click(function(){ 

var chosen1 = this.id; 

$('#infocontent').children('div').each(function(i) { 
    var i = i+1; 
    if($("#" + this.id).is(":visible") == true) { 
     $("#" + this.id).hide(function(){ 
      $("#" + chosen1 + "content").show(); 
     }); 
     return false; 

    } else { 
    $("#" + this.id).show(); 
    return false; 
    } 
    }); 
}); 
}); 

Để

$(document).ready(function() { 

    $('#infocontent').children().hide(); 

    $('#linkwrapper a').click(function() { 

     var chosen1 = this.id; 
     $('#infocontent').children().hide(); 
     $("#" + chosen1 + "content").show(); 

    }); 
}); 

tôi về cơ bản thay thế chức năng .each() với 1) cất giấu tất cả những đứa trẻ, và sau đó 2) cho thấy div mong muốn

+0

Tôi thích sự thiếu hụt của giải pháp, nhưng không thích "ẩn tất cả, hiển thị một". Chỉ ẩn những gì cần được ẩn. – Jacco

0

Giải pháp của tôi là ở đây: http://jsfiddle.net/sXqnD/8/

Code:

$(document).ready(function(){ 

    var $allContentDivs = $('#infocontent div').hide(); // Hide All Content Divs 

    $('#linkwrapper a').click(function(){ 
     var $contentDiv = $("#" + this.id + "content"); 

     if($contentDiv.is(":visible")) { 
      $contentDiv.hide(); // Hide Div 
     } else {    
      $allContentDivs.hide(); // Hide All Divs 
      $contentDiv.show(); // Show Div 
     } 

     return false;   
    }); 
}); 
0

Đây là câu trả lời gần với những gì bạn có. Nó được dựa trên suy nghĩ này: - tìm của div và chỉ hiển thị các div xác định nếu nó ẩn - ẩn tất cả div khác

$(document).ready(function() { 

      $('#infocontent').children().hide(); 

      $('#linkwrapper a').click(function() { 

       var chosen1 = this.id; 
       var divIdToShow = chosen1 + 'content'; 

       $('#infocontent').children('div').each(function (i) { 
        var currentDiv = $(this); 
        if (this.id == divIdToShow) { 
         if (currentDiv.not(':visible')) { 
          currentDiv.show(); 
         } 
        } else { 
         currentDiv.hide(); 
        } 
       }); 
      }); 
     }); 
Các vấn đề liên quan