JQ

拥有回忆 提交于 2020-03-01 09:43:49

Jq的简单使用的

{
    // 原生
    document.querySelector(".btn").onclick = function(){
        console.log(1);
    }
    // Jq
    $(".btn").click(function(){
        console.log(1);
    });
    // 两个都是一样效果!
}
{
    // $(".btn");//JQ的选择器;
    /* 
        JQ的选择器有三种方式:
    */
    $(".btn");//字符串 -> 类,class,标签选择器;
    $(function(){});//回调函数 -> 直接执行里面逻辑
    $(document.querySelector(".btn"));//dom节点 -> 一个对象
    $(document.querySelectorAll(".btn"));//dom节点 -> 多个对象
}
{
    // jq的基本分析
    // $(".btn") -> 就是一个$()函数执行,里面带有参数
    // $(".btn").click() -> .click() 就像对象里面的方法
        /* let obj = {
            click(){
                console.log(1);
            }
        }
        obj.click(); */
        // 所以,$(".btn").click() 这步可以返还一个对象,对象里面就可以 执行这个click函数
        // $(".btn").click(function(){}); click(参数) , 参数也就可以放到:
            /* let obj = {
                click(fn){
                    fn();
                }
            }
            obj.click(function(){
                console.log("执行")
            }) */
    // 小总结: 1.有一个$()函数,返还对象 2.对象里面的方法执行;
}

模拟jq的$()选择器

{
    /* 
        $()选择器
        一、字符串找到节点 -> string
            1.传参
            2.通过对应字符串得到对应节点;
                document.querySelectorAll(arg);
            3.伪数组的处理:
            因为他们都是在对象里面,this就是实例化对象 -> 外部使用$()的对象; -> 是对象也就可以添加下标 = 对应节点;
                for(let i = 0;i<els.length;i++){
                    this[i] = els[i];
                }
                this.length = els.length;
        二、传入方法 -> function
            首先观看他们的区别:传进来的数据是有 类型区别的(字符串,方法,对象);
            页面加载完毕执行:
                window.addEventListener("DOMContentLoaded",arg,false);
        三、传入对象 -> object
            1.判断对象个数:
                if(typeof arg.length === "undefined"){
                    // 单对象
                    this[0] = arg;
                    this.length = 1;
                }else{
                    // 多对象
                    this.addEle(arg);
                }
    */

   class Jq{
        constructor(arg){
            if(typeof arg === "string"){
                // console.log(arg);//.btn
                let els = document.querySelectorAll(arg);
                // console.log(els);//->NodeList 伪数组;

                this.addEle(els)
            }else if(typeof arg === "function"){//传入方法 -> 页面加载完成就执行;
                window.addEventListener("DOMContentLoaded",arg,false);
            }else{
                // 有两种情况:1.一个对象 2.对象类数组(有length);
                    // 注:一个对象并没有length; -> undefined
                // 判断是单对象还是多对象
                if(typeof arg.length === "undefined"){
                    // 单对象
                    this[0] = arg;
                    this.length = 1;
                }else{
                    this.addEle(arg);
                }
            }
            
        }
        addEle(els){
            // 因为他们都是在对象里面,this就是实例化对象 -> 外部使用$()的对象; -> 是对象也就可以添加下标 = 对应节点;
            for(let i = 0;i<els.length;i++){
                this[i] = els[i];
            }
            this.length = els.length;//为这群节点来一个统计,好进行调用;
            // console.log(this);//一群元素
        }
        click(fn){//click方法回调:
            // addEventListener : 当用户"点击",在元素上执行函数
            for(let i = 0;i<this.length;i++){
                this[i].addEventListener("click",fn,false);//绑冒泡定事件,事件,阻止
            }
        }
    }
    function $(arg){
        return new Jq(arg);
    }
}

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!