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

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

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

DOMは、Document Object Modelの略で、HTML文書やXML文書をアプリケーションから利用するためのAPIです。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

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

Q&A

解決済

2回答

806閲覧

if (targetNode.classList.contains('my-color'))はなぜtrueなのか教えてほしいです。

nyanchuu

総合スコア8

DOM

DOMは、Document Object Modelの略で、HTML文書やXML文書をアプリケーションから利用するためのAPIです。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

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

0グッド

0クリップ

投稿2021/05/12 11:10

解決したいこと

dotinstallでclassList を使ったレッスンをしております。
ボタンをクリックするたびに .my-colorが付いたり外れたりの動きを作っています。

containsである要素に特定のクラスが付いているかどうか調べることもでき、このクラスが付いてるかどうかを true 、 false で返してくれるというところで疑問があります。下記コードに書きましたがif文で表した時contains('my-color')で表したものは初めからtrueと決まっているのか、そのようなデフォルト仕様だと考えればいいのかご教示いただきたく存じます。

該当するソースコード

html

1<style> 2.my-color { 3 background-color: aqua; 4 color: red; 5 } 6</style> 7<button>Run</button> 8<h1 id = "target">文字色が変わるよ</h1> 9

js

1 const button = document.querySelector('button'); 2 button.addEventListener('click', () => { 3 const targetNode = document.getElementById('target'); 4 5 6 if (targetNode.classList.contains('my-color')) { 7 targetNode.classList.remove('my-color'); 8 } else { 9 targetNode.classList.add('my-color'); 10 } 11 12

button要素をクリックしてclassがついていた場合、ノードのremoveメソッドがクラスを外してくれるのでstyleで指定した色が消える。クラスが消えていた場合addメソッドでclassを追加したため色がつく。と理解はしているのですが、そもそもの真偽値はこのように決まっているのはなぜなのか。コメントいただけると幸いです

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

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

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

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

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

guest

回答2

0

末尾に括弧があるのは関数呼び出し、つまり何らかの処理の呼び出しだ。
contains()の場合、実行した瞬間に、targetNodeのclassListに対し、当該の値が存在するかを実際に調べに行く。

targetNodeというのは自分でつけた名前だが、classListは「classListという名前で要素が存在する」というルールがある。
https://developer.mozilla.org/ja/docs/Web/API/Element/classList
日本国内のあらゆる自動車にナンバープレートが付いていたり、あらゆる缶ジュースにバーコードがついているのと同じだ。あらゆるHTML要素にclassListという属性が存在する(この辺のデータの組み立ては、ブラウザが行っている。<b>と書かれていたら太文字にする、とかと同じような話で、ブラウザは「そのように処理する」というルールになっている)。
containsも同じで、containsという名前でそのような(つまり、対象となったclassList内に当該データがあるか探索し、その結果を返す)処理が呼び出せる、というルールになっていて、ブラウザはその通りに実装している。

要は「HTMLをJavaScriptから操作する際のルール」がそう取り決められており、あなたの使っているブラウザーでもその通りに実装されている、という話だ。
このようなルール(DOM; Document Object Model)は、昔はW3Cが決め、今はWHATWGという組織が決めている。

投稿2021/05/15 09:15

fukken

総合スコア73

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

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

0

ベストアンサー

そもそもの真偽値はこのように決まっているのはなぜなのか。

「そう決まっている」以上の回答が必要なのでしょうか?

投稿2021/05/12 11:12

maisumakun

総合スコア146018

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

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

maisumakun

2021/05/12 11:16

逆質問になりますが、true/false以外で「どんな値を返す」と想像したのでしょうか?
nyanchuu

2021/05/12 15:06

targetNode.classList.contains('my-color')←containsの()の中は=trueであると解釈していいのか。と聞きたかったわけです。真偽値はtrue/fals返の値が返るのですが、ここでの()内がtrueである理由がよくわからなかったので、質問しました。
maisumakun

2021/05/12 15:10 編集

> ここでの()内がtrueである理由がよくわからなかったので その解釈は成立しません。関数の引数と返り値は、必ず同じでならなければならないものではありません。
maisumakun

2021/05/12 15:13

「contains('my-color')」全体でtrueという値を返すもので、カッコの中だけ考えても何の意味もありません。
nyanchuu

2021/05/13 00:40

>関数の引数と返り値は、必ず同じでならなければならないものではありません contains() = trueの解釈ではないのですね。 コメントありがとうございます。
maisumakun

2021/05/13 00:42

> contains() = trueの解釈ではないのですね。 どういう意味でしょうか?contains()の結果はtrueです。
nyanchuu

2021/05/16 04:20

とんちんかんな質問に親身にご回答くださいましてありがとうございました。躓いているところをどう伝えればいいのか、悩みました。何度か解いて分かってきたことは 一度目のボタンクリックではクラスが付与されていない状態(false)になるのでelse文が実行されクラスリストから'my-colorが'追加されていた。my-color'は付与され、スタイルが適用されるとtrueになるので 'my-color'をリストから削除してという処理がされたのだと理解しました。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問