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

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

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

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

Q&A

解決済

3回答

433閲覧

DOMにおけるjs中でイベントを発生させたい

yk1108

総合スコア16

JavaScript

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

0グッド

1クリップ

投稿2019/03/01 00:35

昨日、ご質問をさせていただきました、ykek1108です。
Qookerというアンケートサービスのhtml中にJavaScriptを実装し、数値入力欄に「0」を代入することが無事にできました。
ありがとうございます。細切れになって恐縮ですが、今度は、この「0」の数値を変更したタイミングで、計算式を実行し、
別の入力欄に結果を表示したいと思っておりますが、DOMでのイベントが発生せず、動作しておりません。何度も恐縮ですが、
方法についてご教示いただければと思い、再度投稿させていただきました。どうぞよろしくお願いいたします。

Qookerによって生成されたHTMLは以下の通りです。

html

1 <tr> 2 <th class="matrix_column"> 3 (02)合計数 = (02)①+(02)② ※自動計算 4 </th> 5 <td id="response_f_94-10-1-0" class="matrix_select" > 6  <input name="response_data[response_f_94][q1_2][_n]" type="text" value="" class="matrix_number"> 7  </td> 8 </tr> 9 <tr> 10 <th class="matrix_column_reverse"> 11 (02)①数値1 12 </th> 13 <td id="response_f_94-10-2-0" class="matrix_select_reverse" > 14  <input name="response_data[response_f_94][q1_2_1][_n]" type="text" value="" class="matrix_number"> 15  </td> 16 17 </tr> 18 <tr> 19 <th class="matrix_column"> 20 (02)②数値2 21 </th> 22 <td id="response_f_94-10-3-0" class="matrix_select" > 23  <input name="response_data[response_f_94][q1_2_2][_n]" type="text" value="" class="matrix_number"> 24  </td> 25 </tr>

マトリクス上になったテーブルに、合計数と数値1、数値2の3つのテキストボックスがあり、ページ読み込み時はすべて「0」
と表示されております。ここで、数値1と数値2に数値を入れたとき、その合計数を「合計数」テキストボックスに表示させたい
と考えています。
次に示すJavaScriptは、このhtmlの下方に埋め込み形式で実装しています。

html

1<script> 2var aryTableTag = document.QFORM.getElementsByTagName("table"); 3var intVal1 = 0; 4var intVal2 = 0; 5var intVal3 = 0; 6var strQ12 = ""; 7var strQ121 = ""; 8var strQ122 = ""; 9 10for (var i = 0; i < aryTableTag.length; i++){ 11 var objTableTag = aryTableTag[i]; 12 if (objTableTag.id == undefined || objTableTag.id.split("-")[2] != "matrix") 13 {continue;} 14 15 var strMatrixType = objTableTag.id.split("-")[1]; 16 17 var aryInputTag = objTableTag.getElementsByTagName("input"); 18 19 for (var j = 0; j < aryInputTag.length; j++){ 20 21 var strName = aryInputTag[j].name 22 23 if (strName.indexOf("[q1_2]") !== -1){ 24 aryInputTag[j].value = intVal3; 25 strQ12 = strName; //合計数テキストボックスのname属性を取得 26} 27 if (strName.indexOf("[q1_2_1]") !== -1){ 28 aryInputTag[j].value = intVal1 29 strQ121 = strName; //数値1 テキストボックスのname属性を取得 30} 31 32 if (strName.indexOf("[q1_2_2]") !== -1){ 33 aryInputTag[j].value = intVal2 34 strQ122 = strName; //数値2 テキストボックスのname属性を取得 35} 36} 37} 38//「合計数」テキストボックスにフォーカスがあったとき、「数値1」と「数値2」の合計を 39//求め、「合計数」欄に表示させたい 40 document.getElementsByName(strQ12).onfocus = function(){ 41 calA(); 42 }; 43 function calA(){ 44 var intQ122 = strQ122.innerText 45 var intQ121 = strQ121.innterText 46 var intQ12 = intQ122 + intQ121 47 strQ12.value = intQ12; 48} 49 50</script>

昨日ご教示いただいたのは、「合計数」「数値1」「数値2」にページロード時に「0」を代入することでした。
そこは成功しました。
そのあと、「合計数」のテキストボックスにフォーカスが入った際に、「数値1」+「数値2」を実行したいのですが、
何も起こりません。
何度も申し訳ございませんが、どなた様か、原因をご教示いただければ幸いです。
どうぞよろしくお願い致します。

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

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

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

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

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

guest

回答3

0

document.getElementsByNameは要素を返しません。

getElementsByName() メソッドは、文書内で指定した name を持つ要素の NodeList コレクションを返します。

Document.getElementsByName() - Web API | MDN

解決方法は、配列のように扱うことです。

NodeList は Array とは異なりますが、 forEach() メソッドで処理を反復適用することは可能です。 Array.from() を使うことで Array に変換することができます。

NodeList - Web API | MDN

投稿2019/03/01 00:40

編集2019/03/01 00:42
Lhankor_Mhy

総合スコア36057

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

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

yk1108

2019/03/01 00:48

Lhankor_Mhy様 ご回答ありがとうございます。まだまだ不勉強でした。 Mozilla等のサイトをしっかり学習するよう心がけます。
guest

0

getElementsByNameは要素のリスト(NodeList)を返すので、1つしかない要素でも[0]をつける必要があります。

js

1// document.getElementsByName(strQ12).onfocus 2// ↓ 3 document.getElementsByName(strQ12)[0].onfocus

【Document.getElementsByName() - Web API | MDN】
https://developer.mozilla.org/ja/docs/Web/API/Document/getElementsByName

投稿2019/03/01 00:42

kei344

総合スコア69398

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

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

yk1108

2019/03/01 00:50

kei344様 ご回答ありがとうございます。 デバッガでdocument.getElementsByName(strQ12)を確認しましたところ、NodeListと 帰ってまいりました。ありがとうございます。 まだまだ不勉強でした。
guest

0

ベストアンサー

全体像がわからないので提示されているソースの範囲で

javascript

1<script> 2window.addEventListener('DOMContentLoaded', function(e){ 3 [].forEach.call(document.querySelectorAll('.matrix_number'),function(x){ 4 x.value=0; 5 x.addEventListener('input',function(e){ 6 var v1=parseFloat(document.querySelector('[name="response_data[response_f_94][q1_2_1][_n]"]').value)||0; 7 var v2=parseFloat(document.querySelector('[name="response_data[response_f_94][q1_2_2][_n]"]').value)||0; 8 document.querySelector('[name="response_data[response_f_94][q1_2][_n]"]').value=v1+v2; 9 }); 10 }); 11}); 12</script> 13<table> 14<tbody> 15 <tr> 16 <th class="matrix_column"> 1702)合計数  (02)①+(02)② ※自動計算 18 </th> 19 <td id="response_f_94-10-1-0" class="matrix_select" > 20  <input name="response_data[response_f_94][q1_2][_n]" type="text" value="" class="matrix_number" readonly> 21  </td> 22 </tr> 23 <tr> 24 <th class="matrix_column_reverse"> 2502)①数値1 26 </th> 27 <td id="response_f_94-10-2-0" class="matrix_select_reverse" > 28  <input name="response_data[response_f_94][q1_2_1][_n]" type="text" value="" class="matrix_number"> 29  </td> 30 31 </tr> 32 <tr> 33 <th class="matrix_column"> 3402)②数値2 35 </th> 36 <td id="response_f_94-10-3-0" class="matrix_select" > 37  <input name="response_data[response_f_94][q1_2_2][_n]" type="text" value="" class="matrix_number"> 38  </td> 39 </tr> 40</tbody> 41</table>

投稿2019/03/01 01:07

yambejp

総合スコア114747

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

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

yk1108

2019/03/01 01:41

yambejpさん ご回答ありがとうございます。 ご教示いただいた内容で一度試してみたいと思います。 ありがとうございました。
yk1108

2019/03/03 23:28

yambejpさん ありがとうございました。おかげさまで解決することができました。 複数の方から、今回は大変有益なご情報をいただくことができましたので、皆さん のご回答をベストアンサーにさせていただきたいのですが、yambejpさんのご回答 から直接の解決方法を導くことができましたので、今回ベストアンサーとさせて いただきます。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問