如何过滤jQuery中的vanilla javascript中的元素?

时间:2018-05-29 20:15:16

标签: javascript jquery

例如,在jQuery中,如果我想要所有<div><p>元素,我会这样做:

var $x = $("p, div");

然后,如果我想要x中的所有<div>元素,那么我这样做:

var $divs = $x.filter("div");

那我怎么在vanilla JavaScript中做这个简单的filter事呢?

例如,要选择所有<div><p>,我可以这样做:

var x = document.querySelectorAll("div, p");

但是vanilla JavaScript没有像jQuery那样的过滤功能,所以我不能这样做:

var divs = x.filter("div"); // ERROR

希望有人可以帮助我: - )

提前致谢。

更新

有些评论/答案建议做 .tagName ==“DIV”之类的东西来查找div,但是,我想要一个像jQuery一样的字符串选择器的解决方案。

原因是因为我还希望使用逗号放置属性,类甚至多个选择器。字符串选择器必须是动态的。

这意味着,我不知道选择器中有什么。它可能是“div [foo ='asd'] ,. bar”或“#hello,[xx ='yy'],p”

所以我不能硬编码.tagName ==“DIV”,因为我不知道选择器字符串中有什么。

5 个答案:

答案 0 :(得分:0)

querySelectorAll返回NodeList而不是数组。

您需要将其转换为数组

var arr = Array.prototype.slice.call(x);
var divs = arr.filter(el => { return el.tagName == 'DIV' });

答案 1 :(得分:0)

您可以使用Array.filter

const elems = document.querySelectorAll('p, div');
const divs = [...elems].filter(e => {
  return e.tagName == 'DIV'
});

console.log(divs)
<div id="div1"></div>
<div id="div2"></div>
<div id="div3"></div>
<p id="p1"></p>
<p id="p2"></p>
<p id="p3"></p>

您可以更改e.tagName以使用其他内容进行过滤:

const elems = document.querySelectorAll('p, div');

const divs = [...elems].filter(e => {
  return e.tagName == 'DIV'
});

const byId = [...elems].filter(e => {
  return e.id == 'div1'
});

const byClass = [...elems].filter(e => {
  return e.className == 'class1'
});

console.log(byClass)
<div id="div1" class="class1"></div>
<div id="div2" class="class1"></div>
<div id="div3" class="class2"></div>
<p id="p1" class="class1"></p>
<p id="p2" class="class2"></p>
<p id="p3" class="class2"></p>

答案 2 :(得分:0)

一种非常天真的方法:

function get(selector) {
 const els = document.querySelectorAll(selector);

 return {
   selector,
   length: els.length,
   get: i => els[i],
   [Symbol.iterator]: () => els[Symbol.iterator](),
   filter: f => get(selector + ", " + f)
  };
}

可用作:

const menus = get(".menu");
for(const el of menus) console.log(el);
console.log(menus.filter("div").get(0));

答案 3 :(得分:0)

您可以使用matches函数检查CSS选择器是否与给定元素匹配。

var x = document.querySelectorAll("div, p");
var divs = [];

// Iterate through the elements that the first query selector matched
//  (is a paragraph or a div tag)
for (var elem of x) {
    // Check if the given element matches the second query selector
    //  (is a div tag)
    if (elem.matches('div')) {
        divs.push(elem);
    }
}

使用以下代码可以更简洁地编写代码(以及更现代的代码):

let x = document.querySelectorAll("div, p");
let divs = Array.from(x).filter(elem => elem.matches("div"));

答案 4 :(得分:0)

您可以将 Array.filter()Element.matches() 结合使用

var x = document.querySelectorAll("div, p");
var divs = x.filter(y => y.matches("div"));

// for p tags
var paragraphs = x.filter(y => y.matches("p"));

//for both div and p tags
var mix = x.filter(y => y.matches("div, p"));