HTML DOMに重複したIDを持つ要素がある場合、誰かがjavascript getElementById()の動作に光を当てることができますか??
5 に答える
標準的な動作は定義されていませんが、通常は最初に見つかった要素が返されます。
同じIDの要素が複数ある場合は、それらをすべて選択できます
document.querySelectorAll("[id='myid']")
ただし、それを制御できる場合は、HTML のみを修正する必要があります。
はい、動作は未定義です。
マークアップは無効であり、その状況でブラウザーが何をすべきかを定義する標準はありません。
各ブラウザは妥当なことをしようとし、通常は最初の要素を返します。それを処理できる他の可能な方法は、最後の要素を返すか、要素をまったく返さない (null)、またはエラーをスローすることです。
同じIDを持つ複数のオブジェクトを持つことは違法です。許可されていないため、getElementById()
複数の一致が存在する場合の動作は仕様で指定されていません。実際、仕様には、 「複数の要素がこのIDを持っている場合、動作は定義されていません」と明示的に記載されています。
私がこれを試したいくつかのブラウザでは、最初のブラウザが返されますが、明らかにそれに依存するべきではありません。
すべての一致を検索する場合は、すべてのタグのIDを調べて、一致するタグを収集するクエリを設計する必要があります。
プレーンなJavaScriptでは、次のように実行できます。
function getAllElementsById(id) {
var all = document.getElementsByTagName("*");
var results = [], elem;
for (var i = 0; i < all.length; i++) {
elem = all[i];
if (elem.id && elem.id === id) {
results.push(elem);
}
}
return(results);
}
はい。最初に戻ります。HTML 属性と同じ ID を使用することはできません
。 1. * view plaincopy to clipboardprint?
* {
margin: 0;
padding: 0;
}
より高度なセレクターに移る前に、初心者向けに明らかなものをノックアウトしましょう。
星印は、ページ上のすべての要素を対象としています。多くの開発者は、このトリックを使用してマージンとパディングをゼロにします。これは確かに簡単なテストには問題ありませんが、本番コードでは決して使用しないことをお勧めします。ブラウザに負担がかかりすぎるため、不要です。
* は、子セレクターでも使用できます。プレーンコピーをクリップボードプリントに表示しますか?
#container * {
border: 1px solid black;
}
これは、#container div の子であるすべての要素をターゲットにします。繰り返しますが、このテクニックをあまり使用しないようにしてください。
バツ
プレーンコピーをクリップボードプリントに表示しますか?
#container {
width: 960px;
margin: auto;
}
ハッシュ記号をセレクターの前に付けると、ID でターゲットを設定できます。これは最も一般的な使用法ですが、ID セレクターを使用する場合は注意が必要です。