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

IT技术 javascript
2021-02-08 13:58:16

我想替换 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。

6个回答

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

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(即无框架)

代替 indexOf 与空格,保存elems[i].className,说var cn和使用cn && cn.match(new RegExp("(^|\\s)" + matchClass + "(\\s|$)"))会更好,因为它匹配任何空格(空格,不间断空格,制表符等),同时还允许匹配第一个/最后一个类名。示例:jsfiddle.net/AXdtH/1636
2021-03-14 13:58:16
+1 - 很好地抓住了空格,我总是忘记这样做......我会窃取它作为我的答案;) class 是 javascript 中的保留字;您不应该将它用作变量名,即使它确实没有造成任何伤害(还)。
2021-03-21 13:58:16
Andrew,@no -class在 Safari 中用作变量名不起作用,因此它目前确实有影响。
2021-04-03 13:58:16
getElementsBytagName 返回的数组也有一个长度属性,然后也对其进行 className/indexOf 测试。尽管在这种情况下这不是问题,但常规的 for 循环会更正确。
2021-04-04 13:58:16
@no 使用该功能,您不必在要替换的元素中包含任何内容。您可以在其中放置一个字符串,也可以将其设为空。无论哪种方式,当调用该函数时,替换文本都会突然出现在那里。
2021-04-09 13:58:16

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

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

但请注意它不适用于 IE8 或更早版本。http://caniuse.com/getelementsbyclassname

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

您可能还是最好使用您最喜欢的跨浏览器库。

对于 IE8,您可以使用querySelectorAll.
2021-03-22 13:58:16
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 方法,则回退到它。

加载选择器引擎只是为了获取具有特定类的元素是否有点过分?大概。然而,脚本并不是那么大,您可能会发现选择器引擎在脚本的许多其他地方都很有用。

document.querySelector适用于 IE8 及更高版本:caniuse.com/queryselector
2021-03-12 13:58:16
@Taylor:我认为它适用于 IE8(不是 100% 确定 - 懒得用谷歌搜索)。无论如何,我添加了一些关于使用第三方选择器引擎向后兼容的信息。
2021-03-19 13:58:16

一个简单的方法

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';
}

我很惊讶没有使用正则表达式的答案。根据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.");