仿寫JQ方法

原生js仿寫jq

function $(arg){
            return new Jq(arg);
        }
        //做兼容函數(shù):
        function ready(arg){
            //如果瀏覽器支持addEventListener 就調(diào)用郭怪,否則用其他方法
            if(window.addEventListener){
                window.addEventListener("DOMContentLoaded",arg,false)
            }else{
                //h獲取頭部節(jié)點(diǎn)
                var head = document.getElementsByTagName("head")[0];
                var myScript = document.createElement("script");
                head.appendChild(myScript);
                //監(jiān)控script標(biāo)簽是否創(chuàng)建成功竹椒,如果創(chuàng)建成功就執(zhí)行arg函數(shù)
                //onreadystatechange 監(jiān)控網(wǎng)絡(luò)狀態(tài)
                myScript.onreadystatechange = function(){
                    if(myScript.readyState == "complete"){
                        //script 節(jié)點(diǎn)創(chuàng)建完成意乓,執(zhí)行arg;
                        arg();
                    }
                }
            }
        }
        function findClass(className,obj){
            if(obj.getElementsByClassName){
                //主流瀏覽器支持getElementsByClassName 函數(shù)
                var eles = obj.getElementsByClassName(className);
            }else{
                //IE瀏覽器不支持洪己;
                var tags = document.getElementsByTagName("*")
                var eles =[]
                for(var i=0; i <tags.length;i++){
                    var reg = new RegExp("\\b"+className+"\\b")//接收字符串
                    if(reg.test(tags[i].className)){
                        eles.push(tags[i])
                    }
                }
            }
            return eles;
        }
        
        //通過id 、class 竟贯、標(biāo)簽獲取節(jié)點(diǎn)
        function selectEles(arg){
            //去掉首尾空格答捕;正則;
            var reg1 =/^\s+|\s+$/g;// /g全局匹配
            arg = arg.replace(reg1,"");
            //將中間的空格替換成一個空格
            var reg2 = /\s+/g;
            arg = arg.replace(reg2," ");
            var arr = arg.split(" ");
            console.log(arr)
            var parent = [document];
            for(var i = 0;i<arr.length;i++){
                for(var j=0;j<parent.length;j++){
                    //每次循環(huán)查找的內(nèi)容放入到child中
                    var child =[]
                    //判斷字符串以什么開頭屑那;
                    if(/^\./.test(arr[i])){
                        var className = arr[i].substr(1);
                        //在parent里獲取到的節(jié)點(diǎn)
                        //根據(jù)類名獲取節(jié)點(diǎn)的兼容函數(shù)
                        var eles = findClass(className,parent[j])
                        child = eles;
                    }else if(/^#/.test(arr[i])){
                        var idName= arr[i].substr(1);
                        var eles = document.getElementById(idName);
                        child.push(eles)
                    }else{
                        var eles = parent[j].getElementsByTagName(arr[i]);
                        child = eles;
                    }
                }
                parent = child;
            }
            console.log(parent)
            return parent;
        }
        
        function Jq(arg){
            this.elements =[];
            if(typeof arg== "string"){
                //通過id 拱镐、class 艘款、標(biāo)簽獲取節(jié)點(diǎn)
                var eles = selectEles(arg);
                console.log(eles)
                for(var i = 0; i <eles.length;i++){
                    this.elements.push(eles[i])
                }
            }else if(typeof arg == "function"){
                console.log("要在頁面加載完成后執(zhí)行")
                //事件節(jié)點(diǎn),頁面加載完成后      
                //做兼容
                ready(arg);
            }else{
                if(arg.length == undefined){
                    this.elements.push(arg)
                }else{
                    for(var i=0;i<arg.length;i++){
                        this.elements.push(arg[i])
                    }
                }
            }
        }
        

仿寫jq的click方法

        function addEvent(el,name,fn){  
            if(el.addEventListener){
                return el.addEventListener(name,fn,false);//在火狐中會執(zhí)行這一句
            }else{
                return el.attachEvent('on'+name,fn);//在ie中執(zhí)行這一句
            }
        }
        Jq.prototype.click = function(fn){
            console.log(this.elements)
            for(var i=0;i<this.elements.length;i++){
                addEvent(this.elements[i],"click",fn)
            }
        }

仿寫jq的on事件

        Jq.prototype.on = function(type,fn){
            //第一個參數(shù)做容錯處理沃琅,切割數(shù)組哗咆;
            var arg1 = type;
            var reg1 = /^\s+|\s+$/g;
            arg1=arg1.replace(reg1,"");
            var reg2 = /\s+/g;
            arg1 = arg1.replace(reg2," ");
            var arr = arg1.split(" ");
            
            for(var i=0;i<this.elements.length;i++){
                for(var j=0;j<arr.length;j++){
                    addEvent(this.elements[i],arr[j],fn)
                }
            }
        }

仿寫jq的eq方法

        Jq.prototype.eq = function(index){
            return new Jq(this.elements[index]);
        }

仿寫jq的 css方法

        //css容錯處理
        //css寫法,({background:"red"})一個參數(shù)(對象),("background","blue")兩個參數(shù),("background")一個參數(shù)(字符串)
        //查詢css屬性
        function getStyle(obj,styleName){
            if(window.getComputedStyle){
                //主流瀏覽器
                var styles = getComputedStyle(obj,null)[styleName];
            }else{
                //IE瀏覽器
                var styles = obj.currentStyle[styleName];
            }
            return styles;
        }
        // 設(shè)置css屬性
        function setStyle(obj,styleName,styleValue){
            if(typeof styleValue == "number"){
                styleValue = styleValue+"px"
            }
            obj.style[styleName] = styleValue;
        }
        Jq.prototype.css=function(){
            if(arguments.length==1){
                if(typeof arguments[0]=="string"){
                    //參數(shù)是字符串:————》獲取樣式
                    // getComputedStyle
                    // $(".li").css("background");
                    var styles = getStyle(this.elements[0],arguments[0]);
                    console.log("樣式是:"+styles)
                    
                }else{
                    // 設(shè)置css樣式
                    //參數(shù)是對象
                    for(var i=0;i<this.elements.length;i++){
                        for(var j in arguments[0]){
                            setStyle(this.elements[i],j,arguments[0][j])
                        }
                    }
                }
            }else{
                //傳多個參數(shù)
                for(var i=0;i<this.elements.length;i++){
                    setStyle(this.elements[i],arguments[0],arguments[1])
                }
            }
            
        }

仿寫jq的animate方法

        
        //動畫  aniamte(style,speed,easing,callback)
        //第一個參數(shù):是一個對象
        //第二個參數(shù):1益眉、時(shí)間 2晌柬、slow、normal郭脂、fast 3年碘、回調(diào)
        //回調(diào)始終是在最后一個參數(shù)上,并且回調(diào)可有可無
        Jq.prototype.animate =function(){
            var times = 500;
            if(arguments.length>1){
                if(typeof arguments[1] == "string"){
                    // slow normal fast
                    switch(arguments[1]){
                        case "slow":
                            times = 2000;
                            break;
                        case "fast":
                            times = 200;
                            break;
                        default:
                            times=500;
                            break;
                    }
                }else if(typeof arguments[1] == "number"){
                    times = arguments[1];
                }
                
            }
            //針對第一個參數(shù)處理:對象
            var styleName = "";
            var transitionTimes ="";
            for(var i in arguments[0]){
                styleName += i+","
                transitionTimes += times/1000+"s,"
            }
            styleName = styleName.substr(0,(styleName.length-1))
            
            transitionTimes= transitionTimes.substr(0,(transitionTimes.length-1))
            for(var i=0;i< this.elements.length;i++){
                this.elements[i].style.transition = styleName+" "+transitionTimes;
                for(var j in arguments[0]){
                    setStyle(this.elements[i],j,arguments[0][j])
                }
            }
            console.log(styleName,transitionTimes)
            //最后一個參數(shù)
            if(typeof arguments[arguments.length-1] == "function"){
                var fn = arguments[arguments.length-1];
//              setTimeout(()=>{
//                  arguments[arguments.length-1]();
//              },times)
                setTimeout(function(){
                    fn();
                },times)
                //說明最后一個參數(shù)是回調(diào)函數(shù)
            }
        }
        
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末展鸡,一起剝皮案震驚了整個濱河市屿衅,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌莹弊,老刑警劉巖涤久,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異箱硕,居然都是意外死亡拴竹,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進(jìn)店門剧罩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來栓拜,“玉大人,你說我怎么就攤上這事惠昔∧挥耄” “怎么了?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵镇防,是天一觀的道長啦鸣。 經(jīng)常有香客問我,道長来氧,這世上最難降的妖魔是什么诫给? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮啦扬,結(jié)果婚禮上中狂,老公的妹妹穿的比我還像新娘。我一直安慰自己扑毡,他們只是感情好胃榕,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著瞄摊,像睡著了一般勋又。 火紅的嫁衣襯著肌膚如雪苦掘。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天楔壤,我揣著相機(jī)與錄音鹤啡,去河邊找鬼。 笑死挺邀,一個胖子當(dāng)著我的面吹牛揉忘,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播端铛,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼泣矛,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤敞贡,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后哗总,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡倍试,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年讯屈,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片县习。...
    茶點(diǎn)故事閱讀 38,566評論 1 339
  • 序言:一個原本活蹦亂跳的男人離奇死亡涮母,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出躁愿,到底是詐尸還是另有隱情叛本,我是刑警寧澤,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布彤钟,位于F島的核電站来候,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏逸雹。R本人自食惡果不足惜营搅,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望梆砸。 院中可真熱鬧剧防,春花似錦、人聲如沸辫樱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽狮暑。三九已至鸡挠,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間搬男,已是汗流浹背拣展。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留缔逛,地道東北人备埃。 一個月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像褐奴,于是被迫代替她去往敵國和親按脚。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,440評論 2 348

推薦閱讀更多精彩內(nèi)容

  • jQuery基礎(chǔ) 什么是JQ敦冬?一個優(yōu)秀的JS庫辅搬,大型開發(fā)必備JQ的好處?一簡化JS的復(fù)雜操作二不再需要關(guān)心兼容性三...
    幺七閱讀 941評論 0 2
  • 通過jQuery脖旱,您可以選瓤八臁(查詢,query)HTML元素萌庆,并對它們執(zhí)行“操作”(actions)溶褪。 jQuer...
    枇杷樹8824閱讀 651評論 0 3
  • JQ DOM操作 var div=$("<div><a herf=‘#’></a></div>")//創(chuàng)建新標(biāo)簽 ...
    久久歸移閱讀 752評論 0 6
  • 1.幾種基本數(shù)據(jù)類型?復(fù)雜數(shù)據(jù)類型?值類型和引用數(shù)據(jù)類型?堆棧數(shù)據(jù)結(jié)構(gòu)? 基本數(shù)據(jù)類型:Undefined、Nul...
    極樂君閱讀 5,502評論 0 106
  • 又夢伊人顏如初践险, 如幻亦真影朦朧猿妈。 昨日小寐疑君到, 琉璃火塌未殃天捏境。 手握金刀踏黃泉于游, 鐵蹄銀甲震奈何。 望鄉(xiāng)臺...
    青牛踏雪御蒼穹閱讀 164評論 1 3