2017-05-05 1 views
0

このトピックに関する多くの質問を検索しましたが、同様の回答がありますが、うまくいくはずですが、私にとってはうまくいきません。私はDOMのトラバーサルが私の強みではないことを認めているので、解決策があり、いくつかの文脈を与えることができれば、他の解決策がなぜ機能していないのか理解するのに役立ちます。スライドトグルがアクティブにならない

私はボタン付きのdivを持っており、ボタンクリック(このボタンはモバイルにのみ表示されます)では、現在のdivコンテンツのみをスライドさせる必要があります。私はこれを動作させることができますが、問題はすべてのdivsコンテンツを開くことです。ただし、$(this)、$(next)、$(prev)、$(find)などのソリューションを使用しても特定のカードのみを開くことはできません。

私が下に投稿しているコードは、まったく開きません。このコードは、Stack Overflowの回答と最もよく似ているため、このバージョンのコードを使用しています。

$(document).ready(function(){ 
 
\t 
 
\t $('.mobile-icon').on('click', function(){ 
 
\t \t event.preventDefault(); 
 
\t \t $(this).next().find('.card-bottom').slideToggle(); 
 
\t \t console.log('hi there'); //this does print 
 

 
\t }); 
 

 

 
    });
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 

 

 
    <!-- FIRST CARD --> 
 
    <div class="card"> 
 
     <div class="card-top"> 
 
\t  <h1 class="card-title">Headline</h1> 
 
\t \t <a href="#" class="mobile-icon"> <span class="glyphicon glyphicon-plus"></span> </a> 
 
\t \t <p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor.</p> 
 
\t </div> 
 
\t <!-- END CARD-TOP --> 
 
\t \t \t \t 
 
     <div class="card-bottom"> 
 
\t  <p>Content to be toggled</p> 
 
\t </div> 
 
     <!-- END CARD BOTTOM --> 
 
    </div> 
 
    <!-- END CARD --> 
 

 
    <!-- SECOND CARD --> 
 
    <div class="card"> 
 
     <div class="card-top"> 
 
\t  <h1 class="card-title">Headline</h1> 
 
\t \t <a href="#" class="mobile-icon"> <span class="glyphicon glyphicon-plus"></span> </a> 
 
\t \t <p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor.</p> 
 
\t </div> 
 
\t <!-- END CARD-TOP --> 
 
\t \t \t \t 
 
     <div class="card-bottom"> 
 
\t  <p>Content to be toggled</p> 
 
\t </div> 
 
     <!-- END CARD BOTTOM --> 
 
    </div> 
 
    <!-- END CARD -->

+0

。コンソールのエラーが表示されますか? – jmargolisvt

+0

これは私がコードをコピーしていたときに私の代わりにエラーでした。このポストで使用したいコードを取り上げるためにいくつかの変更を取り消していました。私はその舞台にイベントを含めることを忘れていた。事実、私はもともと「イベント」を「e」として渡しました。私は間違いとしてこの投稿から除外しました。同じミスをしているかもしれない人たちのために、私はそれをそのままにしておきます。私はどんなエラーも出ていなかったし、 "こんにちは"コンソールログだけでいいです。ありがとうございました! – user5854648

答えて

0

主な問題は、jQueryの.next().find()を使用している方法です。 $(this)<a> tagなので、次の兄弟を選択する.next()<p> tagです。次に、<p> tag.find()を呼び出すと、その子孫すべてがチェックされます。

したがって、.find()を使用して横断する前に、「カードトップ」と「カードボトム」の両方の親を選択する必要があります。例えば

:()を.parentする

$(document).ready(function(){ 
    $('.mobile-icon').on('click', function(event){ 
     event.preventDefault(); 
     $(this).parent().parent().find('.card-bottom').slideToggle(); 
    }); 
}); 

最初の呼び出しが'card-top' divある<a>タグの親となり、それの.parent()は'card' divあろう。その後、.find()を呼び出すと動作します。あなたはどこにもリンクする必要はありませんので、もしそれがfunction(event)

  • をだeventfunction()に追加class="card>

  • 終値"が欠落してい

    http://www.bootply.com/UMwXaOILHv

  • +0

    これは素晴らしい説明です。私は本当に答えに感謝し、私は私がしたかどうか分からなかった。親()。親()それは2回戻るだろう。デザイナーとしては、これは主に私にとって意味のあることです。なぜなら、私は2つのレイヤーに戻っているからです。あまりにも技術的なことをせずに説明してくれたので、私はあなたの答えを選びました。ありがとうございました。 – user5854648

    +0

    私の喜び:)。 – jisoo

    0
    1. の代わりにdivを使用しますaタグとする必要はありませんpreventDefault

    $('.mobile-icon').on('click', function(event) { 
     
        event.preventDefault(); 
     
        $(this).closest('.card').find('.card-bottom').slideToggle(); 
     
        // .closest finds the nearest .card ancestor (it goes up) 
     
        // .find then finds .card-bottom within the closest .card 
     
    });
    .mobile-icon { 
     
        background-color: black; 
     
        width: 100px; height: 40px; 
     
        color: white; 
     
    }
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
     
    <!-- FIRST CARD --> 
     
    <div class="card"> 
     
        <div class="card-top"> 
     
        <h1 class="card-title">Headline</h1> 
     
        <div class="mobile-icon">click me</div> 
     
        <p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor.</p> 
     
    </div> 
     
    <!-- END CARD-TOP --> 
     
        <div class="card-bottom"> 
     
        <p>Content to be toggled</p> 
     
        </div> 
     
        <!-- END CARD BOTTOM --> 
     
    </div> 
     
    <!-- END CARD --> 
     
    
     
    <!-- SECOND CARD --> 
     
    <div class="card"> 
     
        <div class="card-top"> 
     
        <h1 class="card-title">Headline</h1> 
     
        <a href="#" class="mobile-icon">click me</a> 
     
        <p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor.</p> 
     
    </div> 
     
    <!-- END CARD-TOP --> 
     
        <div class="card-bottom"> 
     
        <p>Content to be toggled</p> 
     
        </div> 
     
        <!-- END CARD BOTTOM --> 
     
    </div> 
     
    <!-- END CARD -->

    あなたがでpreventDefault()を使用するように関数に `event`を渡す必要がありフィドル

    https://jsfiddle.net/Hastig/m2zaLfnz/

    +1

    これは素晴らしい解決策であり、これは本当にうまく機能します。私が使用している実際のコードから不要なクラスを削除していたので、クラスの.cardの欠落は愚かな間違いでした。私はそれを含むオリジナルの投稿を編集しました。あなたの答えはありがとうございます。私が理解できる方法でDOMをどのように横断していたのですか?ありがとうございました! – user5854648

    関連する問題