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

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

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

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

JavaScript

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

Smarty

Smartyは、PHPアプリケーションで使用されるテンプレートエンジンです。

Q&A

解決済

2回答

641閲覧

option value selected で選択した値をもとにテキストボックスに反映させるにはどうしたら良いか

kumakumatan

総合スコア213

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

JavaScript

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

Smarty

Smartyは、PHPアプリケーションで使用されるテンプレートエンジンです。

0グッド

0クリップ

投稿2018/01/10 07:56

編集2018/01/12 08:12

●test.js

console.log(document.getElementById('select_test_info')); document.getElementById('select_test_info').addEventListener('change', function(event) { //thisもevent.targetもセレクトボックス要素です console.log(this, event.target, event); var option = this.options[this.selectedIndex]; document.querySelector('input[name^="test_d_name"]').value = option.dataset.disp; document.querySelector('input[name^="test_d_address"]').value = option.dataset.address; }, false);

●test.tpl

<script language="JavaScript" src="test.js?t={$smarty.now}"></script> ・ ・ ・ <h3 class="Test_header">テスト</h3> <table data-role="table" id="test_tab" data-mode="reflow" class="ui-responsive table-stroke"> <thead> <tr> <th width="30%">名前</th> <th width="30%">名</th> <th width="30%">住所</th> <th width="10%">削除</th> </tr> </thead> <tbody id="test_tbody"> {assign var='i' value=0} <tr> <td> <select name="test_info" id="select_test_info" data-native-menu="true"> <option value="">選択してください</option> {section name=idx loop=$test_list} <option value="{$test_list[idx].test_name|escape:"html"}"{if $test_list[idx].test_name == $test_list} selected{/if} data-disp="{$test_list[idx].test_d_name}" data-address="{$test_list[idx].test_address}">{$test_list[idx].test_name}</option> {/section} </select> </td> <td><input type="text" name="test_d_name[{$i}]" value="{$test_list[idx1].test_d_name|escape:"html"}" placeholder="名" /></td> <td><input type="text" name="test_address[{$i}]" value="{$test_list[idx1].test_address|escape:"html"}" placeholder="住所" /></td> <td><button type="button" id="btn_del_test{$i}" class="deleteTest ui-btn ui-shadow ui-corner-all ui-btn-icon-left ui-icon-delete">削除</button> </tr> </tbody> </table>

「test.tpl」から「test.js」を読み込ませて処理をしようとしています。
「選択してください」ラベルから選んだ「$test_list[idx].test_name」から同じ配列インデックスの「test_d_name」と「test_address」の値を
テキストボックスに表示したく考えております。上記は自分なりに考えてものです。
こちらを実施すると、開発者ツール上にて
「Uncaught TypeError: Cannot read property 'addEventListener' of null」
と表示され、テキストボックスに値が反映されません。
console.log(document.getElementById('select_test_info'));
の値はnullとなってしまってます。
「選択してください」ラベルには「test_name」の値を選択できる状態になっております。

データ構造は

array(2) { [0]=> array(3) { ["test_name"]=> string(15) "テスト太郎" ["test_d_name"]=> string(6) "太郎" ["test_address"]=> string(6) "東京" } [1]=> array(3) { ["test_name"]=> string(15) "テスト花子" ["test_d_name"]=> string(6) "花子" ["test_address"]=> string(6) "大阪" } }

となっております。
どのようにしたら値がセットできるかご教授いただきたく思います。
宜しくお願いします。

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

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

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

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

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

ykws

2018/01/10 17:28

test_d_name と hp_d_name が混在していますが、タイプミスでしょうか?
kumakumatan

2018/01/10 23:32

hp_d_name→test_d_name です。タイプミスです。宜しくお願いします。
Tomak

2018/01/11 01:19

「選択」プルダウンを実際に選択したときに、同じ配列インデックスの「test_d_name」の値をテキストボックスに表示したいということでしょうか?
kumakumatan

2018/01/11 02:25

そうです。その通りです。宜しくお願いします。
x_x

2018/01/11 04:20

タグに「PHP」「Smarty」しかありませんが、クライアント側の処理なのでしょうか?
kumakumatan

2018/01/11 04:24

はい。クライアント側のブラウザでの処理です。宜しくお願いします。
x_x

2018/01/11 04:28

であれば、タグに「JavaScript」を追加することをおすすめします
kumakumatan

2018/01/11 04:29

タグに「JavaScript」を追加しました。宜しくお願いします。
guest

回答2

0

すでに使っているようなので説明不要かと思いますが、カスタムデータ属性
https://developer.mozilla.org/ja/docs/Web/HTML/Global_attributes/data-*

各optionにdata-dispという属性を付けたとすれば、

JavaScript

1document.getElementById('select_test_info').addEventListener('change', function(event) { 2 document.querySelector('[name="test_d_name"]').value = this.options[this.selectedIndex].getAttribute('data-disp'); 3}, false);

例が一つしかないためちょっとわからなかったのですが、複数行あるのでしょうか?
その場合はformで監視したほうがいいかもしれません(idは変える必要があります)。

-- 15:17追記 複数対応

HTML

1<option value="test_name" data-disp="test_d_name" data-address="test_address">test_name</option>

JavaScript

1document.getElementById('select_test_info').addEventListener('change', function(event) { 2 var option = this.options[this.selectedIndex]; 3 document.querySelector('[name="test_d_name"]').value = option.getAttribute('data-disp'); 4 document.querySelector('[name="test_address"]').value = option.getAttribute('data-address'); 5}, false);

投稿2018/01/11 05:18

編集2018/01/11 06:18
x_x

総合スコア13749

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

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

kumakumatan

2018/01/11 05:51

ご回答ありがとうございます。 複数行あります。他に [adress="test_adress"] などもある場合、「form」で監視する場合は、どのようにするのでしょうか? 宜しくお願いします。
x_x

2018/01/11 06:00

selectと出力項目が複数あるということですね? その記述ではちょっとわかりかねるので、質問のほうにHTMLを追記してもらってもいいですか? (それとadressはaddressのことでしょうか?)
kumakumatan

2018/01/11 06:07

ありがとうございます。 質問にHTMLを追記しました。 「adressはaddressのことです」 宜しくお願いします。
x_x

2018/01/11 06:19

追記しました。selectが複数あるわけではないようなので、data-*属性を増やしただけです。
kumakumatan

2018/01/11 06:30

ご回答ありがとうございます。 HTML部分の <option value="{$test_list[idx].test_name|escape:"html"}"{if $test_list[idx].test_name == $test_list} selected{/if}>{$test_list[idx].test_name}</option> を ↓ <option value="{$test_list[idx].test_name|escape:"html"}" data-disp="{$test_list[idx].test_d_name}" data-address="{$test_list[idx].test_address}">{$test_list[idx].test_name}</option> に変更するという事でしょうか? 宜しくお願いします。
x_x

2018/01/11 06:34

そうですね
kumakumatan

2018/01/11 08:33

ありがとうございます。 Javascriptの部分はhtml側に追記するイメージでしょうか?
x_x

2018/01/11 08:46

JavaScriptなので外部ファイルとして読ませるか、直接<script></script>に書くかです。idがある前提で書かれているので、後方で読むか、load後に走らせてください。
kumakumatan

2018/01/11 08:55

すいません。 ここで言うidがある前提のidとはどこの部分でしょうか? 宜しくお願いします。
x_x

2018/01/11 08:58

select_test_infoのことです。
kumakumatan

2018/01/12 01:07

ありがとうございます。 自分なりに作成したのですが、意図した事ができず悩んでいます。 質問サイトを編集しましたので、ご教授宜しくお願いします。
x_x

2018/01/12 02:36

<script></script>を当該のtableの後方へ移動してもらえますか?
kumakumatan

2018/01/12 06:06

ご回答ありがとうございます。 当該のtableの後方へ移動とはどのあたりでしょうか? ここだけでなく、「<script></script>」には記載されているものがあるので、 出来れば、裏でjsも読みこませているので、その場合、どこに記載すればいいでしょうか? 宜しくお願いします。
x_x

2018/01/12 06:12

特に外部スクリプトに依存したコードではないので、idの出現後ならどこでもいいです。 <script></script>は何度でも書けるので、ほかのと一緒に移動する必要もありません。 というか、最初からこれを書いておけばよかったですかね? https://developer.mozilla.org/ja/docs/Web/Reference/Events/DOMContentLoaded
kumakumatan

2018/01/12 10:52

ありがとうございます。 解決できました。
guest

0

ベストアンサー

他の回答者の回答どおりなのですが、<script>タグは</body>閉じタグの直前に書かないときちんと実行されません。HTMLが上から読み込まれてDOMツリーが構築されるので、一番下であればすべてのHTMLを読み込まれているので、HTMLを操作するJavaScriptは必ず実行可能というわけです。

Uncaught TypeError: Cannot read property 'addEventListener' of null

これは、document.getElementById('select_test_info')<select>要素を取得できていないというエラーなので、JavaScriptを移動してもエラーが出る場合はID名を確認してください。

イベントリスナー関数では、thisはイベントリスナーを追加した要素を指します。そして、関数の引数のeventは指定イベント(change)が発生した要素のイベントオブジェクトが格納されています。ですので、event.targetでも要素を取得できます。

<input type="text" name="test_d_name[{$i}]" ...

HTMLは上記なので、document.querySelector('[name^="test_d_name"]')のように前方一致で書くか、配列も含めて指定しなければなりません。(例:document.querySelector('[name="test_d_name[0]"]')

== 追記 ==
他の回答者の方からも私からも、実行したい<script>を一番最後(</body>の直前)に書いてくださいと言われていると思います。いちおう理由も書いたのですが。。。。
別ファイルのソースにまとめようが、インラインに書こうが実行されるタイミングは一緒ですので、下記のように</body>直前に移動してください。(または<html><head>..ここ..</head>の部分に移動します)

php

1<!DOCTYPE html> 2<html> 3<head> 4 //... 5</head> 6<body> 7//... 8<form name="フォーム名" id="test_info" action="..." method="post"> 9 //... 10 <h3 class="Test_header">テスト</h3> 11 <table data-role="table" id="test_tab" data-mode="reflow" class="ui-responsive table-stroke"> 12 <thead> 13 <tr> 14 <th width="30%">名前</th> 15 <th width="30%"></th> 16 <th width="30%">住所</th> 17 <th width="10%">削除</th> 18 </tr> 19 </thead> 20 <tbody id="test_tbody"> 21 {assign var='i' value=0} 22 23 <tr> 24 <td> 25 <select name="test_info" id="select_test_info" data-native-menu="true"> 26 <option value="">選択してください</option> 27 {section name=idx loop=$test_list} 28 <option value="{$test_list[idx].test_name|escape:"html"}"{if $test_list[idx].test_name == $test_list} selected{/if} data-disp="{$test_list[idx].test_d_name}" data-address="{$test_list[idx].test_address}">{$test_list[idx].test_name}</option> 29 {/section} 30 </select> 31 </td> 32 <td><input type="text" name="test_d_name[{$i}]" value="{$test_list[idx1].test_d_name|escape:"html"}" placeholder="名" /></td> 33 <td><input type="text" name="test_address[{$i}]" value="{$test_list[idx1].test_address|escape:"html"}" placeholder="住所" /></td> 34 <td><button type="button" id="btn_del_test{$i}" class="deleteTest ui-btn ui-shadow ui-corner-all ui-btn-icon-left ui-icon-delete">削除</button> 35 </tr> 36 </tbody> 37 </table> 38</form> 39 40//... 41 42//↓↓↓↓↓↓↓ ここにJavaScript移動してみてください ↓↓↓↓↓↓↓↓ 43<script language="JavaScript" src="test.js?t={$smarty.now}"></script> 44</body> 45</html>

test.jsは下記のようにします。(下記は変更していません)

js

1console.log(document.getElementById('select_test_info')); 2console.log(document.querySelector('form[name="フォーム名"]')); 3 4//=============== セレクトボックスにイベントリスナーを追加する場合 =============== 5document.getElementById('select_test_info').addEventListener('change', function(event) { 6 //thisもevent.targetもセレクトボックス要素です 7 console.log(this, event.target, event); 8 var option = this.options[this.selectedIndex]; 9 document.querySelector('input[name^="test_d_name"]').value = option.dataset.disp; 10 document.querySelector('input[name^="test_d_address"]').value = option.dataset.address; 11}, false); 12 13//=============== formにイベントリスナーを追加する場合 =============== 14document.querySelector('form[name="フォーム名"]').addEventListener('change', function(event) { 15 //thisはフォーム要素、event.targetはセレクトボックスです 16 console.log(this, event.target, event); 17 18 //セレクトボックス以外が変更されたとき 19 if (e.target.tagName != 'SELECT') { 20 return true; 21 } 22 var option = event.target.options[event.target.selectedIndex]; 23 this.querySelector('input[name^="test_d_name"]').value = option.dataset.disp; 24 this.querySelector('input[name^="test_d_address"]').value = option.dataset.address; 25}, false);

投稿2018/01/12 07:14

編集2018/01/12 09:05
Tomak

総合スコア1652

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

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

kumakumatan

2018/01/12 08:13

ご回答ありがとうございます。 参考にさせていただきやってみたのですが、 「console.log(document.getElementById('select_test_info'));」 にて値が「null」になってしまいます・・。 id名は他と重複してませんし、何故なのか悩んでしまってます・・。 ご教授いただければ幸いです。 宜しくお願いします。
kumakumatan

2018/01/12 10:53

ありがとうございます。 解決できました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問