JS实现继承,获取dom元素

JS实现继承,获取dom元素_第1张图片

1. 输入指定类型选择器,返回dom节点

先实现兼容不同浏览器的根据选择器获取dom节点

1.1 参数校验

根据正则去校验参数是否符合规范,根据不同的类型执行不同的操作
 var idPattern = /^#.{1,}$/
 var classPattern = /^\..{1,}$/
 var tagPattern = /^[a-zA-Z]+.*$/

 if (typeof query !== 'string' || query.length == 0) {
    throw new Error('请传入string类型的参数,且长度大于1')
  } else if (idPattern.test(query)) {
    console.log('id')
  } else if (tagPattern.test(query)) {
    console.log('tag')
  } else if (classPattern.test(query)) {
    console.log('class')
  } else {
    throw new Error('请输入正确的参数,eg:#id,.class,div')
  }

1.2 id & tagName

id 和 tagName,较为简单,直接使用以下两个函数即可,返回dom的节点,id返回的为单个dom节点,tagName返回的为dom list
if (idPattern.test(query)) {
     var id = query.slice(1)
      return document.getElementById(id)
} else if (tagPattern.test(query)) {
   return getElementsByTagName(query)
} 

1.3 class

// 判断是否有querySelectorAll方法
if (!document.querySelectorAll) {
  return document.querySelectorAll(query);
} else {
  var className = query.slice(1)
  var children = document.getElementsByTagName('*'); //获取html中所有的DOM节点 
  var elements = []; //用一个空数组存放要获取的class类名
  for (var i = 0; i < children.length; i++) {
    var child = children[i];
    var classNames = child.className.split(' '); //将节点所有的class节点保存在一个数组之中
    for (var j = 0; j < classNames.length; j++) { //遍历循环,将满足要求的class存入elements空数组中
      if (classNames[j] == className) {
        elements.push(child);
        break;
      }
    }
  }

1.3.1 getElementsByClassName 、 querySelectorAll

这里可以看到,我们先去判断了是否存在querySelectorAll方法,而没有去判断是否有getElementsByClassName方法

querySelectorAll 返回的是一个 Static Node List,而 getElementsBy 系列的返回的是一个 Live Node List

2. JS继承

3. 完整代码

https://codepen.io/xiaofute/p...

你可能感兴趣的:(javascript)