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

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

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

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

Q&A

解決済

2回答

3635閲覧

ラジオボタンに応じてクラスを切り替える方法

退会済みユーザー

退会済みユーザー

総合スコア0

JavaScript

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

0グッド

0クリップ

投稿2018/02/06 02:56

###■やりたいこと
ラジオボタンに応じてクラスを切り替える方法を模索しています。

「ピカ」と「ふわ」のラジオボタンがあり

★「ピカ」を選択して「実行」する場合
→「1回目」がピカっと表示された後に、「2回目」がずっと表示される。

★「ふわ」を選択して「実行」する場合
→「1回目」がふわっと表示された後に、「2回目」がずっと表示される。

という切り替えのためのクラス変更です。

###■ダメだったコード
次のように書いてみたのですけれど、クラス変更がうまくいきません。

html

1<!--ラジオボタン--> 2<li class="selectterm" data-label="HuwaPika"> 3 <div class="label"> 4 <label for="selectterm">ピカふわ選択</label> 5 </div> 6 <div class="fields" data-required="no" data-type="radio"> 7 <label class="radio-block"> 8 <input name="selectterm" class="" value="pika1" type="radio" checked="checked" >ピカ 9 </label> 10 <label class="radio-block"> 11 <input name="selectterm" class="" value="huwa1" type="radio">ふわ 12 </label> 13 </div> 14</li> 15 16<!--ふんわり--> 17<div class="osu">実行</div> 18 <div class="changeterm pika1"> 19 <p>1回目</p> 20 </div> 21 <div class="changeterm pika2"> 22 <p>2回目</p> 23</div>

javascript

1 2 $('.osu').on("click",function(){ 3 $('.pika1').fadeIn(100).delay(100).fadeOut(100); 4 $('.pika2').delay(300).fadeIn(100); 5 }); 6 7 $('.osu').on("click",function(){ 8 $('.huwa1').fadeIn(1000).delay(1000).fadeOut(1000); 9 $('.huwa2').delay(3000).fadeIn(1000); 10 }); 11 12$('input[name=selectterm]').on('change', function() { 13 $('.changeterm').removeClass('pika1 huwa1').addClass($(this).val()); 14 }); 15 16$('input[name=selectterm]').on('change', function() { 17 $('.changeterm').removeClass('pika2 huwa2').addClass($(this).val()); 18 }); 19 20 21

上のコードの動きはこちら☟です。
https://jsfiddle.net/8Lxdywhb/1/

ご覧のように、ラジオボタンを「ふわ」に切り替えたときに、「pika2」が「huwa2」にならず、なぜか「pika1」になってしまうのです。

どうにかして、上のやりたいことが達成できるようにご指摘頂けませんでしょうか?

宜しくお願い致します。

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

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

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

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

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

guest

回答2

0

ベストアンサー

そりゃ、同じ要素に対して、同じ名前のイベント追加すればそうなりますよ。
ラジオボタンをクリックした時に、そのvalue値を取ってきて、
付与するchangeイベントは一個にし、
それに応じて消すクラスを決めればいいんです。

以下でいかがでしょうか?

javascript

1$('.osu').on("click",function(){ 2 $('.changeterm').hide(); 3 4 $('.pika1').fadeIn(100).delay(100).fadeOut(100); 5 $('.pika2').delay(300).fadeIn(100); 6 7 $('.huwa1').fadeIn(1000).delay(1000).fadeOut(1000); 8 $('.huwa2').delay(3000).fadeIn(1000); 9 10 $('.jito').fadeIn(1000).delay(1000); 11}); 12 13 14$('input[name=selectterm]').on('change', function() { 15 //var targetClass = $(this).val() == "pika1" ? 'pika2' : 'huwa2'; 16 //var removeClass = $(this).val() == "pika1" ? 'huwa1 huwa2' : 'pika1 pika2'; 17 //var addClass = $(this).val() == "pika1" ? 'pika2' : 'huwa2'; 18 19 // 先に追加する、消すクラス文字列を入れる変数を定義 20 var removeClass, 21 addClass; 22 23 // switch構文で、条件に合った処理を行う 24 switch ($(this).val()) { 25 case "pika1": 26 removeClass = 'huwa1 huwa2 jito'; 27 addClass = 'pika2'; 28 break; 29 case "huwa1": 30 removeClass = 'pika1 pika2 jito'; 31 addClass = 'huwa2'; 32 break; 33 case "jito": 34 removeClass = 'pika1 pika2 huwa1 huwa2'; 35 // addClass = 'jito'; 36 break; 37 default: 38 break; 39 } 40 41 // 共通の処理、1個目の処理を行う 42 $('.changeterm').eq(0).removeClass(removeClass).addClass($(this).val()); 43 // ここでは、共通の処理、クラスを消す、だけを行う 44 $('.changeterm').eq(1).removeClass(removeClass); 45 46 // クラスの追加は、jito以外で行うので、条件式で分ける 47 if ($(this).val() != "jito") { 48 $('.changeterm').eq(1).addClass(addClass); 49 } 50 51 52});

投稿2018/02/06 03:12

編集2018/02/07 01:34
miyabi_takatsuk

総合スコア9528

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

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

退会済みユーザー

退会済みユーザー

2018/02/06 03:19

ありがとうございます!! ただ、残念ながら、どうやら思っているのと違うようです。って、質問が分かりにくいですよね。 「ふわ」を選択している状態では、「huwa1とhuwa2」の組み合わせになってほしい。 そして、「ピカ」を選択している状態では、「pika1とpika2」の組み合わせになってほしい。 と、いう感じです。
miyabi_takatsuk

2018/02/06 03:31

なるほど、 ご期待に沿うような形に修正できたと思います。 試して観てください。
miyabi_takatsuk

2018/02/06 04:20

pika1の時は、実行すると、 pika1表示、消えた後にpika2がずっと表示。 huwaに切り替えて、実行時に、 huwaでpikaと同じ動作をする、でよろしいでしょうか? そのように動くよう修正できたと思いますので、試して観てください。
退会済みユーザー

退会済みユーザー

2018/02/06 04:37

ご連絡おそくなってしまって申し訳ございません。さきほど試させて頂き、でもちょっと上手くいかず、ひとまず後回しにしてmiyabi-sunさんの方を試しておりました。。 しかも、ひどいことに、、 どうやら上手くいかずの原因は、私が勝手に変なところを変えていたせいのようでした。。 今確認しましたところmiyabi_takatsukさんのご回答でも正しく動きました!! 何度もご丁寧に対応頂き、誠にありがとうございます。m(_ _)m
退会済みユーザー

退会済みユーザー

2018/02/06 10:46

こんばんは。たびたびすみません。実は、、 3つ目の追加で悩んでおります。 https://jsfiddle.net/8Lxdywhb/4/ 「じと」(1回目だけがずっと表示され、2回目は表示されない)というやつがもう一人いまして、これは追加だけなのだから簡単だろう、と思っておりましたら、サッパリうまくいかず、どうかもう一度ご教示頂くわけにはいきませんでしょうか…?
miyabi_takatsuk

2018/02/07 00:57 編集

じとの処理を追加しました。 三つ以上になると、if構文だと難しくなってしまうので、 switch構文に切り替えています。 一つの処理を追加するだけでも、連動して、処理の仕方を変えなければいけない場合があります。 特に今回の場合は、最初は二つの条件だけだったので、 三項演算子(変数を定義する際、if文を一行で簡略して書くやり方です。条件式 ? trueの時 : falseの時 ってやつです)というものを使わせていただきましたが、 三つ以上の条件となると、三項演算子は使うべきではなく、 (というか、変数定義以外にもいろいろやる場合は、三項演算子は使うべきじゃない) switchを使ったほうが、いいやり方になってきます。
退会済みユーザー

退会済みユーザー

2018/02/07 01:10

そうなのですね。ifを書くとjsfiddleが「おかしいぞ」と丸ポチで指摘してくれるのですけれど、何が?とまったくわけが分からなかったです。ひとまず2つに要件を変更して作っていたので、本当に助かります。ジト、どうもありがとうございます!本日はカラっとした良い朝ですね!
退会済みユーザー

退会済みユーザー

2018/02/07 15:58 編集

ところで、これはあくまで、ところで、、なのですけれども、、 なぜチェックボックスだと出来なくなってしまうのでしょうか? https://jsfiddle.net/rr9w8297/ ラジオでの三択でなく、チェックのon off二択による、チカフワ切り替えです。 それらしいところをラジオからチェックにしただけではダメで、クラスを切り替える複雑なところも変えないといけないのでしょうか?
miyabi_takatsuk

2018/02/08 00:44

そうですね。 ラジオボタンだと、inputのvalue値が必ず一つとなりますが、 チェックボックスだと、複数選択が可能で、 value値が配列となるので、処理がけっこう変わってしまいます。 もし、解決必要なら新たに質問を立ててはいかがでしょうか。
退会済みユーザー

退会済みユーザー

2018/02/08 07:19

ありがとうございます! >inputのvalue値が必ず一つとなりますが、 チェックボックスだと、複数選択が可能で なるほど~、仕組みきちんと理解されていると、できるかどうかがすぐにわかるものですね。 どうもありがとうございます。そうですね。全く別質問なので、少し調べてみてから後で立てるかもしれません。
guest

0

JSの書き方が駄目です!

JavaScript

1$('.osu').on("click",function(){ 2 ...省略 3 4$('.osu').on("click",function(){ 5 ...省略

上下のこれは同じものを指してますよね?
「実行ボタン」をクリックすると、両方共が実行されますよ!
下の.on('change'も同様ですね。

これに対抗する為にクラスを付与したり消したりしてるようですが、
この使い方だとかなり混乱するはずです。
JS世界で変数を定義してしまうのが簡単なやり方でしょう。

JavaScript

1$(function(){ 2 var target = "pika"; 3 4 $('input[name=selectterm]').on('change', function() { 5 target = $(this).val(); 6 }); 7 8 $('.osu').on("click",function(){ 9 if (target === "pika") { 10 $('.pika1').fadeIn(100).delay(100).fadeOut(100); 11 $('.pika2').delay(300).fadeIn(100); 12 } else { 13 $('.huwa1').fadeIn(1000).delay(1000).fadeOut(1000); 14 $('.huwa2').delay(3000).fadeIn(1000); 15 } 16 }); 17});

こんな感じですかね。
HTMLのラジオボタンの値をpikahuwaにしないと動作しなさそうですが、
調整して試してみてください。


【コメント対応版】

表示状態の「2回目」が表示されっぱなしになって邪魔で困ってるんですよね?
実行開始と同時に消してみてはどうでしょうか?

JavaScript

1$(function(){ 2 var target = "pika"; 3 4 $('input[name=selectterm]').on('change', function() { 5 target = $(this).val(); 6 }); 7 8 $('.osu').on("click",function(){ 9 $('.pika2').add('.huwa2').fadeOut(0); 10 if (target === "pika") { 11 $('.pika1').fadeIn(100).delay(100).fadeOut(100); 12 $('.pika2').delay(300).fadeIn(100); 13 } else { 14 $('.huwa1').fadeIn(1000).delay(1000).fadeOut(1000); 15 $('.huwa2').delay(3000).fadeIn(1000); 16 } 17 }); 18});

投稿2018/02/06 03:16

編集2018/02/06 04:02
miyabi-sun

総合スコア21158

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

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

退会済みユーザー

退会済みユーザー

2018/02/06 03:24 編集

おお、ありがとうございます。かなり思っているのと近いです。 https://jsfiddle.net/8Lxdywhb/2/ せっかくなのですけれど、「ふわ」と「ピカ」を自由に何度でも行き来できるようにはできませんでしょうか……? クラスを付与したり消したりで、そんなふうに自由にポチポチ行き来できる機能を頑張ろうとしたのですが、うまくいかず、そろそろ泣きそうなのです。笑
miyabi-sun

2018/02/06 03:28

> 自由に行き来できる ん?もう少し具体的に頼みます。 私が実装からこうかもしれないと考えた内容としては、こんな感じですか? ・ピカピカは0.1秒の点滅、ふわふわは1秒の点滅 ・今はfadeOutで勝手に終わってるけど、本来は実行押したらずっとピカピカorふわふわしてほしい ・そしてピカピカ実行している途中にラジオボタンでふわふわを選択すると、ピカピカしているのが即時ふわふわに切り替わってほしい
退会済みユーザー

退会済みユーザー

2018/02/06 03:52

たびたび不明瞭な表現で申し訳ございません。。 ■「ふわ」を選択したら、ふわバージョンに。 →実行を押すと「1回目」がふわっと表示される。 その後に「2回目」がふわっと表示されてそのままずっと残る。 ■「ピカ」を選択したら、ピカバージョンに。 →実行を押すと「1回目」がピカっと表示される。その後に「2回目」がピカっと表示されてそのままずっと残る。 という、このふわバージョンとピカバージョンを、何度も選択したり戻したりできる。実行を押して、何度も確認できる。 そんな状態を目指して、お昼ご飯ナシで頑張っております。笑
miyabi-sun

2018/02/06 04:03

足りないのは初期化処理ですね。 実行開始時のあるべき状態にする→実行→実行終了時のあるべき状態にする これが重要です。 編集しましたので実行してみてください。
退会済みユーザー

退会済みユーザー

2018/02/06 04:19

たびたびのご返信、誠にありがとうございます。 初期化ですね。うぅぅうん、、難しいです。 今回のご対応版、ほぼ、もうほぼほぼできています。。 https://jsfiddle.net/8Lxdywhb/3/ 「ピカ→ふわ」のときの切り替えは何度でも出来て、まさに理想通りです。ただ、 「ふわ→ピカ」のときだけ、なぜか「ふわのまま」のようなのですが、、何かさじ加減ございませんでしょうか?(ほんっとすみません。)
miyabi-sun

2018/02/06 04:26

<input name="selectterm" class="" value="pika1" type="radio" checked="checked" >ピカ <input name="selectterm" class="" value="huwa1" type="radio">ふわ 質問文にあるようにHTMLを修正してください、 このvalueの値「pika1」と「huwa1」を。。。 <input name="selectterm" class="" value="pika" type="radio" checked="checked" >ピカ <input name="selectterm" class="" value="huwa" type="radio">ふわ このように修正すればふわ→ピカが正常動作するはずです。
miyabi-sun

2018/02/06 04:27

ただ、ふわの発生が遅すぎて、 2回目がフェードインし始めている最中にピカに切り替えて実行すると変な挙動になりますね。 これはCSSアニメーションを利用してクラスを付け外しした方が良いかもしれません。
退会済みユーザー

退会済みユーザー

2018/02/06 04:30

たいっへん申し訳ございません”!”! 何を思って変えたのやら、、まったく理解できません。笑 これならば!おかげさまで無事本番に実装できそうです。 このたびは御昼時に誠にありがとうございます。。 「おしえて」「おしえて」と、なんども失礼致しました。
退会済みユーザー

退会済みユーザー

2018/02/06 04:32

あ、それは確認しておりませんでした。わざわざご報告痛み入ります。けれど、そんなに頻繁に変更することはなさそうなので、ひとまず十分でございます。嬉しいよぅーーー……
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問