jQuery创建元素,获取元素:

  1. window.$ = window.jQuery = function (selectorOrArrayOrTemplate) {
  2. let elements;
  3. if (typeof selectorOrArrayOrTemplate === "string") {
  4. if (selectorOrArrayOrTemplate[0] === "<") {
  5. //判断是否想要添加元素
  6. elements = [createElement(selectorOrArrayOrTemplate)];
  7. } else {
  8. //判断为不添加元素,就执行查找元素
  9. elements = document.querySelectorAll(selectorOrArrayOrTemplate);
  10. }
  11. } else if (selectorOrArrayOrTemplate instanceof Array) {
  12. elements = selectorOrArrayOrTemplate;
  13. }
  14. function createElement(string) {//创建元素的方法
  15. const container = document.createElement("template");
  16. container.innerHTML = string;
  17. return container.content.firstChild;
  18. }
  19. const api = Object.create(jQuery.prototype);
  20. //将api的原型指向jQuery.prototype
  21. Object.assign(api, {
  22. //将后面的一个匿名对象复制到目标对象(api),返回新的目标对象
  23. elements: elements,
  24. oldApi: selectorOrArrayOrTemplate.oldApi,
  25. });
  26. return api;
  27. };

链式操作:

最终选中网页元素以后,可以对它进行一系列操作,并且所有操作都可以连在一起,以链条的形式写出来
它的原理在于每一步的jQuery操作,返回的都是一个jQuery对象,所以不同操作可以连在一起。

  1. $("div")//调用结果返回一个api
  2. .addClass("red")//调用结果返回调用该函数的api,使这个api依旧可以操控这些元素
  3. .addClass("green")
  4. .print()

移动元素:

append()和appendTo():在现存元素的内部,从后面加入元素
append()是参数方加入到调用方元素的内部
appendTo()是调用方加入到参数方元素的内部

  1. appendTo(node) {
  2. //调用方加入参数方
  3. if (node instanceof Element) {
  4. this.each((el) => node.appendChild(el));
  5. } else if (node.jquery === true) {
  6. //判断node是否为调用jquery()后返回的api
  7. this.each((el) => node.get(0).appendChild(el));
  8. //如果是,就往node可操纵的第一个元素里添加子元素
  9. //添加的子元素为调用appendTo方法的api所操纵的元素
  10. }
  11. },
  12. append(children) {
  13. //参数方加入调用方
  14. if (children instanceof Element) {
  15. this.get(0).appendChild(children);
  16. } else if (children instanceof HTMLAllCollection) {
  17. for (let i = 0; i < children.length; i++) {
  18. this.get(0).appendChild(children[0]);
  19. }
  20. } else if (children.jquery === true) {
  21. children.each((node) => this.get(0).appendChild(node));
  22. }
  23. },

修改元素属性:

  1. attr( nameOrObject, value) {
  2. //重载:根据传入参数数量或类型来决定具体执行
  3. if(nameOrObject instanceof Object){
  4. this.each((node)=>{
  5. for(let key in nameOrObject ){
  6. node.setAttribute(key,nameOrObject[key])
  7. }
  8. })
  9. }else if (arguments.length === 2) {
  10. this.each((node)=>node.setAttribute(name, value))
  11. }
  12. return this
  13. }

添加元素的class属性值:

  1. addClass(className) {
  2. for (let i = 0; i < this.elements.length; i++) {
  3. const element = this.elements[i];
  4. element.classList.add(className);
  5. //并不覆盖原有class的值
  6. }
  7. return this;
  8. },