如何在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 element by class函数。那么如何修改以上代码以使其与类(而不是ID)一起使用?

PS我不想为此使用jQuery。

Answers:


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-很好地抓住空格,我总是忘了这么做。。。偷东西来回答我的问题;)class虽然是javascript中的保留字;即使它确实没有任何危害(尚未),也不应将其用于变量名。
Dagg Nabbit

1
@no使用该功能,您不必在要替换的元素内包含任何内容。您可以在其中有一个字符串,也可以将其为空。无论哪种方式,当调用函数时,替换文本都会突然出现在此处。
泰勒

4
Andrew,@ no- class用作变量名在Safari中不起作用,因此当前确实会产生影响。
user113716 2010年

4
getElementsBytagName返回的数组还具有length属性,然后也要对其进行className / indexOf测试。尽管在这种情况下这不是问题,但是常规的for循环会更正确。
Wolfgang Stengel

1
而不是使用indexOf而不是空格,保存elems[i].className,说var cn和使用cn && cn.match(new RegExp("(^|\\s)" + matchClass + "(\\s|$)"))将更好,因为它可以匹配任何空白(空格,不间断空格,制表符等),同时还允许匹配头/尾类名称。示例:jsfiddle.net/AXdtH/1636
Supuhstar 2014年

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方法,则退回它。

仅仅加载选择器引擎以获取具有特定类的元素是否为时过早?大概。但是,这些脚本并没有那么大,您可能会发现选择器引擎在脚本中的许多其他地方很有用。


@Taylor:我认为它可以在IE8中使用(不是100%确定-懒得用Google搜索它)。无论如何,我添加了一些有关使用第三方选择器引擎向后兼容性的信息。
Cristian Sanchez

18
document.querySelector可以在IE8及更高版本中使用: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的答案RegExp.test而不是使用String.indexOf,因为它似乎可以更好地执行多种操作。IE6似乎支持它。

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年前发布的该问题另一个答案的紧凑版本。
赫尔姆伯特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 2010年

getAttribute('class')似乎可以在IE之外的所有语言中使用,然后getAttribute('className')可以在IE中使用
KeatsKelleher 2010年


-15

当某些元素缺少ID时,我将使用jQuery,如下所示:

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

这可能是一个奇怪的解决方案,但也许有人觉得它有用。


3
如果class有多个元素myclass,则所有元素都将获得id myid,但是id应该是唯一的!而且,OP明确表示要避免使用jQuery。
Oriol 2014年

1
如果您有多个相同类的元素,那么添加一个foreach()子句和递增ID并不难。对于那些可以使用jQuery的人,我添加了此解决方案作为替代方案。OP已经有了很多合适的答案:-)
Krotek
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.