使用ES6+工厂模式模拟jquery代码「建议收藏」

使用ES6+工厂模式模拟jquery代码「建议收藏」使用ES6+工厂模式模拟jquery代码

大家好,又见面了,我是你们的朋友全栈君。

class jQuery {
  constructor(selector) {
    let splitSelector = selector.match(/([$#])(.*)/);
    if (splitSelector) {
      if (Object.is(splitSelector[1], '$')) {
        this.dom = document.querySelectorAll(splitSelector[2]);
      } else if (Object.is(splitSelector[1], '#')) {
        this.dom = document.getElementById(splitSelector[2]);
      } else {
        this.dom = document.querySelectorAll(selector);
      }
    } else {
      this.dom = document.querySelectorAll(selector);
    }
  }

  _isObject(obj) {
    const _toString = Object.prototype.toString;
    return Object.is(_toString.call(obj), '[object Object]');
  }

  addClass(className) {
    if (className) {
      if (this.dom.className) {
        let classList = this.dom.className.split(' ');
        let classNameList = className.split(' ');
        let concatClassList = classList.concat(classNameList);
        concatClassList = [...new Set(concatClassList)];
        this.dom.className = concatClassList.join(' ');
      } else {
        this.dom.className = `${className}`;
      }
    } else {
      throw new Error('必须传递参数');
    }
    return this;
  }

  removeClass(className) {
    if (className) {
      let classList = this.dom.className.split(' ');
      classList.splice(classList.findIndex(item => Object.is(item, className)), 1);
      this.dom.className = classList.join(' ');
    } else {
      throw new Error('必须传递参数');
    }
    return this;
  }

  html(data) {
    this.dom.innerHTML = data;
    return this;
  }

  css(params) {
    if (params) {
      if (this._isObject(params)) {
        for (let key in params) {
          this.dom.style[key] += params[key];
        }
      } else {
        if (arguments.length != 2) {
          throw new Error();
        } else {
          this.dom.style[arguments[0]] = arguments[1];
        }
      }
    } else {
      throw new Error('必须传递参数');
    }
    return this;
  }
}

window.$ = function (selector) {
  return new jQuery(selector);
};

// 测试代码
$('#div1').html('你好').addClass('cc dd bb').removeClass('bb').css({
   
   'color': '#f00', 'font-size': '20px'});
复制代码
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/107113.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • java集合框架05——ArrayList和LinkedList的区别

    java集合框架05——ArrayList和LinkedList的区别前面已经学习完了List部分的源码,主要是ArrayList和LinkedList两部分内容,这一节主要总结下List部分的内容。List概括先来回顾一下List在Collection中的的框架图:从图中我们可以看出:1.List是一个接口,它继承与Collection接口,代表有序的队列。2.AbstractList是一个抽象类,它继承与AbstractColle

    2022年6月26日
  • 数列极限定义详解「建议收藏」

    数列极限定义详解「建议收藏」数列极限的定义个人感觉不太好理解,我看了两天的教程才彻底明白数列极限的定义。在一般的教材里数列极限的定义为这说的比较抽象,我半天都理解不了N是怎么来的,n与N有什么区别,为什么要用去减a,这里我对自己的疑问做了个总结。首先是为什么要用去减a,两个数之间的接近程度可以用两个之差的绝对值来度量,差值越小,两个数就越接近(说法来源于《高等数学》同济大学)。两个数的接近程度小于任给的正数​…

    2022年4月29日
  • 路由懒加载的原理及实现_前端路由懒加载

    路由懒加载的原理及实现_前端路由懒加载懒加载解决的问题:避免进入首页就加载全部的前端资源造成用户等待时间过长的问题。就好比,访问login页面,你返回的js路由不仅有渲染login页面的,还有渲染production页面以及其他页面的功能。而这些代码量太大了,文件也大。js文件有个特征,下载完全了才会运行,导致页面首屏速度太慢了,也就是白屏时间太长。这个问题,早就有人发现,于是解决方案就是路由懒加载,这只是一个技术名词。Vue路由懒加载原理说明1)我们一开始用ES6的写法,在路由文件router/index.js中

    2022年9月27日
  • golang最新激活码(JetBrains全家桶)

    (golang最新激活码)这是一篇idea技术相关文章,由全栈君为大家提供,主要知识点是关于2021JetBrains全家桶永久激活码的内容IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html1TCF2R91JZ-eyJsaWN…

    2022年3月31日
  • pdf下载插件tcpdf

    pdf下载插件tcpdfThinkphp框架引用tcpdf一:引入tcpdf整个文件夹到项目如下目录/ThinkPHP/Library/Vendor/tcpdftcpdfv6.2.12版本百度网盘下载链接:http://pan.baidu.com/s/1kVhrQoJ密码:bfh4二:简单的使用 三:关于下载PDF时,插件把中文文件名屏蔽了的解决方法四:把tcpdf中的插件引入到项目中

    2022年9月8日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号