Javascript kullanarak bir <div> öğesini nasıl genişletebilir ve daraltabilirim?


96

Sitemde bir liste oluşturdum. Bu liste, veritabanımdaki bilgilerle oluşturulan bir foreach döngüsü tarafından oluşturulur. Her öğe farklı bölümleri olan bir konteynerdir, bu nedenle bu 1, 2, 3 ... vb gibi bir liste değildir. Tekrar eden bölümleri bilgilerle listeliyorum. Her bölümde bir alt bölüm var. Genel yapı aşağıdaki gibidir:

<div>
    <fieldset class="majorpoints" onclick="majorpointsexpand($(this).find('legend').innerHTML)">
    <legend class="majorpointslegend">Expand</legend>
    <div style="display:none" >
        <ul>
            <li></li>
            <li></li>
        </ul>
    </div>
</div>

Bu yüzden onclick = "majorpointsexpand ($ (this) .find ('legend'). İnnerHTML)" ile bir işlevi çağırmaya çalışıyorum.

Değiştirmeye çalıştığım div varsayılan olarak style = "display: none" ve tıklamada görünür kılmak için javascript kullanmak istiyorum.

"$ (This) .find ('legend"). İnnerHTML ", bu durumda fonksiyonda bir argüman olarak" Expand "geçirmeye çalışıyor.

İşte javascript:

function majorpointsexpand(expand)
    {
        if (expand == "Expand")
            {
                document.write.$(this).find('div').style = "display:inherit";
                document.write.$(this).find('legend').innerHTML = "Collapse";
            }
        else
            {
                document.write.$(this).find('div').style = "display:none";
                document.write.$(this).find('legend').innerHTML = "Expand";
            }
    }

Sorunumun sözdizimi olduğundan neredeyse% 100 eminim ve javascript'in nasıl çalıştığı konusunda pek bir fikrim yok.

Belgeye jQuery bağlandı:

<script src="http://code.jquery.com/jquery-1.9.1.min.js"></script>

In <head></head>bölümünde.


2
Sanırım başarmaya çalıştığınız şey bir akordeon jqueryui.com/accordion
Marc

1
$ bu, işlevin içinde tetiklendiği HTML öğesine "ilişkili olarak" demeye çalışıyorum.
Ryan Mortensen

1
@hungerpain - Soruyu soran kişi jQuery'de yeni olabilir ve etrafındaki parantezi unutmuş olabilir $(this). Bu yardımcı olur umarım.
jmort253

2
Önce jQuery hakkında daha fazla çalışmanız gerektiğini düşünüyorum. Görünüşe göre jQuery ile JavaScript arasındaki fark hakkında pek bir şey bilmiyorsunuz
tom10271

1
@aokaddaoc kesinlikle haklıydın;)
Ryan Mortensen

Yanıtlar:


184

Tamam, burada iki seçeneğiniz var:

  1. JQuery kullanıcı arayüzünün akordeonunu kullanın - güzel, kolay ve hızlı. Burada daha fazla bilgi görün
  2. Ya da, bunu yine de kendiniz yapmak istiyorsanız, bunu kaldırabilir fieldset(zaten bunun için kullanmak anlamsal olarak doğru değildir) ve kendi başınıza bir yapı oluşturabilirsiniz.

İşte bunu nasıl yapacağınız. Bunun gibi bir HTML yapısı oluşturun:

<div class="container">
    <div class="header"><span>Expand</span>

    </div>
    <div class="content">
        <ul>
            <li>This is just some random content.</li>
            <li>This is just some random content.</li>
            <li>This is just some random content.</li>
            <li>This is just some random content.</li>
        </ul>
    </div>
</div>

Bu CSS ile: (Bu, .contentsayfa yüklendiğinde öğeleri gizlemek içindir .

.container .content {
    display: none;
    padding : 5px;
}

Ardından, jQuery kullanarak clickbaşlık için bir olay yazın.

$(".header").click(function () {

    $header = $(this);
    //getting the next element
    $content = $header.next();
    //open up the content needed - toggle the slide- if visible, slide up, if not slidedown.
    $content.slideToggle(500, function () {
        //execute this after slideToggle is done
        //change text of header based on visibility of content div
        $header.text(function () {
            //change text based on condition
            return $content.is(":visible") ? "Collapse" : "Expand";
        });
    });

});

İşte bir demo: http://jsfiddle.net/hungerpain/eK8X5/7/


9
Sayfada birden fazla DIV öğesi varsa, bu sorunu çözeceğinden +1. Başka bir deyişle, tıklanan başlık içindeki içeriği hedeflediğiniz için bu iyi ölçeklenir.
jmort253

2
Alan kümesi zorunlu değildir. Ondan kurtulacağım ve sadece bir sınır kullanacağım. Bu mükemmel, çünkü tıkladığım başlığa göre genişletmek için div'i seçiyor; bu, kullanıcı ayarlarına ve diğer faktörlere bağlı olarak birkaç farklı listelenmiş öğeye sahip olabileceğim gerçeğinden dolayı önemlidir.
Ryan Mortensen

1
@Unipartisandev şuna bir bakın: jsfiddle.net/hungerpain/476Nq tam teşekküllü örnek :)
krishwader

Yardımın için gerçekten minnettarım. Bu belirli bir şey daha çok ya hep ya hiç gösterme örneği olsa da, sitenin hiç şüphesiz akordeon kullanması gerekmeyecek başka bölümleri olacaktır. Hâlâ sorunlarım var. JQuery'm süresi doldu ve yüklenmiyor. Bu düzeltildi, ancak hala çalışmıyorum. Bir saattir bununla uğraştım, uyuyacağım. Belki yarın bana vurur.
Ryan Mortensen

Harika, teşekkürler. Çok zaman kazandım!
Basil Musa

21

ne dersin:

jQuery:

$('.majorpoints').click(function(){
    $(this).find('.hider').toggle();
});

HTML

<div>
  <fieldset class="majorpoints">
    <legend class="majorpointslegend">Expand</legend>
    <div class="hider" style="display:none" >
        <ul>
            <li>cccc</li>
            <li></li>
        </ul>
    </div>
</div>

Vaktini boşa harcamak

Bu şekilde, tıklama olayını .majorpointssınıfa bağlarsınız ve her seferinde bunu HTML'ye yazmanız gerekmez.


Merhaba raam86, bunu bir adım daha ileri götürür ve bir id yerine bir sınıf kullanarak div üzerinde .find yaparım. Soruyu soran, sayfada bu alan kümelerinden birkaçına sahipse, tıklanan belirli alan kümesiyle ilişkili olan için gizleyiciyi hedeflemek isteyecektir. Bu yardımcı olur umarım! :) Örneğin, üst div'e bir başvuru almak için .closest'i kullanabilir, sonra bunun yerine bir class = "hider" ile div'i bulmak için .find kullanabilirsiniz.
jmort253

1
Saat 3 olduğunu biliyorum;), ancak jsFiddle'ınızda hala id'leri kullandığınızı fark ettim. W3C özelliği her bir kimliğin benzersiz olması gerektiğini söylediği için bu, tanımsız davranışa neden olabilir. Gizleyiciyi bir sınıfa değiştirirseniz, bu, diğer tarayıcılardaki hatalara veya garip, açıklanamayan davranışlara karşı daha dayanıklı olacaktır. Bu yardımcı olur umarım!
jmort253

aslında $ ('. majorpointslegend') olmalıdır. click (function () {$ (this) .parent (). find ('. hider'). toggle ();}); VEYA aksi takdirde alan kümesindeki herhangi bir yere tıklandığında, daralacaktır.
Awatatah

7

Yani, her şeyden önce, Javascript'iniz jQuery bile kullanmıyor. Bunu yapmanın birkaç yolu var. Örneğin:

İlk yol, jQuery toggleyöntemini kullanarak :

<div class="expandContent">
        <a href="#">Click Here to Display More Content</a>
 </div>
<div class="showMe" style="display:none">
        This content was hidden, but now shows up
</div>

<script>  
    $('.expandContent').click(function(){
        $('.showMe').toggle();
    });
</script>

jsFiddle: http://jsfiddle.net/pM3DF/

Başka bir yol da jQuery showyöntemini kullanmaktır :

<div class="expandContent">
        <a href="#">Click Here to Display More Content</a>
 </div>
<div class="showMe" style="display:none">
        This content was hidden, but now shows up
</div>

<script>
    $('.expandContent').click(function(){
        $('.showMe').show();
    });
</script>

jsFiddle: http://jsfiddle.net/Q2wfM/

Yine de üçüncü bir yol, slideTogglebazı etkilere izin veren jQuery yöntemini kullanmaktır . Mesela $('#showMe').slideToggle('slow');hangi yavaşça gizli div gösterecektir.


Sayfada bu showMe öğelerinden birden fazlasına sahip olduğunu varsayalım. Unutmayın, o bunların bir listesini oluşturmak için bir for döngüsü kullandığından, class = "showMe" öğesini hedeflemek o öğenin yalnızca ilk örneğini etkileyecektir. Önerim, tıklananla ilişkili olarak showMe öğesine başvurmaktır. O zaman bu iyi bir çözüm olur. Bu yardımcı olur umarım! :)
jmort253

Doğru, ancak listeyi bir dizi <li>öğe içinde oluşturmak için döngüyü kullanıyor, div'ler değil. Her iki durumda da, öğe kimliğini daha sonra gizlemek için kullanabilirdi.
Michael Hawkins

Alt bölümleri düşünüyorsunuz ve bunlardan daha fazlasının olacağını unutuyorsunuz. Her bölüm , bir alt bölümdeki li öğeleriyle doldurulur . "Bu liste, veritabanımdaki bilgilerle oluşturulan bir foreach döngüsü tarafından oluşturulur. Her öğe farklı bölümlere sahip bir kaptır, bu nedenle bu 1, 2, 3 ... gibi bir liste değildir. Bilgiyle tekrar eden bölümleri listeliyorum. . Her bölümde bir alt bölüm var. " kısacası, daha fazlası olsa da size sadece bir bölüm gösterdi.
jmort253

6

Bir panel / div'i genişletmek veya daraltmak için bir bağlantıya tıklandığında çağrılacak bu basit Javascript yöntemine bir göz atmak isteyebilirsiniz.

<script language="javascript"> 
function toggle(elementId) {
    var ele = document.getElementById(elementId);
    if(ele.style.display == "block") {
            ele.style.display = "none";
    }
    else {
        ele.style.display = "block";
    }
} 
</script>

Div kimliğini iletebilirsiniz ve "yok" veya "engelle" arasında geçiş yapacaktır.

Orijinal kaynak snip2code - Nasıl html bir div daraltmak için


6

Burada birçok sorun var

Sizin için çalışan bir keman oluşturdum: http://jsfiddle.net/w9kSU/

$('.majorpointslegend').click(function(){
    if($(this).text()=='Expand'){
        $('#mylist').show();
        $(this).text('Colapse');
    }else{
        $('#mylist').hide();
        $(this).text('Expand');
    }
});

3

jquery deneyin,

  <div>
        <a href="#" class="majorpoints" onclick="majorpointsexpand(" + $('.majorpointslegend').html() + ")"/>
        <legend class="majorpointslegend">Expand</legend>
        <div id="data" style="display:none" >
            <ul>
                <li></li>
                <li></li>
            </ul>
        </div>
    </div>


function majorpointsexpand(expand)
    {
        if (expand == "Expand")
            {
                $('#data').css("display","inherit");
                $(".majorpointslegend").html("Collapse");
            }
        else
            {
                $('#data').css("display","none");
                $(".majorpointslegend").html("Expand");
            }
    }

3

Burada animasyon örneğim, açıklamayı genişleten bir personel listesi var.

<html>
  <head>
    <style>
      .staff {            margin:10px 0;}
      .staff-block{       float: left; width:48%; padding-left: 10px; padding-bottom: 10px;}
      .staff-title{       font-family: Verdana, Tahoma, Arial, Serif; background-color: #1162c5; color: white; padding:4px; border: solid 1px #2e3d7a; border-top-left-radius:3px; border-top-right-radius: 6px; font-weight: bold;}
      .staff-name {       font-family: Myriad Web Pro; font-size: 11pt; line-height:30px; padding: 0 10px;}
      .staff-name:hover { background-color: silver !important; cursor: pointer;}
      .staff-section {    display:inline-block; padding-left: 10px;}
      .staff-desc {       font-family: Myriad Web Pro; height: 0px; padding: 3px; overflow:hidden; background-color:#def; display: block; border: solid 1px silver;}
      .staff-desc p {     text-align: justify; margin-top: 5px;}
      .staff-desc img {   margin: 5px 10px 5px 5px; float:left; height: 185px; }
    </style>
  </head>
<body>
<!-- START STAFF SECTION -->
<div class="staff">
  <div class="staff-block">
    <div  class="staff-title">Staff</div>
    <div class="staff-section">
        <div class="staff-name">Maria Beavis</div>
        <div class="staff-desc">
          <p><img src="http://www.craigmarlatt.com/canada/images/security&defence/coulombe.jpg" />Maria earned a Bachelor of Commerce degree from McGill University in 2006 with concentrations in Finance and International Business. She has completed her wealth Management Essentials course with the Canadian Securities Institute and has worked in the industry since 2007.</p>
        </div>
        <div class="staff-name">Diana Smitt</div>
        <div class="staff-desc">
          <p><img src="http://www.craigmarlatt.com/canada/images/security&defence/coulombe.jpg" />Diana joined the Diana Smitt Group to help contribute to its ongoing commitment to provide superior investement advice and exceptional service. She has a Bachelor of Commerce degree from the John Molson School of Business with a major in Finance and has been continuing her education by completing courses.</p>
        </div>
        <div class="staff-name">Mike Ford</div>
        <div class="staff-desc">
          <p><img src="http://www.craigmarlatt.com/canada/images/security&defence/coulombe.jpg" />Mike: A graduate of École des hautes études commerciales (HEC Montreal), Guillaume holds the Chartered Investment Management designation (CIM). After having been active in the financial services industry for 4 years at a leading competitor he joined the Mike Ford Group.</p>
        </div>
    </div>
  </div>

  <div class="staff-block">
    <div  class="staff-title">Technical Advisors</div>
    <div class="staff-section">
        <div class="staff-name">TA Elvira Bett</div>
        <div class="staff-desc">
          <p><img src="http://www.craigmarlatt.com/canada/images/security&defence/coulombe.jpg" />Elvira has completed her wealth Management Essentials course with the Canadian Securities Institute and has worked in the industry since 2007. Laura works directly with Caroline Hild, aiding in revising client portfolios, maintaining investment objectives, and executing client trades.</p>
        </div>
        <div class="staff-name">TA Sonya Rosman</div>
        <div class="staff-desc">
          <p><img src="http://www.craigmarlatt.com/canada/images/security&defence/coulombe.jpg" />Sonya has a Bachelor of Commerce degree from the John Molson School of Business with a major in Finance and has been continuing her education by completing courses through the Canadian Securities Institute. She recently completed her Wealth Management Essentials course and became an Investment Associate.</p>
        </div>
        <div class="staff-name">TA Tim Herson</div>
        <div class="staff-desc">
          <p><img src="http://www.craigmarlatt.com/canada/images/security&defence/coulombe.jpg" />Tim joined his father&#8217;s group in order to continue advising affluent families in Quebec. He is currently President of the Mike Ford Professionals Association and a member of various other organisations.</p>
        </div>
    </div>
  </div>
</div>
<!-- STOP STAFF SECTION -->

<script src="http://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 

<script language="javascript"><!--
//<![CDATA[
$('.staff-name').hover(function() {
    $(this).toggleClass('hover');
});
var lastItem;
    $('.staff-name').click(function(currentItem) {
        var currentItem = $(this);
      if ($(this).next().height() == 0) {
          $(lastItem).css({'font-weight':'normal'});
          $(lastItem).next().animate({height: '0px'},400,'swing');
          $(this).css({'font-weight':'bold'});
          $(this).next().animate({height: '300px',opacity: 1},400,'swing');
      } else {
          $(this).css({'font-weight':'normal'});
          $(this).next().animate({height: '0px',opacity: 1},400,'swing');
      }
      lastItem = $(this);
    });
//]]>
--></script>

</body></html>

Vaktini boşa harcamak


3

toggle() JQuery işlevine bir göz atın :

http://api.jquery.com/toggle/

Ayrıca, innerHTML jQuery İşlevi .html().


1
Merhaba, Stack Overflow'a hoş geldiniz! Bir örnek göstermelisiniz ki cevabınız daha eksiksiz olsun. Bağlantı koparsa, cevabınız gelecekteki ziyaretçiler için yine de yararlı olacaktır. İyi şanslar! :)
jmort253

Bir örnek eklemek için düzenleyebilir misiniz yoksa bunu bir yorum olarak ekleyebilir misiniz? Teşekkürler.
JGallardo

2

Sayfada jQuery bulunduğundan, bu onclicközniteliği ve majorpointsexpandişlevi kaldırabilirsiniz . Aşağıdaki komut dosyasını sayfanızın altına veya tercihen harici bir .js dosyasına ekleyin:

$(function(){

  $('.majorpointslegend').click(function(){
    $(this).next().toggle().text( $(this).is(':visible')?'Collapse':'Expand' );
  });

});

Bu çözüm HTML'nizle olduğu gibi çalışmalıdır, ancak gerçekten çok sağlam bir yanıt değildir. fieldsetDüzeninizi değiştirirseniz, bozulabilir. classBu gizli div'e bir öznitelik class="majorpointsdetail"eklemenizi ve bunun yerine şu kodu kullanmanızı öneririm :

$(function(){

  $('.majorpoints').on('click', '.majorpointslegend', function(event){
    $(event.currentTarget).find('.majorpointsdetail').toggle();
    $(this).text( $(this).is(':visible')?'Collapse':'Expand' );
  });

});

Obs: Sorunuzda kapanış </fieldset>etiketi yok , bu yüzden gizli div'in alan kümesinin içinde olduğunu varsayıyorum.


Haklısın. Kapanış alanı var, ancak sorumu kaçırdım. Kapanış iç kısmından hemen sonra </div> ve kapanış dış
cephesinden

1

Veri rolünü daraltılabilir kullandıysanız, ör.

    <div id="selector" data-role="collapsible" data-collapsed="true">
    html......
    </div>

sonra genişletilmiş div'i kapatır

    $("#selector").collapsible().collapsible("collapse");   

1

Jed Foster'ın Readmore.js'sine göz atın kitaplığına .

Kullanımı şu kadar basit:

$(document).ready(function() {
  $('article').readmore({collapsedHeight: 100});
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.10.0/jquery.min.js"></script>
<script src="https://fastcdn.org/Readmore.js/2.1.0/readmore.min.js" type="text/javascript"></script>

<article>
  <p>From this distant vantage point, the Earth might not seem of any particular interest. But for us, it's different. Consider again that dot. That's here. That's home. That's us. On it everyone you love, everyone you know, everyone you ever heard of, every human being who ever was, lived out their lives. The aggregate of our joy and suffering, thousands of confident religions, ideologies, and economic doctrines, every hunter and forager, every hero and coward, every creator and destroyer of civilization, every king and peasant, every young couple in love, every mother and father, hopeful child, inventor and explorer, every teacher of morals, every corrupt politician, every "superstar," every "supreme leader," every saint and sinner in the history of our species lived there – on a mote of dust suspended in a sunbeam.</p>

  <p>Space, the final frontier. These are the voyages of the starship Enterprise. Its five year mission: to explore strange new worlds, to seek out new life and new civilizations, to boldly go where no man has gone before!</p>

  <p>Here's how it is: Earth got used up, so we terraformed a whole new galaxy of Earths, some rich and flush with the new technologies, some not so much. Central Planets, them was formed the Alliance, waged war to bring everyone under their rule; a few idiots tried to fight it, among them myself. I'm Malcolm Reynolds, captain of Serenity. Got a good crew: fighters, pilot, mechanic. We even picked up a preacher, and a bona fide companion. There's a doctor, too, took his genius sister out of some Alliance camp, so they're keeping a low profile. You got a job, we can do it, don't much care what it is.</p>

  <p>Space, the final frontier. These are the voyages of the starship Enterprise. Its five year mission: to explore strange new worlds, to seek out new life and new civilizations, to boldly go where no man has gone before!</p>
</article>

Widget'ınızı yapılandırmak için kullanabileceğiniz seçenekler şunlardır:

{
  speed: 100,
  collapsedHeight: 200,
  heightMargin: 16,
  moreLink: '<a href="#">Read More</a>',
  lessLink: '<a href="#">Close</a>',
  embedCSS: true,
  blockCSS: 'display: block; width: 100%;',
  startOpen: false,

  // callbacks
  blockProcessed: function() {},
  beforeToggle: function() {},
  afterToggle: function() {}
},

Kullanım şu şekilde kullanabilir:

$('article').readmore({
  collapsedHeight: 100,
  moreLink: '<a href="#" class="you-can-also-add-classes-here">Continue reading...</a>',
});

Umut ediyorum bu yardım eder.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.