手写dom库

126 阅读1分钟

对象风格

也叫命名空间风格,Window.dom是我们提供全局对象,方便使用

dom.create('<div>hi</div>') //用于创建节点
dom.after(node,node2) //新增同级元素
dom.before(node,node2)  //新增同级元素
dom.append(parent,child) //创建一个子级元素
dom.wrap('<div></div>') //新增一个上级元素
window.dom = {
  create(string) {
    const container = document.createElement("template");
    container.innerHTML = string.trim();
    return container.content.firstChild;
  }, //用于创建一个节点
  after(node, node2) {
    node.parentNode.insertBefore(node2, node.nextSibling);
  }, //创建一个弟弟
  before(node, node2) {
    console.log(node);
    console.log(node2);
    window.abc = node;
    node.parentNode.insertBefore(node2, node);
  }, //创建一个哥哥
  append(parent, node) {
    parent.appendChild(node);
  }, //创建一个儿子
  wrap(node, parent) {
    dom.before(node, parent);
    dom.append(parent, node);
  }, //创建一个爸爸
  }

dom.remove(node) //删除节点
dom.empty(parent) //清空元素
  remove(node) {
    node.parentNode.removeChild(node);
    return node;
  },
  empty(node) {
    const array = [];
    let x = node.firstChild;
    while (x) {
      array.push(dom.remove(node.firstChild));
      x = node.firstChild;
    }
    return array; //返回数组
  },

dom.attr(node,'title',?)  //用于读写属性
dom.text(node,?)  //用于读写文本内容
dom.html(node,?)  //用于读写HTML内容
dom.style(node,{color:'red'})  //修改style
dom.class.add(node,blue)  //用于添加class
dom.on(node,'click',fn)  //添加事件监听
dom.off(node,'click',fn)  //删除事件监听
  attr(node, name, value) {
    //重载
    if (arguments.length === 3) {
      node.setAttribute(name, value);
    } else {
      return node.getAttribute(name);
    }
  },
  text(node, string) {
    //适配
    if (arguments.length === 2) {
      if (`innerText` in node) {
        node.innerText = string;
      } else {
        node.textContent = string;
      }
    } else if (arguments.length === 1) {
      if (`innerText` in node) {
        return node.innerText;
      } else {
        return node.textContent;
      }
    }
  },
  html(node, sting) {
    if (arguments.length === 2) {
      node.innerHtml = string;
    } else if (arguments.length === 1) {
      return node.innerHtml;
    }
  },
  style(node, name, value) {
    if (arguments.length === 3) {
      node.style[name] = value;
    } else if (arguments.length === 2) {
      if (typeof name === `string`) {
        return node.style[name];
      } else if (name instanceof Object) {
        for (let key in name) {
          node.style[key] = name[key];
        }
      }
    }
  },
  class: {
    add(node, className) {
      node.classlist.add(className);
    },
    remove(node, className) {
      node.classlist.remove(className);
    },
    has(node, className) {
      node.classlist.contains(className);
    },
  },
  on(node, eventName, fn) {
    node.addEventListener(eventName, fn);
  },
  off(node, eventName, fn) {
    node.removeEventListener(eventName, fn);
  },