\r\n\r\n\r\n```\r\n\r\n```JavaScript.js\r\nvar changeColor = function(className, color) {\r\n var elem = document.getElementsByClassName(className);\r\n\r\n //文字色変える\r\n elem.style.color = color;\r\n}\r\n\r\nchangeColor(\"hi\", \"red\");\r\n```","answerCount":2,"upvoteCount":0,"datePublished":"2018-09-17T14:33:03.937Z","dateModified":"2018-09-17T14:33:03.937Z","acceptedAnswer":{"@type":"Answer","text":"こんにちは。\r\n\r\nひとつのHTMLドキュメント内に同じclassの要素は、ひとつとは限らず、複数存在することができます。\r\nですので、[getElementsByClassName](https://developer.mozilla.org/ja/docs/Web/API/Document/getElementsByClassName) は、指定したクラスに該当する複数の要素の集まり([HTMLCollection](https://developer.mozilla.org/ja/docs/Web/API/HTMLCollection)) を返します。\r\nこれを踏まえると、ご質問に挙げられているコードを修正する方法のひとつとしては、\r\n以下のようにしてみるとよいかと思います。\r\n\r\n```javascript\r\nvar changeColor = function(className, color) {\r\n var elems = document.getElementsByClassName(className);\r\n\r\n //文字色変える\r\n elems[0].style.color = color;\r\n}\r\n\r\nchangeColor(\"hi\", \"red\");\r\n```\r\n\r\n上記では、`getElementsByClassName` の結果を入れる変数名を、elem**s** と複数形にし、\r\n文字色を変える対象の要素を、 `elems[0]` と、配列の要素を取得するのと同じ書き方で取得しています。\r\n\r\n以下は上記と同じコードを jsFiddle に上げたものです。\r\n\r\n[https://jsfiddle.net/jun68ykt/xwb5f803/1/](https://jsfiddle.net/jun68ykt/xwb5f803/1/)\r\n\r\n以上参考になれば幸いです。","dateModified":"2018-09-18T11:32:16.924Z","datePublished":"2018-09-17T14:40:55.914Z","upvoteCount":3,"url":"https://teratail.com/questions/147107#reply-221656"},"suggestedAnswer":[{"@type":"Answer","text":"正しい回答は既についているようなので、\r\nエラー文の解釈違いだけ指摘させていただきます。\r\n\r\n> Cannot set property 'color' of undefined\r\n\r\n上記のエラーは、\"'color' **of** undefined\" とあるので、color が未定義(undefined)なのではなく、「未定義**の** color」 が設定できない (Cannot set property) と言っています。\r\n\r\nつまり、`elem.style.color = color;` の部分の、 `elem.style` が `undefined` だったということですね。\r\n\r\n(上の方の方の回答にある通り、 `elem` は HTMLCollection オブジェクトなので、 `style` プロパティは未定義 (`===undefined`) となります)","dateModified":"2018-09-18T05:34:29.942Z","datePublished":"2018-09-18T05:34:29.942Z","upvoteCount":2,"url":"https://teratail.com/questions/147107#reply-221775","comment":[{"@type":"Comment","text":"本当ですね、ありがとうございます!\r\nさっと読んで早とちりしてしまいました。","datePublished":"2018-09-18T11:11:32.419Z","dateModified":"2018-09-18T11:11:32.419Z"}]}],"breadcrumb":{"@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"item":{"@id":"https://teratail.com","name":"トップ"}},{"@type":"ListItem","position":2,"item":{"@id":"https://teratail.com/tags/JavaScript","name":"JavaScriptに関する質問"}},{"@type":"ListItem","position":3,"item":{"@id":"https://teratail.com/questions/147107","name":"関数の文字色変更コードでCannot set property 'color' of undefined"}}]}}}
質問するログイン新規登録

Q&A

解決済

2回答

6366閲覧

関数の文字色変更コードでCannot set property 'color' of undefined

Tazusa

総合スコア41

JavaScript

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

0グッド

0クリップ

投稿2018/09/17 14:33

0

0

前提・実現したいこと

JavaScript初心者です。
JavaScriptで表示される文字の色を黒(初期値)から赤に変えたいのですが、
”Cannot set property 'color' of undefined”
というエラーが出てできません。

調べたところundefinedは初期化されていないという意味だとわかりました。
しかし、colorの初期値は見る限り黒となっています。
初期値が既にあるのに、なぜundefinedとなってしまうのでしょうか。
またこの場合、このエラーをどう回避すればよいでしょうか。

発生している問題・エラーメッセージ

Uncaught TypeError: Cannot set property 'color' of undefined
at changeColor (JavaScript.js:5)
at JavaScript.js:8
changeColor @ JavaScript.js:5
(anonymous) @ JavaScript.js:8

該当のソースコード

<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>samplePage</title> </head> <body> <p class="hi">こんにちは。お元気ですか?</p> <script src="JavaScript.js"> </script> </body> </html>

JavaScript.js

1var changeColor = function(className, color) { 2 var elem = document.getElementsByClassName(className); 3 4 //文字色変える 5 elem.style.color = color; 6} 7 8changeColor("hi", "red");

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

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

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

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

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

guest

回答2

0

ベストアンサー

こんにちは。

ひとつのHTMLドキュメント内に同じclassの要素は、ひとつとは限らず、複数存在することができます。
ですので、getElementsByClassName は、指定したクラスに該当する複数の要素の集まり(HTMLCollection) を返します。
これを踏まえると、ご質問に挙げられているコードを修正する方法のひとつとしては、
以下のようにしてみるとよいかと思います。

javascript

1var changeColor = function(className, color) { 2 var elems = document.getElementsByClassName(className); 3 4 //文字色変える 5 elems[0].style.color = color; 6} 7 8changeColor("hi", "red");

上記では、getElementsByClassName の結果を入れる変数名を、elems と複数形にし、
文字色を変える対象の要素を、 elems[0] と、配列の要素を取得するのと同じ書き方で取得しています。

以下は上記と同じコードを jsFiddle に上げたものです。

https://jsfiddle.net/jun68ykt/xwb5f803/1/

以上参考になれば幸いです。

投稿2018/09/17 14:40

編集2018/09/18 11:32
jun68ykt

総合スコア9058

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

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

Tazusa

2018/09/17 14:56 編集

早速のご回答ありがとうございます。 コレクションを返していたんですね。 getElementByIdと混同していました。 もう一つ質問なのですが、elemsのインデックス番号はどこからきたのでしょうか。 自分で変えたい所の一番目だから0かと予測したのですが…
jun68ykt

2018/09/17 15:01

> 自分で変えたい所の一番目だから0かと予測したのですが… はい。その予測で合ってます。 2番目ならインデクスは 1 です。 以下の例 https://jsfiddle.net/jun68ykt/716nucf4/2/ では、class="hi" に2つの要素が該当し、 1番目の要素 elms[0] の色を red にし、2 番目の要素 elms[1] の色を blue にし、かつ、font-weight を bold にして太字にしています。
Tazusa

2018/09/18 11:08

同じclassでもインデックス指定でいろいろ変えられるのですね。 わかりやすい解説ありがとうございました。
guest

0

正しい回答は既についているようなので、
エラー文の解釈違いだけ指摘させていただきます。

Cannot set property 'color' of undefined

上記のエラーは、"'color' of undefined" とあるので、color が未定義(undefined)なのではなく、「未定義 color」 が設定できない (Cannot set property) と言っています。

つまり、elem.style.color = color; の部分の、 elem.styleundefined だったということですね。

(上の方の方の回答にある通り、 elem は HTMLCollection オブジェクトなので、 style プロパティは未定義 (===undefined) となります)

投稿2018/09/18 05:34

R.Mizukami

総合スコア1086

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

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

Tazusa

2018/09/18 11:11

本当ですね、ありがとうございます! さっと読んで早とちりしてしまいました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.29%

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

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

質問する

関連した質問