
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8" />
<title>test</title>
<script type="text/javascript">
window.onload = function() {
console.log('test' in window);
test.addEventListener('click', function() { alert('click') }, false);
};
</script>
</head>
<body>
<div id="test">test</div>
</body>
</html>
何かすごい勘違いをしていたらお恥ずかしいのですが、
上のコードFIREFOX以外(IE、Chrome、safari)'true'でtestをクリックするとalertが
出るのですが、これって自動的にid名がグローバル変数になってるって
ことなのでしょうか??
id名と同じ名前で変数を宣言していて、ぶち当たりました。
どうぞよろしくお願いいたします。
No.1ベストアンサー
- 回答日時:
<form name="form1"> としておくと、document.form1と書けるようになるのと同じような物で、
JScriptというIE用のJavaScript互換言語仕様です。
他にも、document.all.testという書き方ができます。
Opera、Safari、ChromeはJScriptの多くの部分をサポートしていますので、id属性を付与したHTML要素はidがグローバル変数として使えるようになっています。
Firefoxは何かの設定(about:configだった気がします)を変更することで、この機能を使えるようになると思います(記憶があやふやです)。
HTML5 WebAPIで標準仕様に定めようと言う動きもありますが、反対意見もあるため、今後標準化されるかはわかりません。
標準化されなくてもFirefoxがサポートするようになれば、メジャーなすべてのブラウザで使える独自規格となります。
すべてのブラウザで使えるから問題無しとするか、標準仕様だけを使うべきとするかは、制作者の考え方次第だと思います。
(HTML-DOMを使用してdocument.getElementById('test')とするのが、すべてのブラウザで使用できる標準規格です。)
ちなみに、consoleは標準ではありません。。。なかったと思います。
ご回答ありがとうございます。最近firefoxからchromeに変えた為、いままでまったく気付きませんでした!結構衝撃です。ありがとうございました。
No.2
- 回答日時:
以下に Window オブジェクトの定義がありますが、
http://www.whatwg.org/specs/web-apps/current-wor …
interface Window : EventTarget {
....
getter WindowProxy (unsigned long index);
getter object (DOMString name);
....
};
長々と書かれている中で、上の部分が「window に名前を問い合わせたとき、その名前を持つオブジェクトを返す」の定義部分です。具体的には、その name 属性値を持つ iframe、a、area、form、img など、またはその id 属性値を持つ要素です。
これはもともと、ASP とコードを共有しやすくするための IE の独自仕様でした。ですが、パッケージないし名前空間の仕組みのない JavaScript では、スクリプトのグローバル空間に名前をまき散らすことになります(だから、ECMAScript 4 の策定時に名前空間機能を巡っても喧々諤々の議論になりました)。
HTML Standard で、昔のスクリプトを動かすために上記の定義が追加されました。もし気になるのなら、id 属性値や名前属性値を id="foo-bar" のようにハイフン区切りにでもしておけば、少なくとも window.foo-bar として参照されることはなくなります。window['foo-bar'] ではアクセスできてしまうでしょうけどね。
---
To No.1:
誤解していらっしゃると思うのですが、『標準仕様だけを使うべき』なんて主張する人は見たことがありませんよ。
例えば、以下の図を見て頂きたいのですが、
http://edward.oconnor.cx/2009/05/what-the-web-pl …
Web Platform を構成するものとして「Platform APIs」、つまり各ブラウザの独自拡張も含まれています。そもそも、DOM 適合要件は DOM の拡張を許しています。
なら、独自拡張の何がマズいのかと言えば、将来的に安定して使える保証がない、ということです。将来に渡って使われうる基幹部分には安定しているものを使い、ブラウザごとに異なる部分にはブラウザの独自拡張で埋める。
つまり、仕様の性質と、使い所の問題です。標準かどうかなんて宗教的な話ではありません。
ご回答ありがとうございます。あまり仕様書的なものなど確認したことがなかったのでもっと先勉強していきたいと思います。しかし結構衝撃でした。。。ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- JavaScript 入力フォームの javascript で メールアドレスの正規チェックをを行い、ボタンをクリックして 2 2022/04/27 16:06
- HTML・CSS ボタンをクリックした時に、入力フォームのすぐ下部に、「入力欄が空白です」というテキストメッセージが表 1 2022/04/27 16:25
- JavaScript jqueryを使ったスムーススクロールのコードを書いたのですが、HTMLコード内にある、a butt 2 2022/04/14 10:59
- JavaScript jQueryでのドラッグアンドドロップについて 1 2022/07/07 21:04
- JavaScript switch文のswitch(n)の部分を複数の値にするか、if文に変えてほしいです。 1 2022/07/27 17:18
- JavaScript ①入力フォーム→②確認表示画面→③送信完了画面のコードを書いているのです、 入力フォームから受け取っ 2 2022/05/10 16:45
- AJAX JavascriptからPHPへのAjax通信でnullが返ってくる 3 2022/08/03 22:00
- JavaScript コードレビューをお願いします。 1 2022/07/16 05:38
- JavaScript jQueryでのドラッグアンドドロップについて 1 2022/07/30 09:10
- JavaScript セレクトボックスを2つ設けて選択して初めてメッセを表示 1 2022/07/27 12:15
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
MAX関数を使ってからLEFT JOIN...
-
javascriptテキストBOX色を元に...
-
指定したパスが現URLに含まれて...
-
自働生成される<div>タグに連番...
-
createElementで作成した要素を...
-
クリックすると下に説明文が出...
-
ネストされたハッシュの値から...
-
クリックで色変更後に既に変更...
-
JavascriptでDIV~DIVをリロードで
-
テキストエリア内の一部の文字...
-
読み込んだQRコードをフォーム...
-
IFRAMEの表示/非表示を切り替え...
-
折りたたみ式JavaScriptをcheck...
-
[急ぎ] videoタグで埋め込んだm...
-
プルダウンとチェックボックス...
-
javascript ループ中の処理
-
classの中の<a>タグにidを追加
-
removeEventListenerについて
-
一覧をタブメニューで絞り込ん...
-
HTMLタグに複数のクラスを設定...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
MAX関数を使ってからLEFT JOIN...
-
javascriptテキストBOX色を元に...
-
IFRAMEの表示/非表示を切り替え...
-
removeEventListenerについて
-
背景色を透明化
-
createElementで作成した要素を...
-
javascriptでpostした値が取得...
-
読み込んだQRコードをフォーム...
-
iframe内のリンクが飛ばないの...
-
jQueryでクリックされた要素のi...
-
ダブルクォーテーションが消え...
-
<div ~ </div> で囲まれたテキ...
-
【HP作成】クリックすると下...
-
<Div>の中の要素の数を調べる
-
jQueryで特定id以外の下にある...
-
VBScript+IEのチェックボック...
-
removeAttribute()メソッドで削...
-
折りたたみ部分にアンカーでリ...
-
onclickを利用した伸縮メニュー...
-
背景色を一定時間ごとにランダ...
おすすめ情報