构造属性选择器

用原生JS构造一个属性选择器的函数

实现一个attr(name, value)遍历,属性为name,值为value的元素集合

例如:let ary = attr('class', 'box'); //获取页面中所有class为box的元素

解析:
该问题要实现的主要功能是构造一个类似属性选择器的函数attr,该函数传入两个参数,第一个参数为一个属性名,第二个参数为属性值。举个例子,就是在当前页面中把所有拥有class该属性名并且其属性值为box的标签拿到。
步骤:

1.先通过document.detElementsByTagName('*')获取当前页面的所有标签;
2.将得到的所有标签通过Array.from()方法转换成数组;
3.对该数组进行遍历;
4.通过get.Arrtibute()方法获取标签中属性名为property的属性值;
5.由于’class’属性的属性值可能不止value值一个,所以要把属性名为’class’的情况先提出来处理,把第二个参数value转换成正则表达式,使用exec()方法判断当前class属性的属性值是否包含value
6.如果传进来的第一个参数property不等于class,就在直接执行后续代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
function attr(property, value){
    let elements = document.getElementsByTagName('*')//获取当前页面中的所有标签
        arr = []
    elements = Array.from(elements);//Array.from()方法就是将一个类数组对象或者可遍历对象转换成一个真正的数组。
    elements.forEach(item => {
        let itemValue = item.getAttribute(property)//getAttribute()获取指定属性名的值
        if(property === 'class'){
            let reg = new RegExp("\\b"+value+"\\b")//\b代表字与字中间那个看不见的东西,/bdo/b表示do的前后都必须是空格
            reg.exec(itemValue) ? arr.push(item) : null
            return;
        }
        if(itemValue === value){//获取的值和传入的值相同,存入数组arr中
            arr.push(item)
        }
    })
    return arr
}
let res = attr('class', 'box')


-->