知っていますか? IDを持つDOM要素は、JavaScriptのグローバル変数としてアクセスできますか?これは長い間存在してきた機能ですが、私は初めてそれを掘り下げてきました。
この機能について最初に聞いたことがある場合は、準備してください! HTMLの要素にIDを追加するだけで、実際にどのように適用されるかがわかります。
<div id="cool"></div>
またはquerySelector("#cool")
を使用して、新しい変数を定義して要素を選択します。
getElementById("cool")
var el = querySelector("#cool");
したがって、#cool
htmlのid(またはname属性)は、JavaScriptで
あなたが推測したかもしれないように、window[ELEMENT_ID]
名前が付けられた参照を使用してグローバルなスコープにアクセスすることは最良の解決策ではありません。一部の人々はそれを「グローバルスコープ汚染者」と呼んでいます。理由を探りますが、最初は...
いくつかの背景
Internet Explorerは、この機能を実装する最初のブラウザです。他のブラウザがこの機能を追加しました。当時、Geckoは標準モードで直接サポートしていないが、実験機能として使用することを選択した唯一のブラウザでした。人々はそれを実装することをためらっていましたが、ブラウザの互換性のために最終的に進んで(GeckoはWebKitに標準モードから削除するよう説得しようとしました)、最終的にFirefox 14で標準モードに入りました。
おそらくあまり知られていないのは、ブラウザが生成されたグローバル変数がWebページを破壊しないようにするために、いくつかの予防策(さまざまなレベルの成功)を取る必要があることです。対策の1つは...
です可変閉塞
window.foo = "bar";
<div id="foo">I won't override window.foo</div>
console.log(window.foo); // 输出 "bar"
<div id="foo">I will be overridden :(</div>
window.foo = "bar"; console.log(window.foo); // 输出 "bar"
などの危険なカバレッジを排除するため、重要です。
、それ以外の場合は、アラートAPIを無効にすることにより競合を引き起こします。この保護技術は、あなたが(あなたが私のようであれば)最初にそれについて学ぶ理由である可能性が最も高いです。
私は、参照として指定されたグローバル要素を使用することは最良の解決策ではないかもしれないと以前に言いました。多くの理由があり、TJ Vantollは彼のブログでこれについて非常によく詳しく説明しています。私はここでそれを要約します:
<a><code><a></a>
)でアンカーにアクセスできるはずですが、一部のブラウザ(SafariとFirefox)はコンソールのリファレンスエラーを返します。
<div><code><div>インスタンスなど)、ブラウザはこれらのインスタンスの配列を含むhtmlcollectionを返す必要があります。ただし、Firefoxは最初のインスタンスのみを返します。繰り返しますが、仕様では、要素ツリーでIDインスタンスを使用する必要があると述べています。しかし、そうすることでは、ページが機能することを妨げません。
<li>
<strong>可能なパフォーマンスコスト? </strong>つまり、ブラウザはその参照リストを作成して維持する必要があります。一部の人々は、StackoverFlowスレッドでテストを実行しています。このスレッドでは、名前付きグローバル変数が実際に1つのテストでより良いパフォーマンスを発揮し、最近のテストでは低くなります。 </li>
<h3>その他の予防策</h3>
<p>指定されたグローバル変数の使用に対する批判を放棄し、それらを使用し続けるとします。ではごきげんよう。ただし、これを行うときに考慮したいことがいくつかあります。 </p>
<h4>polyfills </h4>
<p>は極端に聞こえるかもしれませんが、これらのタイプのグローバルチェックは、ポリフィルの典型的なセットアップ要件です。次の例をチェックして、新しいCoicieTore APIを使用してCookieを設定し、まだサポートしていないブラウザでポリフィージーします。
</p>
<div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false"><div id="cool"></div></pre><div class="contentsignin">ログイン後にコピー</div></div><div class="contentsignin">ログイン後にコピー</div></div>このコードはChromeで正常に動作しますが、Safariでは次のエラーをスローします。
<p>
</p>執筆時点では、SafariはCociteTore APIをサポートしていません。したがって、IMG要素IDがCociteToreグローバル変数と競合するグローバル変数を作成するため、PolyFillは適用されません。 <div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">var el = querySelector("#cool");</pre><div class="contentsignin">ログイン後にコピー</div></div><div class="contentsignin">ログイン後にコピー</div></div>
<p>javaScript APIアップデート</p>
<h4>状況を変更して、別の問題を見つけることができます。つまり、ブラウザのJavaScriptエンジンの更新により、指定された要素のグローバルな参照が破損する場合があります。 </h4>
<p>例:</p>
<p>
</p>このスクリプトは、入力要素を参照し、Focus()を呼び出します。正常に動作します。ただし、どれくらいの期間機能するかわかりません。 <div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">window.foo = "bar";</pre><div class="contentsignin">ログイン後にコピー</div></div><div class="contentsignin">ログイン後にコピー</div></div>
<p>ブラウザがBarcodedetector APIをサポートしていることを開始すると、入力要素を参照するために使用するグローバル変数が動作を停止することがわかります。その時点で、window.barcodedetectorグローバル変数は入力要素への参照ではなくなり、.focus()は「window.barcodedeTector.focusは関数ではありません」エラーをスローします。 </p>
<h3>結論</h3>
<p>この点にどのように到達したかを要約しましょう:</p>
<ul>
<li>すべての主要なブラウザは、IDを使用して各DOM要素へのグローバル参照を自動的に作成します(または場合によっては名前属性)。 </li>
グローバルな参照を介してこれらの要素にアクセスすることは信頼できず、危険な場合があります。代わりに<li>または<code>querySelector
を使用してください。 getElementById
一般的に言えば、これに依存すると、壊れやすいコードにつながります。たとえば、新しい機能がWebプラットフォームに追加されるため、最終的にはこのAPIに時間の経過とともにマッピングされる可能性があります。これを行わないでください、
またはを使用してください。
HTML仕様自体は、この機能を避けることをすべて避けることを示唆していると思います。document.getElementById()
document.querySelector()
以上が名前付き要素IDは、JavaScript Globalsとして参照できますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。