美文网首页
模拟jQuery实现原理

模拟jQuery实现原理

作者: 七月凛冬 | 来源:发表于2019-01-01 22:39 被阅读0次

    jQuery实质上就是一个构造函数,接受一个参数,这个参数可能是节点,然后返回一个方法对象是操作节点。

    大概模拟下jQuery实现原理。

    细节注释如下:

    window.jQuery = function (nodeOrSelector) {  // 参数可能是node,也可能是选择器
      let nodes = {}  // 先声明一个空对象,伪数组
      if (typeof nodeOrSelector === 'string') {  // 字符串检测,如果是个字符串或多个字符串
        let temp = document.querySelectorAll(nodeOrSelector)  // 找一个节点或多个节点,temp是伪数组,不想要nodelist的原型
        for (let i = 0; i < temp.length; i++) {  // 遍历这个temp
          nodes[i] = temp[i]
        }
        nodes.length = temp.length  // 生成新的纯净的伪数组,有纯净的原型链
      } else if (nodeOrSelector instanceof Node) {  // 如果传的是一个节点
        nodes = {   // 前一种情况返回伪数组,另外一种情况也应该返回伪数组,不会被弄晕
          0: nodeOrSelector,
          length: 1
        }
      }
    
      nodes.addClass = function (classes) {
        [classes].forEach((value) => {  // 有可能每个节点上要加不止一个class(classes可能是个伪数组),所以需要foreach()方法,对classes里每个值执行函数
          for (let i = 0; i < nodes.length; i++) {  // 要加多个元素节点的class,所以需要遍历,根据nodes的个数
            nodes[i].classList.add(value)   // 对每个遍历到的nodes的值addclass(根据classes里value个数,因为foreach方法,这个for循环要轮几大轮)
          }
        })
      }
    
      nodes.setText = function (text) {
        for (let i = 0; i < nodes.length; i++) {  // 利用for循环遍历nodes
          nodes[i].textContent = text   // nodes里每个value的textcontent都等于text
        }
      }
      return nodes  // 返回nodes
    }
    window.$ = jQuery
    
    var $div = $('div')
    $div.addClass('blue') // 可将所有 div 的 class 添加一个 blue
    $div.setText('hi') // 可将所有 div 的 textContent 变为 hi
    

    相关文章

      网友评论

          本文标题:模拟jQuery实现原理

          本文链接:https://www.haomeiwen.com/subject/uijolqtx.html