国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

談?wù)刯avascript插件的寫法

lakeside / 886人閱讀

插件顧名思義就是能在一個(gè)頁面多處使用, 各自按自己的參數(shù)配置運(yùn)行, 并且相互不會(huì)沖突.
會(huì)寫javascript插件是進(jìn)階js高級(jí)的必經(jīng)之路, 也是自己所學(xué)知識(shí)的一個(gè)典型的綜合運(yùn)用. 如果你還沒頭緒, 無從下手的話, 不用著急, 今天我們就一起來探討一下插件的一般寫法.
所需技能:

1.面向?qū)ο笥梅?2.閉包的理解
3.變量作用域的理解

以一個(gè)tab選項(xiàng)卡的為例:

第一步:

  我們需要寫html結(jié)構(gòu), 假設(shè)結(jié)構(gòu)如下:
html結(jié)構(gòu):

  • 新聞
  • 生活
  • 體育
  • 抽獎(jiǎng)
新聞
生活
體育
抽獎(jiǎng)

第二步:

 寫css代碼, 這個(gè)在這里就省去了, 具體大家自己可以去寫下, 簡單. 具體看截圖.
 


第三步:

 寫js代碼了.

 大概就分為這三步, 其中第三步是核心. 當(dāng)然前兩步也是很重要的, 結(jié)構(gòu)的好壞會(huì)直接影響你的js實(shí)現(xiàn)方式.
主結(jié)構(gòu):
           
            //構(gòu)造函數(shù), 以后每一個(gè)tab選項(xiàng)卡的實(shí)例都是由他來實(shí)例化的.
            function Tab(){
                //some code
            }
            //對象原型, 這里主要是一些功能方法.
            Tab.prototype = {
                //some code
            
            }
            
            用法:
            new Tab("tab_nav", "tabs", {可選參數(shù)}); //實(shí)例一個(gè)選項(xiàng)卡, 傳入一些參數(shù), 實(shí)現(xiàn)一些效果
            new Tab("tab_nav2", "tabs2", {可選參數(shù)}); //實(shí)例第二個(gè)選項(xiàng)卡, 傳入一些參數(shù), 實(shí)現(xiàn)一些效果
            ...
復(fù)制代碼
 

以上就是tab選項(xiàng)卡插件的主結(jié)構(gòu), 下面我們來具體實(shí)現(xiàn).

 

復(fù)制代碼
 js代碼:

    function Tab(){
        this.init.apply(this, arguments); //用init函數(shù)初始化對象屬性
    }
    
    Tab.prototype = {
       init: function(ela, elb, paramObj){
       //默認(rèn)參數(shù)設(shè)置, triggerClass:當(dāng)前選項(xiàng)的class名字, type:鼠標(biāo)事件, delay:這個(gè)主要針對mouseover快速劃過去的一個(gè)延時(shí)處理
        this.defaultOptions = {
            triggerClass    : "current",
            type            : "mouseover",
            delay           : 150
        };
        
        this.options        = this.extend(this.defaultOptions, paramObj || {});
        this.oa             = document.getElementById(ela);
        this.ob             = document.getElementById(elb);
        this.triggerItem    = this.oa.children;
        this.listItem        = this.ob.children;
        this.tLen            = this.triggerItem.length;
        this.arr            = [];
        this.timer            = null;
        this.isIE             = !-[1,]; //判斷IE瀏覽器
        var self = this;
        this.options.delay = this.options.type === "click" ? 0 : this.options.delay; //當(dāng)type為click時(shí), 就無延時(shí), 反之則延時(shí)
        //ie下過濾注釋節(jié)點(diǎn)
        if(this.isIE){
            for(var i = 0, len = this.listItem.length; i < len; i++){
                if(this.listItem[i].nodeType === 1){
                    this.arr.push(this.listItem[i]);
                }
            }
        }
        for(var i = 0; i < this.tLen; i++){
            this.triggerItem[i]["on" + this.options.type] = this.change(i); //綁定事件
            this.triggerItem[i].onmouseout = function(){clearTimeout(self.timer); self.timer = null;}; //綁定事件
        }
    },
    extend: function(source, target){ //屬性合并處理
        for(var p in target){
            if(target.hasOwnProperty(p)){
                source[p] = target[p];
            }
        }
        return source;
    },
    trim: function(str){
        return str.replace(/^s+/g, "").replace(/s+$/g, "");
    },
    addClass: function(el, name){ //定義添加class函數(shù), addClass(元素對象, class名字)
        var arr = [],
                str = el.className,
                arr = str.split(/s+/),
                len = arr.length,
                name = this.trim(name);
        for(var i = 0; i < len; i++){
            if(arr[i] === name){
                return;
            }
        }
        arr.splice(len, 1, name);
        el.className = this.trim(arr.join(" "));
        el = null;
    },
    removeClass: function(el, name){ //定義移除class函數(shù), removeClass(元素對象, class名字)
        var arr = [],
                str = el.className,
                arr = str.split(/s+/),
                len = arr.length,
                name = this.trim(name);
        for(var i = 0; i < len; i++){
            if(arr[i] === name){
                arr.splice(i,1);
                el.className=arr.join(" ");
                return;
            }
        }
    },
    change: function(d){ //選項(xiàng)卡實(shí)現(xiàn)
        var self = this;
        return function(){
            self.timer = setTimeout(function(){
                for(var i = 0; i < self.tLen; i++){
                    if(i === d){
                        self.addClass(self.triggerItem[d], self.options.triggerClass);
                        self.isIE ? self.arr[d].style.display = "block" : self.listItem[d].style.display = "block";
                    }
                    else{
                        self.removeClass(self.triggerItem[i], self.options.triggerClass);
                        self.isIE ? self.arr[i].style.display = "none" : self.listItem[i].style.display = "none";
                    }
                }
            }, self.options.delay);
        }
    }
  }
復(fù)制代碼
用法:
    new Tab("tab_nav", "tabs", {type:"click"});
    new Tab("tab_nav2", "tabs2", {triggerClass:"trigger"});
    new Tab("tab_nav3", "tabs3", {type:"mouseover", delay:200});

怎么樣,很簡單吧,只要思路打開了,就很容易實(shí)現(xiàn)了。還有很多其他的方式,有興趣的大家自己研究研究。
轉(zhuǎn)自http://www.cnblogs.com/tinkbe...

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/82048.html

相關(guān)文章

  • 談?wù)?/em>ES6前后異步編程

    摘要:回調(diào)函數(shù)這是異步編程最基本的方法。對象對象是工作組提出的一種規(guī)范,目的是為異步編程提供統(tǒng)一接口。誕生后,出現(xiàn)了函數(shù),它將異步編程帶入了一個(gè)全新的階段。 更多詳情點(diǎn)擊http://blog.zhangbing.club/Ja... Javascript 語言的執(zhí)行環(huán)境是單線程的,如果沒有異步編程,根本沒法用,非卡死不可。 為了解決這個(gè)問題,Javascript語言將任務(wù)的執(zhí)行模式分成兩種...

    fizz 評論0 收藏0
  • 了解Webpack嗎?

    摘要:你了解嗎核心概念的核心概念大致分為四個(gè)入口出口插件,是一個(gè)打包模塊化的工具,專注構(gòu)建模塊化項(xiàng)目。優(yōu)點(diǎn)只更新變更內(nèi)容,以節(jié)省寶貴的開發(fā)時(shí)間。在構(gòu)建過程中,將引用的靜態(tài)資源路徑修改為上對應(yīng)的路徑。可以通過在啟動(dòng)時(shí)追加參數(shù)來實(shí)現(xiàn)提取公共代碼。 你了解Webpack嗎? 核心概念 Webpack的核心概念大致分為四個(gè):入口、出口、loader、插件,是一個(gè)打包模塊化js的工具,專注構(gòu)建模塊化項(xiàng)...

    Cympros 評論0 收藏0
  • 談?wù)?/em>PostCSS

    摘要:它們有個(gè)統(tǒng)一的名字預(yù)處理器。面對以上問題,預(yù)處理器給出了非常可行的解決方案變量就像其他編程語言一樣,免于多處修改。回到話題中,之所以會(huì)出現(xiàn)向預(yù)處理器這樣子的解決方案,歸根結(jié)底還是標(biāo)準(zhǔn)發(fā)展的滯后性導(dǎo)致的。 前言 現(xiàn)在的前端,javascript的發(fā)展有目共睹,框架林立。同時(shí),html也是齊頭并進(jìn),推出了HTML5標(biāo)準(zhǔn),并且得到了普及。這樣的發(fā)展卻唯獨(dú)少了一個(gè)角色? CSS,就是這個(gè)看似不...

    高勝山 評論0 收藏0
  • 談?wù)?/em>PostCSS

    摘要:它們有個(gè)統(tǒng)一的名字預(yù)處理器。面對以上問題,預(yù)處理器給出了非常可行的解決方案變量就像其他編程語言一樣,免于多處修改。回到話題中,之所以會(huì)出現(xiàn)向預(yù)處理器這樣子的解決方案,歸根結(jié)底還是標(biāo)準(zhǔn)發(fā)展的滯后性導(dǎo)致的。 前言 現(xiàn)在的前端,javascript的發(fā)展有目共睹,框架林立。同時(shí),html也是齊頭并進(jìn),推出了HTML5標(biāo)準(zhǔn),并且得到了普及。這樣的發(fā)展卻唯獨(dú)少了一個(gè)角色? CSS,就是這個(gè)看似不...

    leap_frog 評論0 收藏0
  • 談?wù)?/em>javascript語法里一些難點(diǎn)問題(一)

    摘要:引子前不久我建立的技術(shù)群里一位問了一個(gè)這樣的問題,她貼出的代碼如下所示執(zhí)行結(jié)果如下所示第一個(gè)第二個(gè)這是一個(gè)令人詫異的結(jié)果,為什么第一個(gè)彈出框顯示的是,而不是呢這種疑惑的原理我描述如下一個(gè)頁面里直接定義在標(biāo)簽下的變量是全局變量即屬于對象的變量 1) 引子 前不久我建立的技術(shù)群里一位MM問了一個(gè)這樣的問題,她貼出的代碼如下所示: var a = 1; function hehe...

    huaixiaoz 評論0 收藏0

發(fā)表評論

0條評論

最新活動(dòng)
閱讀需要支付1元查看
<