getElementsByClassName()(JavaScriptのQ&A)

解決済みの質問

getElementsByClassName()

getElementsByClassName()の使い方での質問です。

Firefox/Safariなどでは、やってみると一応、prototype.jsがなくても使えるようですが、
prototype.jsはダウンロードして使った方がいいのでしょうか?

また、IEは、getElementsByClassName()は使えないみたいなのですが、本当につかえないのでしょうか?

現在、prototype.jsは最新の1.7を使っています。

投稿日時 - 2011-06-12 16:54:24

QNo.6804438

すぐに回答ほしいです

質問者が選んだベストアンサー

サポート状況だけで一喜一憂してはいけません。getElementsByClassName には、「生きた」ノードリストを返すという重要な性質があります。

<!DOCTYPE HTML>
<title>TEST</title>

<script type="text/javascript">
var sections = document.getElementsByClassName('section');
alert(sections.length); // この時点では 0
</script>

<div class="section"><p>HOGE</p></div>
<div class="section"><p>HUGA</p></div>
<div class="section"><p>GEHO</p></div>

<script type="text/javascript">
alert(sections.length); // この時点で 3 に増えている!
</script>

<script type="text/javascript">
while (sections.length > 0) {
 sections[0].className = 'subsection'; // @class を上書きするとリストから消えていく
}
alert(sections.length); // もちろん 0
</script>

この性質を利用すれば、よくある(多くの場合あまり良くない方法としての)load を待ってから云々、という処理をせずに済みます。

しかし、Prototype.js の getElementsByClassName コードが、この性質をちゃんと実装していた記憶はありません(ただの配列を返していたはず)。つまり、「クロスブラウザ」を目指したはずのものが、皮肉にもブラウザ間の実装差を生んでいます。ゆえに、ネイティブの getElementsByClassName だけを使うか、Prototype.js の「似非」getElementsByClassName だけを使うか、どちらかに統一することを強くお勧めします。

なお、querySelectorAll('.section') の戻り値は「生きてない」リストなので、配列と同じように扱うことができます。こちらは IE8 からサポートしています。ただ、getElementsByClassName に比べ、初動が若干遅いです。

投稿日時 - 2011-06-13 19:37:27

お礼

getElementsByName()もIEではサポートされていないみたいです。

IEの場合は、getElementsByClassName()やgetElementsByName()をその動作をJavaScriptで記述して使うことにしました。

ありがとうございました。

投稿日時 - 2011-06-13 21:14:09

ANo.3

0人が「このQ&Aが役に立った」と投票しています

[  前へ  |  次へ ]

ベストアンサー以外の回答(2件中 1~2件目)

ANo.2

getElementsByClassName() は IE9 からだね。

http://msdn.microsoft.com/ja-jp/ie/ff468705#_DOM_L2_HTML
---- 引用はじめ ----
Internet Explorer 9 では、従来のバージョンの Internet Explorer では利用できなかった DOM L2 HTML API のサポートが追加されます。これには、getElementsByClassName および characterSet などの HTML5 API が含まれます。
---- 引用おわり ----

どうするかだけど、JavaScriptライブラリを使うのは、

↓の質問を自己解決できるようになるぐらいまで DOM(※) を JavaScript で自由に操作できるようになってからのほうがいいとおもう。
http://okwave.jp/qa/q6804346.html

(※ DOM)
http://www.w3.org/TR/DOM-Level-2-Core/ecma-script-binding.html

DOM をしらないで JavaScriptライブラリをつかっても、どうせすぐつまずいて、いらいらなだけだしね。




prototype.js より、jQuery のほうがすきだなぁ。。。

投稿日時 - 2011-06-13 13:41:45

ANo.1

<script>
document.write("getElementsByClassName:" +(typeof document.getElementsByClassName)+"<br>");
document.write("getElementsByName:" +(typeof document.getElementsByName)+"<br>");
document.write("getElementById:" +(typeof document.getElementById)+"<br>");
</script>

とすればわかりますね

投稿日時 - 2011-06-13 09:47:05

この質問に関連するQ&A
  • IEとSafari、Firefox
  • IEとSafari、Firefoxでは、スタイルシートでの指定などが変わってくるようですが、どこがどのように変わるのかいまいちわかりません。フォントの種類の指定の仕方だけは本で分かりました。 HPを...
  • firefoxやsafariへの対応。
  • firefoxやsafariへの対応。 http://www.perl-labo.org/gocount/2/ 上記ページのJavascriptを利用したいのですが、 「ジャンプした回数はこちら。」...
  • 最新版のSafariがダウンロードできません!
  • OSはXPです。 なんとかして、古いSafariをミラーで入手したのですが最新版のものは入手できません。 http://www.apple.com/jp/safari/を見てもダウンロードのリンクが...
合わせてチェックしたい
PR

OKWaveのオススメ

-PR-