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

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

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

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

Q&A

解決済

5回答

12092閲覧

getElementsByClassNmeでclassのvalue取得時にundefinedが出る

Buretan

総合スコア32

JavaScript

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

0グッド

1クリップ

投稿2018/10/03 09:00

編集2018/10/03 09:36

・追記
たくさんの回答ありがとうございます。
理解するのに時間がかかっておりますので回答はしばらくお待ち下さい。

電卓を作っています。

getElementByIdではvalueが取得出来てmonitorにそれぞれのvalueが表示されるのですが、classにしたらvalueが表示されずにundefinedがでました。
どうしたらvalueを表示するように出来ますか?
個別にidを変えてgetElementByIdで地道に一個ずつ作るしか無いのでしょうか?

HTML

<!DOCTYPE html> <html lang="ja" dir="ltr"> <head> <meta charset="utf-8"> <title>電卓</title> <link rel="stylesheet" href="dentaku.css"> </head> <body> <div class="moniter" id="monitor"> </div> <input class="key1" id="btn1" type="button" name="aaa" value="7" onclick="Btn1Click();"> <input class="key1" id="btn1" type="button" name="aaa" value="8" onclick="Btn1Click();"> <input class="key1" id="btn1" type="button" name="aaa" value="9" onclick="Btn1Click();"> <input class="key1" id="btn1" type="button" name="aaa" value="/" onclick="Btn1Click();"> <input class="key1" id="btn1" type="button" name="aaa" value="4" onclick="Btn1Click();"> <input class="key1" id="btn1" type="button" name="aaa" value="5" onclick="Btn1Click();"> <input class="key1" id="btn1" type="button" name="aaa" value="6" onclick="Btn1Click();"> <input class="key1" id="btn1" type="button" name="aaa" value="*" onclick="Btn1Click();"> <input class="key1" id="btn1" type="button" name="aaa" value="1" onclick="Btn1Click();"> <input class="key1" id="btn1" type="button" name="aaa" value="2" onclick="Btn1Click();"> <input class="key1" id="btn1" type="button" name="aaa" value="3" onclick="Btn1Click();"> <input class="key1" id="btn1" type="button" name="aaa" value="-" onclick="Btn1Click();"> <input class="key1" id="btn1" type="button" name="aaa" value="0" onclick="Btn1Click();"> <input class="key1" id="btn1" type="button" name="aaa" value="." onclick="Btn1Click();"> <input class="key1" id="btn1" type="button" name="aaa" value="+/-" onclick="Btn1Click();"> <input class="key1" id="btn1" type="button" name="aaa" value="+" onclick="Btn1Click();"> <script type="text/javascript" src="dentaku.js"> </script> </body> </html>

CSS

body{ margin: auto; padding: 5px; width: 230px; height: 250px; border: 1px solid #333; background: #eee; } .moniter{ margin: 9px; padding: 5px; width: 180px; height: 20px; border: 1px solid #555; } .key1{ margin: 5px; padding: 3px; width: 40px; height: 40px; border: 1px solid #222; border-radius: 10px; font-size: 20px; font-weight: bold; box-shadow: 0px 2px #333; } .key1:active{ opacity: 0.5; box-shadow: 0px 0px #333; }

javaScript

function Btn1Click() { var btn1 = document.getElementsByClassName("key1").value; target = document.getElementById("monitor"); target.innerHTML = btn1; }

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

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

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

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

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

guest

回答5

0

getElementById のときは Element で、getElementsByClassName の場合は Elements になっていることを、なぜって思ったことありませんか?

getElementById の返り値は、element で、getElementsByClassName の返り値は、elements だからですよね。

elements は、elementを要素に持つ配列になります。

document.getElementsByClassName("key1")[0] と書くと、

document.getElementsByClassName("key1")[0].value とかけます。

投稿2018/10/03 09:05

編集2018/10/03 09:06
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

Buretan

2018/10/03 09:42

まさにそのsがあるか無いかでエラーが起きていて、その時はわからなかったのですが、ググったらsが抜けているからというミスだったという先駆者がいたため、そこは解決しました。idは一つだけどクラスは複数になるのでsだという理解です。 後半の3行がよくわからないのです。 後ろに[0]があるものと[0].valueがあるものを記載されていますが、どういう意味ですか?
退会済みユーザー

退会済みユーザー

2018/10/03 10:15

他の人の回答と合わせて考えればわかりますよね。
Buretan

2018/10/03 10:30

はい、配列には番号が振られていて1つ目が[0]となっており、ここではサンプルとして[0]番目を例にとっていて、配列[0]番目のvalueがdocument.getElementsByClassName("key1")[0].value という意味ですよね ありがとうございます!!
guest

0

getElementsByClassNameは、getElementsと書いてあるとおりノードリスト HTMLCollectionで取得されます。
配列と似たような操作が可能なので、document.getElementsByClassName("key1")[0].value;で最初のひとつを参照してvalueを取得することができます。

追記

回答文中に誤りがあったので修正しました。
NodeListではなくHTMLCollectionとして取得されます。
似て非なるものなのでご注意ください。
申し訳ありませんでした。

投稿2018/10/03 09:05

編集2018/10/03 13:05
spookybird

総合スコア1803

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

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

Buretan

2018/10/03 13:08 編集

ノードリストがわからないので調べて理解してから回答させていただきます。 回答ありがとうございますm(_ _)m Console画面で見たらわかりました。 あそこにある値を取得する感じなんですね ありがとうございます。 追記の件、了解しました。
guest

0

ベストアンサー

console.log()などでデバッグをして、その出力内容を見る癖をつけましょう。

js

1console.log(document.getElementsByClassName("key1"));

例えば↑こうすると、直下にvalueがないことに気づけるはずです。

追記。
全部にonclickつけるなら下記のようにして、

html

1onclick="Btn1Click(this);">

下記のようにした方が見た目はスッキリするかもしれません(未検証)

js

1function Btn1Click(elem) { 2 var btn1 = elem.value; 3

投稿2018/10/03 09:17

編集2018/10/03 09:35
m.ts10806

総合スコア80765

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

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

Buretan

2018/10/03 09:48

回答ありがとうございます console画面見てみました。 HTMLCollection(16) [input#btn1.key1, input#btn1.key1, input#btn1.key1, input#btn1.key1, input#btn1.key1, input#btn1.key1, input#btn1.key1, input#btn1.key1, input#btn1.key1, input#btn1.key1, input#btn1.key1, input#btn1.key1, input#btn1.key1, input#btn1.key1, input#btn1.key1, input#btn1.key1, btn1: input#btn1.key1, aaa: input#btn1.key1] という文字列が出てきていたので、valueは取得してないのかな?と感じましたがその理解であっていますか?
m.ts10806

2018/10/03 09:57

「文字列」ではありません。 HTMLCollection というオブジェクトの中身です。 getElementsByClassNameで検索すると下記のような記事がでてきます。 https://developer.mozilla.org/ja/docs/Web/API/Document/getElementsByClassName これは「リファレンス」と呼ばれるもので、要はマニュアルというか説明書のようなものです。 機能の仕様書ですね。 上記URLの通り指定されたクラス名のHTMLCollection を取得しています。 HTMLCollection の中には、指定したクラス名を持つhtmlの情報が入っています。 これは配列ですね。 (16)というのは「この中に16個の要素があるよ」ということです。 ここから情報を取り出すには「何番目の情報を扱う」という風に指定してやらないといけません。 配列の扱いは理解されていますか?forなどでループして取り出すとか、そういうものです。 この配列の中の要素1つ1つがHTMLの情報なので個々にはvalueという機能を持っています。 .valueは「取得する」のではなく、あくまでそのオブジェクトが持っている機能です。 そのまま出力すれば設定されている値を取得してくるし、左辺にすれば値を設定できます。 この辺りもリファレンスを読んで仕様を理解し、コードを書いて確かめるのが良いですね。
Buretan

2018/10/03 10:13

HTMLcollectionというオブジェクトの中に16個の要素があり、それぞれの要素にはまたいろいろな情報がはいっていて、その中から情報を取り出すにはforなどのループ処理で取り出す必要がある。 これを「配列の扱いという」ところまで理解出来ました。 htmlで書いたvalue="1"という情報以外にもvalueはあるということですね。 リファレンスが難解で二の足踏んでますが、頑張ってみます。 ご丁寧にありがとうございましたm(_ _)m
m.ts10806

2018/10/03 10:16

リファレンスは仕様書なので必要なことしか書いてありません。 確かに簡単には理解できないかもしれませんが読み方が分かると自己解決できるようになってきます。 ネット上に転がっているサンプルコードなども見ていくとより理解が深まります。
Buretan

2018/10/03 12:46

Console画面から見た時に情報がいろいろあり、その中に電卓の数字要素としている数字がdefaultValueやnodeValueという名称であったので、「これを指定して取り出していくのかな?」と感じてやってみたら取り出せました。 Console画面の見方と使い方がわかった気がします。 ありがとうございました!!
m.ts10806

2018/10/03 12:49

やり方は正しいです。 使える機能が出てくるので、取得したい値が入っているかどうかも確認できます。 これとリファレンスを確認すれば間違いがなくなっていき、今回のようなものだと自己解決できるようになります。
guest

0

これは押した自分がわかればいいので、thisを渡してやるのが一番楽

javascript

1<script> 2function Btn1Click(v) { 3 var btn1 = v.value; 4 target = document.getElementById("monitor"); 5 target.innerHTML = btn1; 6} 7</script> 8<div class="moniter" id="monitor"> 9</div> 10<input type="button" value="7" onclick="Btn1Click(this);"> 11<input type="button" value="8" onclick="Btn1Click(this);"> 12<input type="button" value="9" onclick="Btn1Click(this);"> 13<input type="button" value="/" onclick="Btn1Click(this);"> 14<input type="button" value="4" onclick="Btn1Click(this);"> 15<input type="button" value="5" onclick="Btn1Click(this);"> 16<input type="button" value="6" onclick="Btn1Click(this);"> 17<input type="button" value="*" onclick="Btn1Click(this);"> 18<input type="button" value="1" onclick="Btn1Click(this);"> 19<input type="button" value="2" onclick="Btn1Click(this);"> 20<input type="button" value="3" onclick="Btn1Click(this);"> 21<input type="button" value="-" onclick="Btn1Click(this);"> 22<input type="button" value="0" onclick="Btn1Click(this);"> 23<input type="button" value="." onclick="Btn1Click(this);"> 24<input type="button" value="+/-" onclick="Btn1Click(this);"> 25<input type="button" value="+" onclick="Btn1Click(this);"> 26 27

でも、まとめるならこう

javascript

1<script> 2window.addEventListener('DOMContentLoaded', function(e){ 3 [].forEach.call(document.querySelectorAll('.key1'),function(x){ 4 x.addEventListener('click',function(e){ 5 document.querySelector('#monitor').textContent=x.value; 6 }); 7 }); 8}); 9</script> 10<div class="moniter" id="monitor"> 11</div> 12<input class="key1" type="button" value="7"> 13<input class="key1" type="button" value="8"> 14<input class="key1" type="button" value="9"> 15<input class="key1" type="button" value="/"> 16<input class="key1" type="button" value="4"> 17<input class="key1" type="button" value="5"> 18<input class="key1" type="button" value="6"> 19<input class="key1" type="button" value="*"> 20<input class="key1" type="button" value="1"> 21<input class="key1" type="button" value="2"> 22<input class="key1" type="button" value="3"> 23<input class="key1" type="button" value="-"> 24<input class="key1" type="button" value="0"> 25<input class="key1" type="button" value="."> 26<input class="key1" type="button" value="+/-"> 27<input class="key1" type="button" value="+"> 28

投稿2018/10/03 09:31

yambejp

総合スコア114583

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

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

Buretan

2018/10/03 10:03

すごい簡単そうな組み方ですね。 質問に合わせた組み方まで書いていただきありがとうございます。 使ったことのないものがいくつか出てきたので調べてみます。 ありがとうございました!!
guest

0

classもidもnameも丸かぶりでは、どこだかわからなくなりません?

http://www.kogures.com/hitoshi/javascript/get-elements.html

投稿2018/10/03 09:08

hectopascal1013

総合スコア466

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

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

Buretan

2018/10/03 09:44

ですよね コピペして動作確認だけしていたので、最終的には別個にしないとまずいのかなぁと思ってはいました。 リンク先も見てみます。 ありがとうございますm(_ _)m
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問