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

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

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

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

JavaScript

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

jQuery

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

Q&A

解決済

3回答

2965閲覧

foreach内で選択された値をjsに渡したい

tarao

総合スコア28

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

JavaScript

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

jQuery

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

0グッド

1クリップ

投稿2017/06/29 05:08

foreachで存在する数分のカテゴリformを作り,それぞれボタンが押せるようにしています。
そのボタンをクリックしてajaxで一致するサブカテゴリを呼び出したいのですが、
どのボタンを押しても一番目の値しか入りません。
繰り返し処理中、そのボタンを押した時に入っている値が飛ぶ認識でいました。
ご教示お願いします。

html

1<?php 2 foreach((array)$main as $key => $mains){ 3 ?> 4 <form method="post"> 5 <input type="hidden" name="main_type" class="main-type" value="<?php echo $mains->id ?>"> 6 <input type="hidden" name="cate_name" class="cate-name" value="<?php echo $mains->cate_name ?>"> 7 <button type="button" class="mains-btn"><?php echo $mains->cate_name ?></button> 8 </form> 9 10 <?php 11 } 12 ?>

js

1$(".mains-btn").on('click',function(){ 2 3 var mainType = $(".main-type"); 4 var type = mainType.val(); 5 6 var mainName = $(".cate-name"); 7 var name = mainName.val(); 8 9 10 alert(type+"/"+name); 11 12 });

上記だと全部最初の値だけが表示されます。
selectで試すとうまくいきます↓

html

1<select class="mains-btn"> 2 <?php 3 foreach((array)$main as $key => $mains){ 4 ?> 5 <option value="<?php echo $mains->id ?>"><?php echo $mains->cate_name ?></option> 6 7 <?php 8 } 9 ?> 10</select> 11 12<script> 13$(".mains-btn").on('change',function(){ 14 15 var mainType = $(".mains-btn"); 16 var type = mainType.val(); 17 18 alert(type); 19 }); 20</script>

これはどうしてなのでしょうか?

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

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

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

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

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

guest

回答3

0

それぞれ個別の form が用意されているので、form から取得したほうが楽かもしれませんね。

JavaScript

1 var form = $(this).closest('form')[0]; 2 var type = form.elements['main_type'].value; 3 var name = form.elements['cate_name'].value; 4

HTMLFormElement.elements
https://developer.mozilla.org/ja/docs/Web/API/HTMLFormElement/elements

投稿2017/06/29 05:34

編集2017/06/29 05:57
x_x

総合スコア13749

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

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

yambejp

2017/06/29 05:43

var form = $(this).closest('form').get(0); では?
x_x

2017/06/29 05:55

あ、そうですね。修正します。
tarao

2017/06/29 06:36

回答ありがとうございます! closest('form')でformから直近の親要素を取得して elementsでform内の要素を取得しているのですね。 思い通りの結果を取得できました! ありがとうございました!
guest

0

JavaScript

1$( '.mains-btn' ).on( 'click', function() { 2 var $_t = $( this ).parent(); 3 var mainType = $_t.find( '.main-type' ); 4 var type = mainType.val(); 5 var mainName = $_t.find( '.cate-name' ); 6 var name = mainName.val(); 7 alert(type+'/'+name); 8} );

【jQueryで親要素を取得する:parent(), parents(), closest() | UX MILK】
http://uxmilk.jp/8150

投稿2017/06/29 05:19

kei344

総合スコア69407

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

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

m.ts10806

2017/06/29 05:24

わざわざID振るよりもこっちのほうが変更が少なくて分かりやすかったですね・・・(^0^;)
kei344

2017/06/29 05:29

To: mts10806さん form要素にIDを振るほうが自然かな、と思いますが手抜き回答しました。個人的にIDはあまり使わない(明確に区別すべきものにのみ使う)方法を採ることが多いので、構造が決まっているなら今回の解答のような書き方をすることも有ります。
m.ts10806

2017/06/29 05:32 編集

確かにそうですね。 私の場合、今回の「$mains->id」のようにidが明示されてると使いたくてウズウズしてしまいます・・。
tarao

2017/06/29 06:00

回答ありがとうございます。 教えていただいたコードで思い通りにできました! クリックした.mains-btnの親要素内にある.main-typeの値を取得しているということでしょうか? ここでまた疑問なのですが、別々のidを振らなくてもそれぞれの値を取得できてるのは この親要素が関係しているのですか?
tarao

2017/06/29 07:37

度々すいません。 いただいたサイトを見ながら試して見て、理解することができました! とても参考になりました! どうもありがとうございました。
guest

0

ベストアンサー

これはどうしてなのでしょうか?

同名classがページ内に複数回出てきているためです。
.mains-btnもその他取得情報も全て複数でてきていますよね。
それぞれ適切にIDを振って対応すべきと思います。

追記:

繰り返し処理中、そのボタンを押した時に入っている値が飛ぶ認識でいました。

「繰り返し処理(今回はforeach())」はあくまでサーバーサイドのプログラミング言語の都合であり、
PHPの処理が終了してからHTML出力されます。PHPの処理中に値が飛ぶ(送信される?取得される?ってこと?)ようなことはありません。
今回の場合はあくまで「ボタンクリックしたとき」に値を取得しにいっています。

IDで取得するサンプル

作ってみたものの、あまり美しくないですが、ひとまず参考程度にしてもらえたらと・・・

PHP

1<?php 2 3$main = array( 4 0=>array("id"=>1,"cate_name"=>"a"), 5 1=>array("id"=>2,"cate_name"=>"b"), 6 2=>array("id"=>3,"cate_name"=>"c"), 7); 8 9foreach($main as $key => $mains){ 10 ?> 11 <form method="post" id="form_<?php echo $mains["id"]?>"> 12 <input type="hidden" name="main_type" class="main-type" value="<?php echo $mains["id"]?>"> 13 <input type="hidden" name="cate_name" class="cate-name" value="<?php echo $mains["cate_name"] ?>"> 14 <button type="button" class="mains-btn" data-id="<?php echo $mains["id"] ?>"><?php echo $mains["cate_name"] ?></button> 15 </form> 16 17<?php 18} 19?>

javascript

1$(".mains-btn").on('click',function(){ 2 var formid = "form_" + $(this).data("id"); 3 var mainType = $("#"+ formid +" .main-type"); 4 var type = mainType.val(); 5 var mainName = $("#"+ formid +" .cate-name"); 6 var name = mainName.val(); 7 alert(type+"/"+name); 8}); 9

解説:

  • IDを振るというのはclassの名前の付け方ではなくid属性をつけるという意味です。

ID属性はページ内で唯一の存在であるという意味合いがあり(実際は同名複数可能ですがルール上は1ページ1つ)、jQueryで要素を取得する際にはIDをつけて取得する方がより望ましいとされています。

  • というわけでそれぞれの情報の親要素であるformにIDを振ります。form_{id} とか簡単なもので良いです
  • その他のclass名についてはそのままで結構ですが、親のIDを取得しなければならないのでボタンを押した際にIDを取得できるようにします。

ここではdata属性を使ってますがもっとスマートなやり方がありそうです。

  • クリック時のイベントで自身のボタンについてるデータ属性の値を取得し、formにつけたIDの名前を決定します。
  • あとは $(#ID名 .クラス名)とすることで「指定ID配下にある要素」の情報を取得することができます。

もちろん、IDを振って取得さえできればページ内に1つしか出現しないので、

PHP

1<input type="hidden" name="main_type" class="main-type" id="main-type_<?php echo $mains["id"]?>" value="<?php echo $mains["id"]?>">

のようにしておいて

javascript

1var dataId = $(this).data("id"); 2var mainType = $("#main-type_"+dataId );

と書いても同様ですが、なるべくid振る場所を少なくしたかったのでformにのみ振っています。

投稿2017/06/29 05:22

編集2017/06/29 06:44
m.ts10806

総合スコア80850

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

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

tarao

2017/06/29 05:52

回答ありがとうございます! すごい初歩的なことでした^^; phpの処理が終了してからなんですね。ここら辺がイマイチよくわかっていませんでした。 詳しく教えていただいてありがとうございます。
tarao

2017/06/29 06:15

度々すみません。 mts10806さんのようにidをそれぞれふる場合の方法で理解がまだできていないのですが、 class="main-type<?php echo $mains->id ?>" このようにふったのですが、このクラス名をjsで取得する時にどのようにして表示するのでしょうか? ボタンをクリックした後に別々のクラス名と認識させるために<?php echo $mains->id ?>をjs側に送るにしても、全て同じ値になりますよね...
m.ts10806

2017/06/29 06:17

formだけで良いです。ざっくりサンプル書くので少々お待ちください。
m.ts10806

2017/06/29 06:18

というかid振ってるので全部同じ値にはならないと思いますよ。
tarao

2017/06/29 07:14

とっても細かく説明していただいて、本当にありがとうございます! よくわかりました! <form method="post" id="form_<?php echo $mains["id"]?>"> <button type="button" class="mains-btn" data-id="<?php echo $mains["id"] ?>/<?php echo $mains["cate_name"] ?>"><?php echo $mains["cate_name"] ?></button> </form> ↑このようにhiddenを使わなくても、希望通りに渡すことができました! 今回色々な方法があるのだなと、大変勉強になりました! parent()やclosest()も使っていこうと思います。
m.ts10806

2017/06/29 07:21

まぁ、今回のように既に情報がきてるのであれば buttonに直接 onclick = "hoge('<?= $mains["id"]?>','<?= $mains["cate_name"]?>')" とか書いて function hoge(id,catname) { alert(id+"/"+catname); } でも 十分(hidden不要)だったりしますけどね・・。
tarao

2017/06/29 07:41

今回のパターンだとこれでもいけるのですね。 知識、勉強不足です。 これもまた参考になりました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問