如何在JavaScript中按类获取元素?

Tay*_*lor 225 javascript

我想替换html元素中的内容,所以我使用以下函数:

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

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

<div id='box'></div>
Run Code Online (Sandbox Code Playgroud)

以上工作很好,但问题是我在页面上有多个html元素,我想替换它的内容.所以我不能使用id而是使用类.我被告知javascript不支持任何类型的内置get元素的类函数.那么如何修改上面的代码以使其适用于类而不是ID?

PS我不想为此使用jQuery.

Ran*_*Dev 197

此代码应适用于所有浏览器.

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

它的工作方式是循环遍历文档中的所有元素,并搜索其类列表matchClass.如果找到匹配项,则替换内容.

jsFiddle示例,使用Vanilla JS(即没有框架)

  • +1 - 很好地捕捉空间,我总是忘记这样做......为了我的答案而偷窃;)类是javascript中的保留字; 您不应该将它用于变量名称,即使它确实没有造成任何伤害(尚未). (5认同)
  • Andrew,@ no - 使用`class`作为变量名在Safari中不起作用,所以它确实有影响. (4认同)
  • getElementsBytagName返回的数组也有一个length属性,然后也会对其进行className/indexOf测试.虽然在这种情况下这不是问题,但是常规for循环会更正确. (4认同)

Col*_*old 176

当然,现在所有现代浏览器都支持以下更简单的方法:

var elements = document.getElementsByClassName('someClass');
Run Code Online (Sandbox Code Playgroud)

但要注意它不适用于IE8或之前.请参阅http://caniuse.com/getelementsbyclassname

此外,并非所有浏览器都会NodeList像他们应该的那样返回纯粹的.

你最好还是使用自己喜欢的跨浏览器库.

  • 这应该是经过验证的答案. (2认同)

Cri*_*hez 109

document.querySelectorAll(".your_class_name_here");
Run Code Online (Sandbox Code Playgroud)

这将适用于实现该方法的"现代"浏览器(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");
Run Code Online (Sandbox Code Playgroud)

如果您想为旧浏览器提供支持,您可以加载独立的选择器引擎,如Sizzle(4KB mini + gzip)或Peppy(10K mini),如果找不到本机querySelector方法,则可以回退到它.

加载选择器引擎是否过度,以便获得具有某个类的元素?大概.但是,脚本并不是那么大,您可能会发现选择器引擎在脚本中的许多其他位置都很有用.

  • `document.querySelector`适用于IE8及以上版本:http://caniuse.com/queryselector (17认同)

kta*_*kta 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';
}
Run Code Online (Sandbox Code Playgroud)


afs*_*tos 6

我很惊讶使用正则表达式没有答案.根据jsPerf测试,这几乎是安德鲁的答案,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.");
Run Code Online (Sandbox Code Playgroud)

如果经常查找相同的类,可以通过将(预编译的)正则表达式存储在别处并将它们直接传递给函数而不是字符串来进一步改进它.

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.");
Run Code Online (Sandbox Code Playgroud)