質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Cookie

HTTPにおけるCookieとは、クライアントのウェブブラウザ上に保存された一時的なデータを指します。クライアント側のJavaScriptでも、サーバー側のHTTPヘッダーでもクッキーの読み書き・修正・削除が可能です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Q&A

4回答

10061閲覧

アコーディオンの開閉状態を保持する

chinachica

総合スコア15

Cookie

HTTPにおけるCookieとは、クライアントのウェブブラウザ上に保存された一時的なデータを指します。クライアント側のJavaScriptでも、サーバー側のHTTPヘッダーでもクッキーの読み書き・修正・削除が可能です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

0グッド

0クリップ

投稿2019/06/04 09:50

前提・実現したいこと

javascript入門者です。
(こういうことが書いてあるのかな、、?というレベルです。)

開閉式のアコーディオンを作成したいのですが、ネット上のサンプルを触りながら試行錯誤しています。

・はじめから開いた状態にしたい
・閉じたら閉じた状態、開いたら開いた状態をリロードやページ遷移したあとでも保持させたいのです。
・現在、jquery.cookie.jsを参考にしてるのですが、js.cookie.jsでの書き方も教えていただけましたら幸いです。

該当のソースコード

<script> $(function(){ if($.cookie("open-box")){ $("#box").show(); } $("#btn").click(function() { if($.cookie("open-box")){ $("#box").slideUp(); $.removeCookie("open-box" , { path: "/" }); } else { $("#box").slideDown(); $.cookie("open-box" , "open" , { expires: 7, path: "/" }); } return false; }); }); </script>
<style> #box { display: none;} </style>
<p id="btn">ボタン</p> <div id="box">テストテストテストテストテスト</div>

試したこと

サンプルを参考に上記のようにしてみたのですが、はじめから開いた状態になりません。
display: none;をかけてるせいかもしれないのですが、これを取ると、閉じた状態でリロードすると、閉じた状態で保持されずに開いた状態になってしまうのです。

教えていただけましたら幸いです。
よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

x_x

2019/06/05 01:49

再現しませんが、ローカルでテストしているのでしょうか?
guest

回答4

0

URLハッシュを使う方法が複数提案されていますが、ハッシュはフラグメント識別子として利用する為にあるので、その役割を期待しないなら使うべきではないと感じます。
期待するなら、:target 疑似クラスを利用すれば、JavaScriptが不要になります。
(アニメーション機能が必要であれば、animation プロパティを併用)

以下、出先の為、未検証。

CSS

1#box:not(:target) { 2 display: none; 3}

HTML

1<a href="#box">box</a> 2<div id="box">box contents</div>

Re: chinachica さん

投稿2019/06/05 03:57

think49

総合スコア18164

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

x_x

2019/06/05 04:00

アンカーは考えたのですが、やはりスクリプトがないと閉じられないというのが問題ではないかと
think49

2019/06/05 09:13

@x_x さん 閉じるだけなら、<a href="#">で可能てす。 元々、ページ内位置指定スクロールの為にある機能なので、「ついでに開く」という程度のもので、開く/閉じるのフラグ管理にハッシュを使うのは用途が誤っていると考えています。 本来の用途はスクロールさせる事ですから。
x_x

2019/06/05 09:22

どうやって<a href="#box">を<a href="#">にするのですか? やはりスクリプトはいるのでは?
think49

2019/06/05 09:27 編集

toggleが必要なら、:checked で実装可能と思います。
think49

2019/06/05 09:30 編集

ただし、:checkedは状態保持が出来ません。 繰り返しますが、ハッシュは「フラグ管理の為の機能ではない」認識です。 要件を100%満たすなら、ハッシュではなく、CookieやlocalStrageをお勧めします。
guest

0

提示コードのみで動作すると思うのですが、ローカル環境で Cookie が使えない
https://teratail.com/questions/101774
とかの場合であれば、Web Storage を使う、hash を使うなどが考えられます。

hash を使うとした場合、URL が変わらないとリロード時に戻ってしまうため、何らかの方法で変更しなければなりません。

jQuery

1 $(location.hash).filter(':hidden').show(); 2 $('#btn').on('click', function(event) { 3 var box = $('#box'); 4 var url = location.origin + location.pathname + (box.is(':visible') ? '' : '#box'); 5 box.slideToggle(); 6 history.replaceState(null, document.title, url); 7 });

https://developer.mozilla.org/ja/docs/Web/Guide/DOM/Manipulating_the_browser_history#replaceState()_%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89
https://momdo.github.io/html/history.html#the-history-interface

投稿2019/06/05 03:20

x_x

総合スコア13749

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

私が先週回答したこちらの方法を使用すれば実装可能

hashを使用するのでjquery.cookie.jsは不要。
https://teratail.com/questions/192091

投稿2019/06/04 21:38

yasutomi

総合スコア2937

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

chinachica

2019/06/05 01:48

ご回答ありがとうございます。 教えていただいたリンクの通りに書いてみたのですが、はじめから開いた状態で表示できたのですが、アコーディオンを閉じた状態でリロードすると、また開いた状態で再表示されてしまいました。 アコーディオンを閉じてリロードすると、そのまま閉じた状態で表示されるにはどうしたらいいでしょうか すみません、、読み返すと質問文がとてもつたなかったです、、
yasutomi

2019/06/05 02:17

URLにhash (#1など) が付いていないと正しく機能しないです。 リンク先の質問者の方は記載されているコードで解決できたので コードが正しく書かれてあれば問題なく動作します。
guest

0

まず第1に「リロードしたら開閉が保持されない」->当たり前です。
例えばアンカーリンクをつけるなどして開閉状態を示すものをつけなければいけません。
アンカーリンクによって動作を分岐(読み込み完了時の開閉を指定)するにはこちらのサイトが参考になると思います。

簡単に言うとJSのifで分岐しているのがわかると思います。そこでもしも#osakaだったら$('.hash').append('<p>大阪です</p>');違ったら$('.hash').append('<p>大阪ではありません</p>');をすると言う意味です。そこをCSSを適応する記述に書き換えればいけると思います。
そこはGoogle等で調べれば多くのやり方が書いてあるので自分のわかりやすい方法でやってみてください。

Javascript

1// URLのアンカー(#以降の部分)を取得 2var urlHash = location.hash;

// URLにアンカーが存在する場合
if(urlHash){
// アンカーが#osakaかどうかを判断する
if (urlHash == '#osaka') {
$('.hash').append('<p>大阪です</p>');
} else {
$('.hash').append('<p>大阪ではありません</p>');
}
}

投稿2019/06/04 11:24

編集2019/06/05 02:11
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

chinachica

2019/06/05 01:48

ご回答ありがとうございます! 開閉状態を示すにはアンカーリンクが必要なのですね。 勉強不足なことばかりです、、 教えていただいサイトを参考にしたかったのですが、恥ずかしながら私の知識では難しいです、、 今後勉強しながら理解できるように努力いたします
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問