![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
以下のようなページを作りました。
textboxが5つ、
さらにscriptタグの中で5つの要素を読み込むグローバル変数 inputs が定義されています。
また、確認用にinputsの値をconsoleにを吐き出すためのボタンも作成しました。
ここで質問です。
この状態で、テキストボックスに何らかの入力を入れて、ボタンを押すと、常にその時のリアルタイムで入力している値が出力されます。このことが私にはとても不思議です。
常にリアルタイムの値を吐き出しているということは、常にinputsは最新の値を取り込まなければいけないはずですが、
このグローバル変数 inputsはページの読み込み時に一度、
inputs=document.getElemensByClassName("input");でイニシャライズしてから
一切読み込む機会がないように見えます。
でも、buttonを押すごとに最新の値が出てくるということは、何度もinput要素を読み込んでいるように見えます。これはどうなっているのでしょうか。
これがグローバル変数に対する質問かどうかわかりませんが、どうしてこれで最新の値を出力できるのかを教えてくださると助かります。よろしくおねがいします。
-------------------------------------サンプルソース-------------------------
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>global</title>
</head>
<body>
<input type="text" class="input" id="1"> <br>
<input type="text" class="input" id="2"> <br>
<input type="text" class="input" id="3"> <br>
<input type="text" class="input" id="4"> <br>
<input type="text" class="input" id="5"> <br>
<button onclick="show();">inputの中身表示</button>
<script>
var inputs=document.getElementsByClassName("input");
function show(){
for(var i=0;i<inputs.length;i++){
console.log(inputs[i].id + ":" + inputs[i].value);
}
}
</script>
</body>
</html>
No.2ベストアンサー
- 回答日時:
こんにちは
ご提示の場合、変数inputsはDOMのHTMLCollectionとなっています。
個々のエレメントは、DOM要素への参照になります。
>buttonを押すごとに最新の値が出てくる
inputs[i].value の文が実行される時に要素の値を参照しますので、その時点での最新の値が採用されます。
>何度もinput要素を読み込んでいるように見えます。
input要素は読み込んでいませんが、input[i].value でその属性値としての値(=value)を参照しています。これは、inputs[i].value が実行される度に参照されます。
別の例ですが・・・
var obj = { name: "hoge", value: 5 };
console.log( obj.value ); // 5 --①
obj.value += 5;
console.log( obj.value ); // 10 --②
とすると、当たり前ながら、obj.valueが実行される時の(最新の)値が出力されることがわかると思います。(①と②で値が変わる)
上記では出力処理の途中で、「obj.value += 5;」として値の内容をスクリプトから変更していますが、DOM要素の場合はユーザの操作によっても値を変更することができるので、スクリプトから特に変更などをしていなくても、「inputs[i].value」を実行する時によって、value値は同じままのこともありますし、変わっていることもあります。
>inputs[6].valueなどがリアルタイムの値を返すのです。
DOM APIの特徴として、getElementsByClassNameなどいくつかのメソッドでは、「生きたCollection(あるいはNodeList)」が返されます。
(静的なリストが返されるメソッドもありますのでご注意)
「生きている」ことの意味は、DOMに変更があった場合に動的にその状態が反映されるということです。
https://developer.mozilla.org/ja/docs/Web/API/Do …
https://developer.mozilla.org/ja/docs/Web/API/El …
No.3
- 回答日時:
> ボタンに限らずに数式等でinputs[i].valueを利用してもいつも最新の値が出てくるように感じます。
グローバル変数というのは、というより、グローバル変数に定義したオブジェクトのプロパティは
数式で利用しても最新の値を返してくれるものなのでしょうか?
ボタンからの起動かどうかとか、グローバル変数かどうかは、全然関係なくて、
どんな手段であれ、inputs[i].value の値を参照したら、その時点の値が参照されます。
> 途中からテキストボックスの数を増やして、7つとかにしても、
具体的に何をやったのでしょうか?
artooさん、お答えありがとうございます。
>具体的に何をやったのでしょうか?
下のコードを改変してみたのですが、
例えば、textbox1個の時にshowボタンを押すと表示される要素は1つです。
ボタンをクリックして、2つにしてからshowボタンをおすと、2つの要素が表示されます。
いつの間に変数inputsに要素が読み込まれているのだろうと思いまして、そこが不思議でした。
fujillinさんの回答により、以下サイトから、
getElementByClassNameメソッドは動的であるということがわかりました。
global変数がどうのという問題ではなかったようです。おかげさまで問題が解決しました。
ありがとうございました。
https://developer.mozilla.org/ja/docs/Web/API/El …
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>global</title>
</head>
<body>
<div id="text">
</div>
<button onclick="show();">inputの中身表示</button><br>
<button onclick="add();">textboxの追加</button>
<script>
var inputs=document.getElementsByClassName("input");
var i=0;
function show(){
for(var i=0;i<inputs.length;i++){
console.log(inputs[i].id + ":" + inputs[i].value);
}
}
function add(){
var text = document.getElementById("text");
text.innerHTML = text.innerHTML + '<input type="text" class="input" id="' + i + '"> <br>';
i++;
}
</script>
</body>
</html>
No.1
- 回答日時:
inputタグの値は、ボタンを押す度に関数showの中で毎回 inputs[i].value で取得しています。
早速のご返信ありがとうございます。buttonを押すごとにinputs[i].valueを取得しているというお話ですが、
ボタンに限らずに数式等でinputs[i].valueを利用してもいつも最新の値が出てくるように感じます。
グローバル変数というのは、というより、グローバル変数に定義したオブジェクトのプロパティは
数式で利用しても最新の値を返してくれるものなのでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- JavaScript javascriptのちょっとした動作不良(原因は突き止めたのですが) 1 2023/06/15 19:58
- JavaScript フォームが空欄の時にフォームの外をクリックすると、エラーが出るコードを調べています。 1 2023/06/25 11:51
- JavaScript switch文のswitch(n)の部分を複数の値にするか、if文に変えてほしいです。 1 2022/07/27 17:18
- JavaScript javascript作成してます。ラジオボタンで判定するコードを書いてます。 1 2023/07/18 11:03
- JavaScript ①入力フォーム→②確認表示画面→③送信完了画面のコードを書いているのです、 入力フォームから受け取っ 2 2022/05/10 16:45
- JavaScript 入力フォームの javascript で メールアドレスの正規チェックをを行い、ボタンをクリックして 2 2022/04/27 16:06
- JavaScript セレクトボックスを2つ設けて選択して初めてメッセを表示 1 2022/07/27 12:15
- PHP 入力した部分を表示させたまま(保持)するにはどうすれば良いでしょうか? 1 2023/01/25 11:14
- JavaScript プログラムがうまく動きませんレビューお願いします 1 2022/07/10 05:08
- JavaScript コードレビューをお願いします。 1 2022/07/16 05:38
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
value内に変数を入れたい
-
hiddenのvalueの値を変えたい
-
ダミーフォームの内容を送信用...
-
大量のselect要素のvalueを短い...
-
選択したラジオボタンに対応し...
-
VBAをJavaScriptに変換したいです
-
テキストボックスに入力された...
-
セレクトボックスの初期選択状...
-
firefoxでJavascriptのフォーム...
-
VB.NET DateTimeの型について
-
return trueとreturn falseの用...
-
プルダウン 項目が多いので先頭...
-
【jQuery】input nameの文字列...
-
フォームが空欄の時にフォーム...
-
tableの任意行にfocusをあてる
-
select要素のvalueを配列で取得...
-
同じ名前のセレクトがある場合...
-
onClick="this.form.submit
-
onclickで2個指定するには?
-
ボタンを押すとテキストボック...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
value内に変数を入れたい
-
hiddenのvalueの値を変えたい
-
javascriptでhiddenに二次元配...
-
複数のsubmitボタンで押された...
-
テキストボックスに入力された...
-
switchを使って四則演算のプロ...
-
VB.NET DateTimeの型について
-
クイズ作成:15個の問題から5個...
-
C言語クイックソートの比較総回...
-
セレクトボックスの初期選択状...
-
ラジオボタンの選択で解答・点...
-
子から親へチェックボックスの...
-
ラジオボタンと連動して文字列...
-
setIntervalの間隔を途中で変更...
-
JAVASCRIPTで、ボタンを押した...
-
sessionStorageを調べています。
-
クリックの度に加算していくには?
-
マクロ オブジェクト変数With...
-
3桁区切りのカンマをつけたい...
-
selectboxのoptionタグのvalue...
おすすめ情報
artoo さん返信ありがとうございます
でもまだわからないことだらけです。
途中からテキストボックスの数を増やして、7つとかにしても、inputs[6].valueなどがリアルタイムの値を返すのです。
これはなぜなのでしょう。
グローバル変数というよりオブジェクト配列に対する疑問ですかね