getElementsByClassName()有两个类

Unk*_*per 61 html javascript dom

是否可以使用类a b使用getElementsByClassName()一次获取所有元素?我更喜欢vanilla JavaScript.

Pra*_*lan 101

您不能使用getElementsByClassName()方法而是使用querySelectorAll()逗号分隔的类选择器的方法.

document.querySelectorAll('.a,.b')
Run Code Online (Sandbox Code Playgroud)

  • 甚至微软也不再支持IE7了.为什么公司或开发者仍然这样做,我无法理解! (4认同)
  • 这是正确的答案,但请注意,IE8的支持仅适用于CSS2选择器,并且不支持IE <= 7,因此在这种情况下,您需要按类进行两项选择. (2认同)
  • @ zoubida13:我不认为有人还在使用`IE <= 7` :);) (2认同)

Poi*_*nty 13

可以通过getElementsByClassName()使用空格分隔多个类名来传递它们:

var elems = document.getElementsByClassName("class1 class2 class3");
Run Code Online (Sandbox Code Playgroud)

现在,这与.querySelectorAll(".class1,.class2,.class3")方法不同之处在于它应用了一个连词,而不是一个析取词 -“和”而不是“或”。从而

var elems = document.getElementsByClassName("class1 class2 class3");
Run Code Online (Sandbox Code Playgroud)

就好像

var elems = document.querySelectorAll(".class1.class2.class3");
Run Code Online (Sandbox Code Playgroud)

有时您想要一个,有时您想要另一个。的确,它.querySelectorAll()为您提供了更大的灵活性。

  • 这是一个错误的答案,可能是一个很好的评论:) (6认同)
  • 那是“与”而不是“或” (5认同)
  • OP想要“ OR”,而您的修改仍是关于“ AND”的 (5认同)
  • 这是一个回答错误问题的答案,所提供的信息与所提出的问题并不完全相关。OP已经知道的可能性更大。因此,这主要是噪音。 (5认同)
  • 这个不对。它将搜索具有所有三个类的元素 (4认同)
  • @epascarello 是的,我明白了;这只是一个答案。 (2认同)
  • 这个答案不起作用。它只会返回具有所有指定类的元素。 (2认同)

zou*_*a13 6

只是为了增加一点支持,这里有一个与旧版IE兼容的版本并使用纯粹的vanilla js:

function getElementsByClassNameOr(root, classNameString) // classNameString like '.a, .b' don't forget the comma separator
 {
    var arr = [],
    rx = new RegExp('(^|[ \n\r\t\f])' + classNameString + '([ \n\r\t\f]|$)'),
    elements = root.getElementsByTagName("*");

    var elem;

    for (i=0 ; i < elements.length ; i++) {
        elem = elements[i];
        if (rx.test(elem.className)) {
            arr.push(elem);
        }

    }

    return arr; // will contain all the elements that have one of the classes in ClassNameString, root can be document or a div.
}
Run Code Online (Sandbox Code Playgroud)


Mic*_*ski 6

不,只用一个document.getElementsByClassName()电话就无法达到目的.该函数返回将第一个参数中指定的所有类作为空格分隔的字符串的元素.

有两种可能的解决方案.首先是document.querySelectorAll()使用CSS选择器代替.

document.querySelectorAll(".a, .b")
Run Code Online (Sandbox Code Playgroud)

第二个解决方案是调用document.getElementsByClassName()两次,使用转动的结果成阵列Array.from(),并使用将它们合并Array.prototype.concat().为了避免重复(例如,当元素有两个 ab类),你必须创建一个新的集合从数组,然后使用重新设置为阵列Array.from().

const classA = Array.from(document.getElementsByClassName("a"))
     ,classB = Array.from(document.getElementsByClassName("b"))
     ,result = Array.from(new Set(classA.concat(classB)))
Run Code Online (Sandbox Code Playgroud)

见下面的演示:

console.log("first solution", document.querySelectorAll(".a, .b"))

const classA = Array.from(document.getElementsByClassName("a"))
     ,classB = Array.from(document.getElementsByClassName("b"))
     ,result = Array.from(new Set(classA.concat(classB)))

console.log("second solution", result)
Run Code Online (Sandbox Code Playgroud)
<div class="a"></div>
<div class="b"></div>
<div class="a b"></div>
<div class="c"></div>
Run Code Online (Sandbox Code Playgroud)

请注意,第一个解决方案提供了类似于数组的NodeList对象,而第二个解决方案只提供了一个数组.

  • 使用Set是没有意义的,因为在那些浏览器中不支持它,什么不支持querySelectorAll. (3认同)
  • @Somnium这并不像它看起来那样毫无意义.Babel支持Set,但不支持`document.querySelectorAll()`(因为它不是ECMAScript的一部分,而是Web API的一部分).如果您使用Babel编译代码,第二个解决方案将适用于所有浏览器.坦率地说,我写的第二个解决方案非常有趣,而不是真正的解决方案. (3认同)