JavaScriptでクラスごとに要素を取得する方法


226

html要素内のコンテンツを置き換えたいので、次の関数を使用しています。

function ReplaceContentInContainer(id,content) {
   var container = document.getElementById(id);
   container.innerHTML = content;
}

ReplaceContentInContainer('box','This is the replacement text');

<div id='box'></div>

上記はうまく機能しますが、問題は、コンテンツを置き換えるページに複数のhtml要素があることです。だから私はIDではなくクラスを使うことができません。javascriptは、クラス関数による組み込みのget要素のタイプをサポートしないと言われています。では、上記のコードをどのように修正して、IDではなくクラスで機能させることができるでしょうか。

PSこのためにjQueryを使用したくありません。

回答:


198

このコードはすべてのブラウザで機能するはずです。

function replaceContentInContainer(matchClass, content) {
    var elems = document.getElementsByTagName('*'), i;
    for (i in elems) {
        if((' ' + elems[i].className + ' ').indexOf(' ' + matchClass + ' ')
                > -1) {
            elems[i].innerHTML = content;
        }
    }
}

これが機能する方法は、ドキュメント内のすべての要素をループして、クラスリストでを検索することですmatchClass。一致が見つかると、内容が置き換えられます。

jsFiddleの例、Vanilla JSを使用(つまりフレームワークなし)


5
+1-スペースをうまくとらえる、私はいつもそうすることを忘れています...私の答えのためにそれを盗むつもりです;)クラスはJavaScriptの予約語ですが; (まだ)実際に害はないのですが、変数名には使用しないでください。
Dagg Nabbit、2009

1
@noその関数を使用すると、置き換える要素内にコンテンツを含める必要はありません。そこに文字列を入れることも、空にすることもできます。どちらにしても、関数が呼び出されると、置換テキストが突然表示されます。
テイラー

4
Andrew、@ no- class変数名としての使用はSafariでは機能しないため、現在影響があります。
user113716 '28 / 09/28

4
getElementsBytagNameによって返された配列にも長さプロパティがあり、そのためにクラス名/インデックスのテストも行われます。この場合、これは問題ではありませんが、通常のforループの方が適切です。
Wolfgang Stengel 2013年

1
スペースを含むindexOfの代わりに、任意の空白(スペース、改行しないスペース、タブなど)に一致すると同時に、最初と最後のクラス名を一致させることもできるので、保存elems[i].classNameして、たとえばvar cn、使用cn && cn.match(new RegExp("(^|\\s)" + matchClass + "(\\s|$)"))するとより効果的です。例:jsfiddle.net/AXdtH/1636
Supuhstar

178

もちろん、現在のすべてのブラウザは次の簡単な方法をサポートしています。

var elements = document.getElementsByClassName('someClass');

ただし、IE8以前では機能しません。http://caniuse.com/getelementsbyclassnameを参照してください

また、すべてのブラウザがNodeList本来のピュアを返すわけではありません。

おそらく、お気に入りのクロスブラウザーライブラリを使用したほうがよいでしょう。


IE8の場合はを使用できますquerySelectorAll
Gras Double

109
document.querySelectorAll(".your_class_name_here");

これは、その方法(IE8 +)を実装する「最新の」ブラウザで機能します。

function ReplaceContentInContainer(selector, content) {
  var nodeList = document.querySelectorAll(selector);
  for (var i = 0, length = nodeList.length; i < length; i++) {
     nodeList[i].innerHTML = content;
  }
}

ReplaceContentInContainer(".theclass", "HELLO WORLD");

古いブラウザのサポートを提供したい場合は、Sizzle(4KB mini + gzip)やPeppy(10K mini)などのスタンドアロンセレクタエンジンをロードし、ネイティブのquerySelectorメソッドが見つからない場合はそれに戻すことができます。

特定のクラスの要素を取得できるようにセレクターエンジンをロードするのはやりすぎですか?恐らく。ただし、スクリプトはそれほど大きくないため、スクリプトの他の多くの場所でセレクターエンジンが役立つ場合があります。


@テイラー:IE8で動作すると思います(100%確実ではありません-怠惰すぎてグーグルできません)。とにかく、サードパーティのセレクターエンジンを使用した下位互換性に関する情報を追加しました。
クリスティアンサンチェス

18
document.querySelectorIE8以降で動作:caniuse.com/queryselector
Zeke

26

シンプルで簡単な方法

var cusid_ele = document.getElementsByClassName('custid');
for (var i = 0; i < cusid_ele.length; ++i) {
    var item = cusid_ele[i];  
    item.innerHTML = 'this is value';
}

6

正規表現を使った答えがないことに驚いています。jsPerfテストによると、これはの代わりにを使用したAndrewの答えです。 また、IE6でサポートしているようですRegExp.testString.indexOf

function replaceContentInContainer(matchClass, content) {
    var re = new RegExp("(?:^|\\s)" + matchClass + "(?!\\S)"),
        elems = document.getElementsByTagName('*'), i;
    for (i in elems) {
        if (re.test(elems[i].className)) {
            elems[i].innerHTML = content;
        }
    }
}

replaceContentInContainer("box", "This is the replacement text.");

同じクラスを頻繁に探す場合は、(プリコンパイルされた)正規表現を別の場所に格納し、文字列ではなく関数に直接渡すことで、クラスをさらに改善できます。

function replaceContentInContainer(reClass, content) {
    var elems = document.getElementsByTagName('*'), i;
    for (i in elems) {
        if (reClass.test(elems[i].className)) {
            elems[i].innerHTML = content;
        }
    }
}

var reBox = /(?:^|\s)box(?!\S)/;
replaceContentInContainer(reBox, "This is the replacement text.");

4

これはほとんどすべてのブラウザで機能するはずです...

function getByClass (className, parent) {
  parent || (parent=document);
  var descendants=parent.getElementsByTagName('*'), i=-1, e, result=[];
  while (e=descendants[++i]) {
    ((' '+(e['class']||e.className)+' ').indexOf(' '+className+' ') > -1) && result.push(e);
  }
  return result;
}

次のように使用できるはずです。

function replaceInClass (className, content) {
  var nodes = getByClass(className), i=-1, node;
  while (node=nodes[++i]) node.innerHTML = content;
}

3

var elems = document.querySelectorAll('.one');

for (var i = 0; i < elems.length; i++) {
    elems[i].innerHTML = 'content';
};


4
それは本当に答えではありません。あなたのコード説明してみてください。さらに、それは基本的に5年前に投稿されたこの質問に対する別の回答のよりコンパクトなバージョンです。
helmbert、2015年

何が問題なのかわかりません。この答えは大丈夫です。コメントはありません...そして何ですか?これはゴールドルールではありません。そして、あなたはここでコメントしたいですか?そして、それは可読コードですか?
AntiCZ、2015

3

これは最初に要求されたときは有効なオプションではなかったと思いますが、今は使用できますdocument.getElementsByClassName('');。例えば:

var elements = document.getElementsByClassName(names); // or:
var elements = rootElement.getElementsByClassName(names);

詳細については、MDNのドキュメントを参照してください。


0

私は次のようなものだと思います:

function ReplaceContentInContainer(klass,content) {
var elems = document.getElementsByTagName('*');
for (i in elems){
    if(elems[i].getAttribute('class') == klass || elems[i].getAttribute('className') == klass){
        elems[i].innerHTML = content;
    }
}
}

働くだろう


1
あなたのページの要素のほんの一握りを持っている場合は、そうでない場合、これはO(N)ソリューションです
JWL

getAttribute( 'class')はIE以外のすべてで機能するようですが、getAttribute( 'className')はIEで機能します
KeatsKelleher


-15

一部の要素にIDがない場合は、次のようにjQueryを使用します。

$(document).ready(function()
{
    $('.myclass').attr('id', 'myid');
});

これは奇妙な解決策かもしれませんが、多分誰かがそれを役に立つと思います。


3
class myclassに複数の要素がある場合、それらのすべてがidを取得しますが、id myidは一意である必要があります!さらに、OPはjQueryを避けるように明示的に言っています。
Oriol

1
同じクラスの要素が複数ある場合、foreach()句を追加してIDをインクリメントすることは難しくありません。このソリューションを、jQueryを使用できるユーザーの代わりとして追加しました。OPはとにかく適切な回答の束を得ています:-)
Krotek
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.