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

代码参考:这里

  • 也叫命名空间风格

    • window.dom 是我们提供的全局对象

    • dom.create(`<div>hi</div>`) 用于创建节点

    • dom.after(node, node2) 用于新增弟弟

    • dom.before(node, node2) 用于新增哥哥

    • dom.append(parent, child) 用于新增儿子

    • dom.wrap(`<div></div>`) 用于新增爸爸 IMG_1560

    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) 用于获取排行老几

最后更新于

这有帮助吗?