📔
饥人谷前端体系课程笔记
黑马程序员笔记前端面试押题前端精进
  • 课程大纲
  • Git入门
    • 3. 软件安装详解
    • 4. Mac环境搭建
    • 5. 命令行入门
    • 6. 本地仓库
    • 7. Git远程仓库-GitHub
  • HTML全解
    • 8. HTML概览
    • 9. HTML标签
    • 10. HTML重难点
    • 11. HTML实践 & 手机调试
  • CSS全解
    • 12. CSS基础
    • 13. CSS布局(上)
    • 14. CSS布局(下)
    • 15. CSS定位
    • 16. CSS动画
  • HTTP全解
    • 17. URL 是什么
    • 18. 请求和响应 & Node.js Server
  • JS全解
    • 19. JavaScript概览
    • 20. 内存图与JS世界(精品课)
    • 21. Canvas 实践—画图板
    • 22. JS语法
    • 23. JS数据类型
    • 24. JS 对象
    • 25. JS 对象分类
    • 26. JS 数组
    • 27. JS 函数
    • 28. JS 实战,会动的代码
    • 29. JS运算符
    • 30. JS总结
  • JS编程接口
    • 31. DOM编程
    • 32. 手写DOM库
    • 33. JQuery中的设计模式(上)
    • 34. JQuery中的设计模式(下)
    • 35. DOM事件与事件委托
  • 项目 前端导航站点
    • 前端导航项目笔记
  • 前后分离
    • 40. AJAX的原理
    • 41. 异步与Promise
    • 42. 跨域、CORS、JSONP
    • 43. 静态服务器
    • 44. AJAX实战:Cookie、Session
  • JS进阶MVC
    • 48. MVC(上)
    • 49. MVC(中)
    • 50. MVC(下)
  • 项目构建
    • 51. Webpack(上)
    • 52. Webpack(下)
  • 算法与数据结构
    • 62. 伪代码与流程图
  • React全解
    • 75. React起手式
    • 76. React类组件和函数组件
    • 77. Class组件详解
    • 78. 函数组件
    • 79. Hooks原理解析
    • 80. Hooks各个击破
    • 81. 精通Redux
  • Node.js
    • 84. Node.js技术架构
    • 85. 文件模块
    • 86. 单元测试之文件模块
    • 87. 调试 Node.js 程序
    • 88. 静态服务器
    • 89. 命令行翻译工具
    • 90. 操作数据库
    • 91. 数据库基础知识
    • 92. Stream 流
    • 93. child_process
    • 94. 总结
  • TypeScript
    • 112. 基础
    • 113. 泛型
  • Next.js全解
    • Next.js 上
    • Next.js 下
  • ES6精讲
    • Promise,async/await
  • 大屏可视化笔记
    • 大屏可视化项目
  • SCSS全解
    • SCSS全解
  • 拓展
    • 一次性弄懂性能优化
    • Web性能优化
由 GitBook 提供支持
在本页

这有帮助吗?

  1. JS编程接口

33. JQuery中的设计模式(上)

上一页32. 手写DOM库下一页34. JQuery中的设计模式(下)

最后更新于2年前

这有帮助吗?

代码参考:

  • 也叫命名空间风格

    • 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");//可以包含任何tag,连td都可以容纳,如果把td放到div中,会return undefined
        container.innerHTML = string.trim();// .trim()去掉字符串两边的空格
        return container.content.firstChild; //万能公式,可以创建任何元素
      },
    
      after(node, node2) {
        node.parentNode.insertBefore(node2, node.nextSibling);//有个实验功能node.after(),但是不推荐使用
      },
    
      before(node, node2) {
        node.parentNode.insertBefore(node2, node);
      },
    
      append(parent, node) {
        parent.appendChild(node);
      },
    
      wrap(node, parent) {
        //用parent包裹node 看下面的图示,右边是最后的效果,左边是先将div3插到div1后面,然后再把div2插到div3后面
        //wrap(div2,div3) 把div3包到div2的外面
        //dom.before(div2,div3) 把div3插到div2的前面
        //dom.append(div3,div2) 把div2插到div3的里面
        dom.before(node, parent);
        dom.append(parent, node);
      }
    };
    截屏2023-04-09 上午12.53.55
  • 删

    • dom.remove(node) 用于删除节点 //把一个节点从树中删掉

    • dom.empty(parent) 用于删除后代 //把一个父元素的所有儿子全部删除

    remove(node){
    	node.parentNode.removeChild(node);
    	return node;
    }
    
    empty(node){
    //node.innerHTML = "";第一种方法,但是这样就获取不到后面节点的引用了
    const {childNodes} = node; //解构赋值 <=> const childNodes = node.childNodes
    const array = [];
    let x = node.firstChild;
    while(x){
    	array.push(dom.remove(node.firstChild));
    	x = node.firstChild
    }
    }
    
  • 改

    • dom.attr(node, 'title', ?) 用于读写属性

    • dom.text(node, ?) 用于读写文本内容

    • dom.html(node, ?) 用于读写 HTML 内容

    • dom.style(node, {color: 'red'}) 用于修改 style

    • dom.class.add(node, 'blue') 用于添加 class

    • dom.class.remove(node, 'blue') 用于删除 class

    • dom.on(node, 'click', fn) 用于添加事件监听

    • dom.off(node, 'click', fn) 用于删除事件监听

    attr(node,name, value){//(节点,属性名,属性值) 重载Overload:根据不同参数调用不同函数
    	if(arguments.length === 3){ //如果传入的参数长度为3,就意味着要设置attribute
    		node.setAttribute(name, value);
    	}else if(arguments.length === 2){//
    		return node.getAttribute(name);//如果传入的参数长度为2,说明只是想获取attribute
    	}	
    }
    
    text(node, string){ //适配
    // node.innerText = string //ie
    // node.textContent = string // firefox/Chrome
    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, string){
     if(arguments.length === 2){
     	node.innerHTML = string;
     }else if(arguments.length === 1){
     	return node.innerHTML;
     }
    }
    
    
    style(node, object){
      for(let key in object){
        node.style[key] = object[key]
      } 
    }
    //dom.style(test, {border:'1px solid red', color:'blue'})
    
    style(node,name,value){
      if(arguments.length === 3){
       // dom.style(div, 'color', 'red')
        node.style[name] = value;
      }else if(arguments.length === 2){
        if(typeof name === 'string'){
          //dom.style(div,'color')
          return node.style[name]
        }else if(name instanceof Object){
          //dom.style(div,{color:'red'})
          const object = name
          for(let key in object){
            node.style[key] = object[key]
          }
        }
      }
    }
    //dom.style(test, 'border', '1px solid black')
    
    
    class:{
      add(node, className){
        node.classList.add(className)
      },
       remove(node, className){
         node.classList.remove(className)
      },
       has(node, className){
         return node.classList.contains(className)
       }
    }
    //<style>.red{background:red;}</style>
    //dom.class.add(test, 'red')
    //dom.class.add(test, 'blue')
    //dom.class.remove(test,'blue')
    
    on(node, eventName, fn){
      node.addEventListener(eventName, fn);
    },
    off(node, eventName, fn){
      node.removeEventListener(eventName, fn);
    }
    //**
    //const fn = ()=>{
    //	console.log("clicked");
    //	}
    //dom.on(test, 'click',fn)
    //dom.off(test, 'click', fn)
    //
    
  • 查

    • dom.find('选择器') 用于获取标签或标签们

    • dom.parent(node) 用于获取父元素

    • dom.children(node) 用于获取子元素

    • dom.siblings(node) 用于获取兄弟姐妹元素

    • dom.next(node) 用于获取弟弟

    • dom.previous(node) 用于获取哥哥

    • dom.each(nodes, fn) 用于遍历所有节点

    • dom.index(node) 用于获取排行老几

find(selector, scope){
  return (scope || document).querySelectorAll(selector)
}
//const testDiv = dom.find('#test')[0] 必须要加[0],否则获取的就是一个数组

parent(node){
  return node.parentNode;
}

children(node){
  return node.children;
}

siblings(node){//不包括自己
  return Array.from(node.parentNode.children).filter(n => n !== node)
}

next(node){
  let x = node.nextSibling
  while(x && x.nodeType === 3){
    x = x.nextSibling
  }
  return x;
}

previous(node){
  let x = node.previousSibling
  while(x && x.nodeType === 3){
    x = x.previousSibling
  }
  return x;
}

each(nodeList, fn){
  for(let i = 0 ; i < nodeList.length; i++){
    fn.call(null, nodeList[i])
  }
}


index(node){
  const list = dom.children(node.parentNode);
  let i;
  for( i = 0; i < list.length; i++){
    if(list[i] === node){
      break;
    }
  }
  return i;
}
这里
IMG_1560