html
1<div id=hoge></div> 2 3<script> 4 function demo() { 5 console.log(hoge); 6 } 7 8 demo(); 9</script>
このようなコードでhogeがHTMLElementとしてメソッドによる代入なしにそのまま扱えることを知りました。
この仕様にはどのような名前がついていますか?
また、名前を知ったあとで調べればよいとおもうのですが、getElementByIdで取得し代入して扱うことと、なにか差はあるのでしょうか?
今日まで一度もみたことがなかったのですが、実行環境を考慮せず積極的に使ってよいものなのでしょうか。
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
下記のような質問は推奨されていません。
- 質問になっていない投稿
- スパムや攻撃的な表現を用いた投稿
適切な質問に修正を依頼しましょう。
回答5件
8
予約語との競合などかんがえるとたまたま参照できるからと言って
その機能を使うのはあまり得策だとは言えません
javascript
1<div id="hoge"></div> 2<div id="window"></div> 3<script> 4console.log(hoge); 5console.log(window); 6console.log(document.getElementById('window')); 7console.log(document.querySelector('#window')); 8</script>
投稿2019/10/25 01:20
総合スコア109894
7
今日まで一度もみたことがなかったのですが、実行環境を考慮せず積極的に使ってよいものなのでしょうか。
できれば使わないことをおすすめします。
As a general rule, relying on this will lead to brittle code. Which IDs end up mapping to this API can vary over time, as new features are added to the Web platform, for example. Instead of this, use
document.getElementById()
ordocument.querySelector()
. (HTML Living Standardより)
投稿2019/10/25 01:27
総合スコア142217
下記のような回答は推奨されていません。
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
このような回答には修正を依頼しましょう。
6
ベストアンサー
前提としてIDは1画面に1つという前提があります。
つまり、それだけで特定できるためそれ単体でオブジェクトとして扱えるということも言えます。
「JavaScript ID 変数」とかで調べれば解説記事はでてきます。
名前らしい名前はついていないと思います。
getElementByIdで取得し代入して扱うことと、なにか差はあるのでしょうか?
後回しにすることなく、ミニマムなテストコードを書いて確かめれば良いと思います。
js
1console.log(hoge); 2let hogediv = document.getElementById("hoge"); 3console.log(hogediv ); 4console.log(hoge==hogediv); 5console.log(hoge===hogediv);
投稿2019/10/24 13:23
編集2019/10/24 14:03総合スコア80386
下記のような回答は推奨されていません。
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
このような回答には修正を依頼しましょう。
回答へのコメント
3
技術的なことは、m.ts10806さんが回答されておりますので、
今日まで一度もみたことがなかったのですが、実行環境を考慮せず積極的に使ってよいものなのでしょうか。
に関して回答させていただきます。
正直言うと、私自身も初めて知りました。
これはとても便利な仕様かと思います。
さて、
基本的には使っていいと思います。
~~ただし、~~JavaScriptの性質上、
あまり使うことは推奨できないものかと思います。
(後述するが、チーム開発や、ライブラリとして公開するのには非常に不適切な仕様)
JavaScriptは、ルートスコープに変数を置くと、非常にスパゲティコードになりやすく、
あまり推奨されないので、もしかしたら気にしなくいいかもしれませんが、
変数を扱う上でそのルート変数と区別がつきずらい可能性が非常に高くなるかと思われます。
例えば下記の例です。
javascript
1// define.js 2const hoge = 100;
javascript
1// main.js 2function calc(p) { 3 return hoge + p; 4}
html
1<!-- 上記JSを読み込んでいるHTML --> 2<div id="hoge"></div> 3 4<script src="define.js"></script> 5<script src="main.js"></script> 6<script> 7console.log(calc(15)); 8</script>
といった時、hogeはどっちゃね?ってなります。
(検証していないが、おそらくconst hoge = 100
の方が優先される)
もちろんこの時点でスパゲティコードなので、あまりよろしくない例かと思いますが、
実際にこの仕様を使うときは、このような現象が起きやすいので、
HTMLでid指定している変数名は、js内では使わない、などのチーム内で厳密にルール化する必要がでてくるでしょう。
また、ライブラリとして公開するにも不適切かと思います。
なぜなら、変数として扱っているid名のHTML要素がわからず、ユーザーが定義しようとしている、HTMLや変数と名前が被る可能性が多分にあるからです。
つまり、個人で開発して、他の誰にも引き継がないようなものであれば、別に気にしなくて使っていいと思うって話です。
投稿2019/10/25 01:30
編集2019/10/25 01:46総合スコア9511
下記のような回答は推奨されていません。
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
このような回答には修正を依頼しましょう。
回答へのコメント
2019/10/25 01:39 編集
2019/10/25 01:47
1
ですかね。
こちらからの引用ですが、
HTML StandardではHTMLマークアップ上の次の属性値がグローバル変数名となる仕様が追加されました。
- 全要素のid属性値
- embed,form,frameset,img,object要素のname属性値
質問されている hoge が丁度、id属性です。
この仕様、「HTMLにおいて重複があり得ない属性だから」なのでしょうね。
追記)
ブラウザ側でも ESモジュール(script[type=module])の開発が常識になるまでは、積極的に使うことは控えたほうがいいと思います。
モジュールはスコープが完全に分かれてくるので、「オブジェクト汚染」を気にしなくても良くなる。
そんなブラウザ側JavaScriptの未来を見据えての仕様追加なのかなと感じました。
投稿2019/10/25 06:23
編集2019/10/25 06:41総合スコア5428
下記のような回答は推奨されていません。
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
このような回答には修正を依頼しましょう。
関連した質問
Q&A
解決済
ボタンのcssが一部にしか効かない
回答2
クリップ0
更新
2020/03/04
Q&A
受付中
実行するタイミングでスクレイピング内容が変わる?
回答2
クリップ1
更新
2023/03/23
Q&A
解決済
そのエラーが箇所が下記のPHPには見当たりません。
回答2
クリップ0
更新
2023/03/17
Q&A
受付中
javascriptのコードからpythonの関数を実行させたい
回答2
クリップ1
更新
2023/03/21
Q&A
解決済
gas 埋め込みスクリプトをscriptタグに移動させたい
回答1
クリップ1
更新
2023/03/26
Q&A
解決済
classNameの使い方と引数の中身について
回答2
クリップ1
更新
2023/03/23
Q&A
解決済
sshのログインが急に出来なくなりました。
回答2
クリップ0
更新
2023/03/16
Q&A
解決済
Vueでページをスクロールしてきて要素が画面内に十分入ったときにふわっとフェードインさせたい
回答1
クリップ1
更新
2023/03/25
同じタグがついた質問を見る
JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。
下記のような回答は推奨されていません。
このような回答には修正を依頼しましょう。