2017-11-15 16 views
-1

jQueryを使用してドロップダウンアコーディオンメニューを作成しています。 以前はいくつかのバージョンで作業していましたが、イメージの切り替えを追加する前にスクリプトをうまく動作させることができます。jQueryがテキストと画像を切り替えません。

イメージトグルスクリプトを追加した後は、トグル全体がうまく機能していません。

$(function() { 
 
    $('.showmore').click(
 
    function() { 
 
     $(this).closest("div").next(".dropdown").toggle(); 
 
     $(this).find('i').toggleClass('arrow-down arrow-up'); 
 
     if ($(this).text() == "Show") { 
 
     $(this).text("Hide"); 
 
     } else { 
 
     $(this).text("Show"); 
 
     } 
 
     $(this).closest("div").next(".dropdown").toggleClass('selected'); 
 
    } 
 
) 
 
})
.title { 
 
    background-color: #CCCCCC; 
 
} 
 

 
.sprite { 
 
    background-image: url(https://image.ibb.co/bHTF8R/pinkarrow.png); 
 
    background-repeat: no-repeat; 
 
    display: block; 
 
} 
 

 
.arrow-down { 
 
    width: 9px; 
 
    height: 6px; 
 
    background-position: -9px 0; 
 
} 
 

 
.arrow-up { 
 
    width: 9px; 
 
    height: 6px; 
 
    background-position: 0 0; 
 
} 
 

 
.arrow-down, 
 
.arrow-up { 
 
    display: inline-block; 
 
    padding-left: 5px; 
 
} 
 

 
.dropdown { 
 
    display: none; 
 
} 
 

 
.selected { 
 
    border: 4px solid #CCCCCC; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script> 
 
<div class="content"> 
 
    <div class="title"> 
 
    <span class="showmore">Show<i class="sprite arrow-down"></i></span> 
 
    </div> 
 
    <!--End of class Title--> 
 

 
    <div class="dropdown"> 
 
    XXXXXXXXXX Content XXXXXXXXXX 
 
    </div> 
 
</div>

だから、私は何をしたいということです。もともと内容はタイトル下矢印アイコンが表示されていると、「ショー」で、非表示になります。タイトルをクリックすると、非表示のコンテンツが表示され、タイトルが「非表示」に変わり、矢印の上にアイコンが表示されます。

元々私はこれらのテキストでトグルを達成することができますが、イメージトグルスクリプトを追加しようとすると、それは機能しません。

$(this).find('i').toggleClass('arrow-down arrow-up'); 

誰でもあなたの意見や意見を交換することができますか?私の質問を読んでいただきありがとうございました!

+0

フィドルは素晴らしいですが、すべての関連するコードを質問に入れてください。 jsFiddleがダウンすると、あなたの質問は答えられないでしょう。問題については、私が質問に編集したスニペットを実行して「表示」をクリックすると、かなり明らかになるようです... –

+0

ブラウザのコンソールにエラーメッセージが表示されます。 – David

+0

@RoryMcCrossanあなたの編集と懸念に感謝します。私は本当にあなたのような良い方法でここにコードを配置する方法ではないので、私はちょうどjsFiddleを使用しました。ご報告いただきありがとうございます。 – Sammi

答えて

1

あなたがこれを行うとき:

$(this).text("any text"); 

をあなたは矢印として使用している<i>要素を削除。結果のマークアップは次のようになります。

<span class="showmore">any text</span> 

<i>が今なくなっているので、切り替えするものは何もありません。代わりに、テキストを保持するために子要素を作成し、全体の要素内のテキストを設定する:

$(this).find("span").text("any text"); 

デモ:

<span class="showmore"> 
    <span>Show</span> 
    <i class="sprite arrow-down"></i> 
</span> 

次に、あなたがテキストを設定するには、その特定の要素をターゲットにすることができます:

$(function() { 
 
    $('.showmore').click(
 
    function() { 
 
     $(this).closest("div").next(".dropdown").toggle(); 
 
     $(this).find('i').toggleClass('arrow-down arrow-up'); 
 
     if ($(this).find("span").text() == "Show") { 
 
     $(this).find("span").text("Hide"); 
 
     } else { 
 
     $(this).find("span").text("Show"); 
 
     } 
 
     $(this).closest("div").next(".dropdown").toggleClass('selected'); 
 
    } 
 
) 
 
})
.title { 
 
    background-color: #CCCCCC; 
 
} 
 

 
.sprite { 
 
    background-image: url(https://image.ibb.co/bHTF8R/pinkarrow.png); 
 
    background-repeat: no-repeat; 
 
    display: block; 
 
} 
 

 
.arrow-down { 
 
    width: 9px; 
 
    height: 6px; 
 
    background-position: -9px 0; 
 
} 
 

 
.arrow-up { 
 
    width: 9px; 
 
    height: 6px; 
 
    background-position: 0 0; 
 
} 
 

 
.arrow-down, 
 
.arrow-up { 
 
    display: inline-block; 
 
    padding-left: 5px; 
 
} 
 

 
.dropdown { 
 
    display: none; 
 
} 
 

 
.selected { 
 
    border: 4px solid #CCCCCC; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script> 
 
<div class="content"> 
 
    <div class="title"> 
 
    <span class="showmore"> 
 
     <span>Show</span> 
 
     <i class="sprite arrow-down"></i> 
 
    </span> 
 
    </div> 
 
    <!--End of class Title--> 
 

 
    <div class="dropdown"> 
 
    XXXXXXXXXX Content XXXXXXXXXX 
 
    </div> 
 
</div>

(注:私のブラウザでは、「上向き矢印」のスタイリングは正しく表示されません。おそらくいくつかの調整が必要です。)

+0

詳細なソリューションをお寄せいただきありがとうございます、David!私は.text()について少し誤解しています。本当にありがとうございました。私の問題は今解決されました!ありがとう!!! – Sammi

1
$(this).closet("div") 

は次のようになります。

$(this).closest("div") 
+0

これは構文エラーを修正しますが、OPの実際の質問には対処しません。 –

関連する問題