为了账号安全,请及时绑定邮箱和手机立即绑定

面向对象之——仿写jq

仿写jq

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
        <style type="text/css">
            #outer {
                width: 100px;
                height: 100px;
                background-color: #00FFFF;
            }

            div {
                width: 300px;
                height: 300px;
                background: darkorange;
            }
        </style>
    </head>
    <body>
        <div id="outer">
            <div id="inner" class="center">0
                <span class="ooo"></span>
                <p></p>
                <a href=""></a>
                <span></span>
            </div>
            <div class="center">
                1
            </div>
        </div>
    </body>
    <script type="text/javascript">

        function findClass(obj,className){
            var resultArr=[];
            if(obj.getElementsByClassName){
                resultArr=obj.getElementsByClassName(className);
            }else{
                var arrs=obj.getElementsByTagName("*");
                for(var i=0;i<arrs.length;i++){
                    var reg=new RegExp("\\b"+className+"\\b");
                    if(reg.test(arrs[i].className)){
                        resultArr.push(arrs[i])
                    }
                }
            }
            return resultArr;
        }

        function selectEl(arg){
            //正则去除节点多余空格
            var reg=/[^\s]+/g;
            //数组接收节点
            var elArr=arg.match(reg);
//          console.log(arr);
            //存储父级数组,并初始化
            //从文档层查起
            var parentArr=[document];
            for(var i=0;i<elArr.length;i++){
                var childArr=[];
                for(var j=0;j<parentArr.length;j++){
                    //传入的id #??
                    if(/^#/.test(elArr[i])){
                        //去#
                        var ids=elArr[i].substring(1);
                        var el=document.getElementById(ids);
                        //去重
                        if(childArr.indexOf(el)==-1){
                            childArr.push(el);
                        }
                    }else if(/^\./.test(elArr[i])){
                        //传入的是class .??
                        var className=elArr[i].substring(1);
                        //注意ie低版本不兼容问题
                        var resultArr=findClass(parentArr[j],className);
                        for(var k=0;k<resultArr.length;k++){
                            if(childArr.indexOf(resultArr[k])==-1){
                                childArr.push(resultArr[k]);
                            }
                        }
                    }else{
                        var resultArr=parentArr[j].getElementsByTagName(elArr[i]);
                        for(var k=0;k<resultArr.length;k++){
                            if(childArr.indexOf(resultArr[k])==-1){
                                childArr.push(resultArr[k]);
                            }
                        }
                    }
                }
                parentArr=childArr;
            }
            return parentArr

        }
                //测试
        //var arr=selectEl("    #outer .center span");
        //console.log(arr)

        function $(arg){
            return new Jq(arg)
        }

        function ready(fn){
            //ie兼容
            if(window.addEventListener){
                document.addEventListener('DOMContentLoaded',fn,false)
            }else{
                var os=document.createElement('script');
                os.defer=true;
                os.onreadystatechange=function(){
                    if(os.readyState=="complete"){
                        fn();
                    }
                }
                var oh=document.getElementsByTagName("head")[0];
                oh.appendChild(os);
            }
        }

        function Jq(arg){
            this.elements=[];
            if(typeof arg=="string"){
                this.elements=selectEl(arg)
            }else if(typeof arg=="function"){
                ready(arg);
            }else{
                this.elements.push(arg)
            }
        }
        //console.log($(".center"))
                //JQ:$(".center").eq(1)
        //eq方法最终就是帮我们找到想要操作的DOM节点帮我们把这个DOM节点转化成一个新的jq对象并返回出去
        Jq.prototype.eq=function(index){
            return $(this.elements[index])
        }
        //测试
//      console.log($(".center").eq(1))

        //事件监听兼容IE
        function addEvent(obj,eventName,fn){
            if(obj.addEventListener){//现代浏览器有addEventListener方法
                obj.addEventListener(eventName,fn,false);
            }else{
                obj.attachEvent("on"+eventName,fn);
            }
        }

        //click
        //JQ:$(".center").click(function(){})
        Jq.prototype.click=function(fn){
            for(var i=0;i<this.elements.length;i++){
                //很多事件都要兼容ie低版本
                //用一个函数来兼容ie
                //this.element[i].addEventListener("click",fn,false)
                addEvent(this.elements[i],"click",fn,false);
            }
        }
        //测试
//      $('.center').click(function(){
//          console.log("clickSuc")
//      })
//      $('.center').eq(1).click(function(){
//          console.log("clickSuc1")
//      })

        //on
        //  JQ: $('.center').on("mouseup",function(){})
        //可能有多个事件
        //  JQ: $('.center').on("mouseup  mousedown",function(){})
        Jq.prototype.on=function(eventStr,fn){
            //把事件存储到事件数组中
            var eventArr=eventStr.match(/[^\s]+/g);
//          console.log(eventArr)
            //遍历数组进行事件绑定
            for(var i=0;i<eventArr.length;i++){
                for(var j=0;j<this.elements.length;j++){
                    addEvent(this.elements[j],eventArr[i],fn);
                }
            }
        }
        //测试
//      $('.center').on("mouseup",function(){
//          console.log("onSuc")
//      })
//      $('.center').eq(1).on("mouseup",function(){
//          console.log("onSuc")
//      })
                function setStyle(obj,styleName,styleValue){
            var arr=["width","height"];
            for(var i=0;i<arr.length;i++){
                if(arr[i]==styleName){
                    if(typeof styleValue=="number"){
                        styleValue=styleValue+"px";
                    }
                }
            }
            obj.style[styleName]=styleValue;
        }

        function getStyle(obj,styleName){
            if(window.getComputedStyle){
//              console.log(getComputedStyle(obj,null))
                return getComputedStyle(obj,null)[styleName];
            }else{
                return obj.currentStyle(styleName);
            }
        }

//      $(".index").css({
//          background:"red",
//          width:"100px",
//          height:100
//      });//使用for in 来判断
        Jq.prototype.css=function(){
            if(arguments.length==1){
                if(typeof arguments[0]=="string"){
                    return getStyle(this.elements[0],arguments[0]);
                }else{
                    for(var keys in arguments[0]){
                        for(var i=0;i<this.elements.length;i++){
                            setStyle(this.elements[i],keys,arguments[0][keys]);
//                          this.elements[i].style[keys]=arguments[0][keys];
                        }
                    }
                }
            }else if(arguments.length==2){
                for(var i=0;i<this.elements.length;i++){
                    setStyle(this.elements[i],arguments[0],arguments[1]);
                }
            }
        }

        console.log($(".index").css("background"))
//      $(".index").css("height",100);
//      $(".index").css({
//          background:"red",
//          width:"100px",
//          height:100
//      });
    </script>
</html>
点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

举报

0/150
提交
取消