亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

jQuery圖片輪播(二)利用構造函數和原型創建對象以實現繼承

2019-11-19 18:39:33
字體:
來源:轉載
供稿:網友

上一篇文中完成的封裝,還存在一個小問題,就是該輪播對象不能在同一頁面中重復使用,本文將通過組合使用javascript的構造函數和原型模式創建對象來解決這個問題。

沒有看過上一篇文章的朋友可以點此查看上一篇文章 (jQuery圖片輪播實現并封裝(一))

首先回顧一下,上文的問題所在,上文中的carsouel對象是采用字面量的方式來定義的,這樣carsouel本就是一個實例,想要使用在多處時,這個對象的方法會發生沖突,最終只會執行最后的那一個。而通過采用構造函數的方式來定義對象carsouel,每次需要使用時只需要用new操作符來實例化一個新對象,頁面中需要幾處輪播就實例化幾個對象,這樣就可以滿足需求。所以,將代碼改成以下形式。

function Carousel(){  this.now = 0;          //當前顯示的圖片索引  this.hasStarted = false;     //是否開始輪播  this.interval = null;      //定時器  this.liItems = null;       //要輪播的li元素集合  this.len = 0;         //liItems的長度  this.aBox : null;        //包含指示器的dom對象  this.bBox : null;        //包含前后按鈕的dom對象  /**   * 初始化及控制函數   * @param bannnerBox string 包含整個輪播圖盒子的id或class   * @param aBox string 包含指示器的盒子的id或class   * @param btnBox string 包含前后按鈕的盒子的id或class   */  this.startPlay = function(bannnerBox,aBox,btnBox) {    //初始化對象參數    var that = this;    this.liItems = $(bannnerBox).find('ul').find('li');    this.len = this.liItems.length;    this.aBox = $(bannnerBox).find(aBox);    this.bBox = $(bannnerBox).find(btnBox);    //讓第一張圖片顯示,根據輪播圖數量動態創建指示器,并讓第一個指示器處于激活狀態,隱藏前后按鈕    this.liItems.first('li').css({'opacity': 1, 'z-index': 1}).siblings('li').css({'opacity': 0, 'z-index': 0});    var aDom = '';    for (var i = 0; i < this.len; i++){      aDom += '<a></a>';    }    $(aDom).appendTo(this.aBox);    this.aBox.find('a:first').addClass("indicator-active");    this.bBox.hide();    //鼠標移入banner圖時,停止輪播并顯示前后按鈕,移出時開始輪播并隱藏前后按鈕    $(bannnerBox).hover(function (){      that.stop();      that.bBox.fadeIn(200);    }, function (){      that.start();      that.bBox.fadeOut(200);    });    //鼠標移入指示器時,顯示對應圖片,移出時繼續播放    this.aBox.find('a').hover(function (){      that.stop();      var out = that.aBox.find('a').filter('.indicator-active').index();      that.now = $(this).index();      if(out!=that.now) {        that.play(out, that.now)      }    }, function (){      that.start();    });    //點擊左右按鈕時顯示上一張或下一張    $(btnBox).find('a:first').click(function(){that.next()});    $(btnBox).find('a:last').click(function(){that.prev()});    //開始輪播    this.start()  };  //前一張函數  this.prev = function (){    var out = this.now;    this.now = (--this.now + this.len) % this.len;    this.play(out, this.now);  };  //后一張函數  this.next = function (){    var out = this.now;    this.now = ++this.now % this.len;    this.play(out, this.now);  };  /**   * 播放函數   * @param out number 要消失的圖片的索引值   * @param now number 接下來要輪播的圖的索引值   */  this.play = function (out, now){    this.liItems.eq(out).stop().animate({opacity:0,'z-index':0},500).end().eq(now).stop().animate({opacity:1,'z-index':1},500);    this.aBox.find('a').removeClass('imgnum-active').eq(now).addClass('indicator-active');  };  //開始函數  this.start = function(){    if(!this.hasStarted) {      this.hasStarted = true;      var that = this;      this.interval = setInterval(function(){        that.next();      },2000);    }  };  //停止函數  this.stop = function (){    clearInterval(this.interval);    this.hasStarted = false;  }};

調用時采用new操作符,如下:

var banner1 = new Carousel();  var banner2 = new Carousel();  var banner3 = new carousel();  banner1.startPlay('#J_bg_ban1','#J_bg_indicator1','#J_bg_btn1');  banner2.startPlay('#J_bg_ban2','#J_sm_indicator2','#J_bg_btn2');  banner3.startPlay('#J_bg_ban3','#J_sm_indicator3','#J_bg_btn3');

上述方法可實現需求,但是仔細分析發現,這與上一篇文中使用extend復制對象的方法幾乎是一樣的,這里的new操作符實際上也是將構造函數完全復制了一份出來作為一個新的對象,那就和上文中提到的方法存在共同的缺點,那就是內部函數不能復用,每次執行用new操作符來實例化,都會創建新的內部函數,這也是單獨使用構造函數來自定義對象的缺點。

在Carousel對象內的next函數,prev函數,strat函數,stop函數其實都是可以共用的,多個輪播件共用這些函數是完全沒有問題的,而初始化函數和play函數需要作為私有函數來調用。單獨使用構造函數創建的對象,當使用new操作符創建新實例的時候,初始化方法和play方法會被重新在每個實例上創建一遍,這正是我們想要的結果,而next方法、prev方法、start方法、stop方法這些可共用的方法也會被重新創建,而創造多個完成一樣任務的方法是完全沒有必要的,所以需要將這些共有的方法提出來,讓所有Carousel對象的實例都可以公用,這樣就可以解決函數復用的問題。

通過將這些共用的方法寫在Carousel的原型對象上,在創建Carousel新實例的時候就可以通過原型鏈來共享這些方法,這樣這些公用函數也就得到了復用,代碼如下:

function Carousel(){  this.now = 0;          //當前顯示的圖片索引  this.hasStarted= false;     //是否開始輪播  this.interval = null;      //定時器  this.liItems = null;       //要輪播的li元素集合  this.len = 0;          //liItems的長度  this.aBox = null;        //包含指示器的dom對象  this.bBox = null;        //包含前后按鈕的dom對象  /**   * 初始化及控制函數   * @param bannnerBox string 包含整個輪播圖盒子的id或class   * @param aBox string 包含指示器的盒子的id或class   * @param btnBox string 包含前后按鈕的盒子的id或class   */  this.startPlay = function(bannnerBox,aBox,btnBox) {    //初始化對象參數    var that = this;    this.liItems = $(bannnerBox).find('ul').find('li');    this.len = this.liItems.length;    this.aBox = $(bannnerBox).find(aBox);    this.bBox = $(bannnerBox).find(btnBox);    //讓第一張圖片顯示,根據輪播圖數量動態創建指示器,并讓第一個指示器處于激活狀態,隱藏前后按鈕    this.liItems.first('li').css({'opacity': 1, 'z-index': 1}).siblings('li').css({'opacity': 0, 'z-index': 0});    var aDom = '';    for (var i = 0; i < this.len; i++){      aDom += '<a></a>';    }    $(aDom).appendTo(this.aBox);    this.aBox.find('a:first').addClass("imgnum-active");    this.bBox.hide();    //鼠標移入banner圖時,停止輪播并顯示前后按鈕,移出時開始輪播并隱藏前后按鈕    $(bannnerBox).hover(function (){      that.stop();      that.bBox.fadeIn(200);    }, function (){      that.start();      that.bBox.fadeOut(200);    });    //鼠標移入指示器時,顯示對應圖片,移出時繼續播放    this.aBox.find('a').hover(function (){      that.stop();      var out = that.aBox.find('a').filter('.indicator-active').index();      that.now = $(this).index();      if(out!=that.now) {        that.play(out,that.now)      }    }, function (){      that.start();    });    //點擊左右按鈕時顯示上一張或下一張    $(btnBox).find('a:first').click(function(){that.next()});    $(btnBox).find('a:last').click(function(){that.prev()});    //開始輪播    this.start()  };  /**   * 播放函數   * @param out number 要消失的圖片的索引值   * @param now number 接下來要輪播的圖的索引值   */  this.play = function (out,now){    this.liItems.eq(out).stop().animate({opacity:0,'z-index':0},500).end().eq(now).stop().animate({opacity:1,'z-index':1},500);    this.aBox.find('a').removeClass('imgnum-active').eq(now).addClass('indicator-active');  };}Carousel.prototype = {  //前一張函數  prev : function (){    var out = this.now;    this.now = (--this.now + this.len) % this.len;    this.play(out,this.now)  },  //后一張函數  next : function (){    var out = this.now;    this.now = ++this.now % this.len;    this.play(out,this.now);  },  //開始函數  start : function(){    if(!this.hasStarted) {      this.hasStarted = true;      var that = this;      this.interval = setInterval(function(){        that.next();      },2000);    }  },  //停止函數  stop : function (){    clearInterval(this.interval);    this.hasStarted = false;  }};

在這里用字面量重寫了Carousel對象的原型對象,將next方法,perv方法,start方法和stop方法寫進了Carousel的原型對象中,這樣每次實例化的對象就可以共用這些方法。當然,實例化的方法也是使用new操作符。

這種組合使用構造函數和原型的模式,是創建自定義類型最常用的方法,至此我們就完成了這個簡單輪播對象的封裝。

以上就是本文的全部內容,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,同時也希望多多支持武林網!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美成人免费全部| 91国自产精品中文字幕亚洲| 国产精品吊钟奶在线| 日韩电影免费观看在线观看| 亚洲精品久久久久久久久久久久| 欧美视频不卡中文| 欧美精品日韩三级| 亚洲第一男人av| 亚洲电影免费观看高清完整版在线观看| 亚洲第一精品久久忘忧草社区| 视频一区视频二区国产精品| 青青草原一区二区| 国产精品综合久久久| 国产精品自产拍在线观| 精品视频在线导航| 欧美综合第一页| 精品国产91久久久久久老师| 92看片淫黄大片看国产片| 国产综合视频在线观看| 在线亚洲男人天堂| 亚洲va欧美va国产综合剧情| 亚洲欧洲在线视频| 欧美激情网友自拍| 精品久久久久久| 国产婷婷97碰碰久久人人蜜臀| 久久久久久久97| 91色在线观看| 亚洲97在线观看| 欧美电影免费观看大全| 亚洲一区二区三区四区在线播放| 九九久久精品一区| 69国产精品成人在线播放| 亚洲女人天堂成人av在线| xvideos国产精品| 国产一区二区三区在线播放免费观看| 69影院欧美专区视频| 国产一区二区三区四区福利| 国产精品爽爽爽爽爽爽在线观看| 久久视频国产精品免费视频在线| 中文字幕久热精品视频在线| 色青青草原桃花久久综合| 中文在线不卡视频| 国产精品视频一区二区三区四| 日韩网站在线观看| 91久久综合亚洲鲁鲁五月天| 亚洲激情在线观看视频免费| 91精品国产综合久久男男| 午夜精品蜜臀一区二区三区免费| 欧美日韩在线一区| 亚洲国产精品资源| 精品福利樱桃av导航| 精品女厕一区二区三区| 欧美午夜www高清视频| 亚洲字幕一区二区| 亚洲丁香久久久| 在线日韩中文字幕| 精品欧美国产一区二区三区| 久久精品久久久久久| 日韩美女免费观看| 91久久精品国产| 最近的2019中文字幕免费一页| 日韩av片电影专区| 51精品在线观看| 欧美小视频在线观看| 欧美黑人性生活视频| 精品国内产的精品视频在线观看| 亚洲午夜精品视频| 亚洲美女久久久| 久久久国产一区| 欧美在线www| 亚洲精品久久久久中文字幕二区| 久久视频在线免费观看| 亚洲国产精彩中文乱码av| 精品久久久国产| 亚洲精品久久在线| 亚洲福利精品在线| 亚洲人免费视频| 日韩精品久久久久久福利| 欧美日韩在线视频观看| 精品成人国产在线观看男人呻吟| 亚洲高清在线观看| 欧美黄色片免费观看| 69视频在线免费观看| 亚洲偷熟乱区亚洲香蕉av| 亚洲国产精品字幕| 色综合久久悠悠| 日本高清视频精品| 欧美日韩一区二区免费在线观看| 91亚洲精品一区二区| 日韩av不卡电影| 国产91精品青草社区| 国产精品国产三级国产专播精品人| 国产欧美一区二区三区在线看| 亚洲天堂网站在线观看视频| 欧美日韩美女在线观看| 久久中文字幕在线视频| 国模私拍视频一区| 欧美精品成人91久久久久久久| 欧美成人中文字幕在线| 欧美成年人视频网站欧美| 亚洲男女性事视频| 国产在线一区二区三区| 欧美成人激情图片网| 一个色综合导航| 日韩大片免费观看视频播放| 日本精品视频在线播放| 成人黄色影片在线| 国产自产女人91一区在线观看| 91精品国产一区| 国产欧美韩国高清| 黄色一区二区在线观看| 日韩高清电影免费观看完整| 亚洲欧美中文另类| 91国偷自产一区二区三区的观看方式| 欧美三级xxx| 欧美激情精品久久久久久免费印度| 亚洲成人久久电影| 日韩视频亚洲视频| 9.1国产丝袜在线观看| 国产精品视频最多的网站| 色777狠狠综合秋免鲁丝| 综合网日日天干夜夜久久| 欧美日韩成人网| 亚洲性夜色噜噜噜7777| 久久国产一区二区三区| 欧美激情亚洲一区| 91在线网站视频| 日韩精品www| 欧美精品videos性欧美| 久久97久久97精品免视看| 最近2019年好看中文字幕视频| 在线观看日韩www视频免费| 欧美国产视频一区二区| 亚洲男人天堂网| 亚洲专区在线视频| 欧美老妇交乱视频| 久久久女女女女999久久| 亚洲国产高潮在线观看| 在线视频一区二区| 亚洲一区二区日本| 国产精品一区二区三区毛片淫片| 日韩精品免费综合视频在线播放| 久久精品国产亚洲精品2020| 亚洲国产精品电影在线观看| 欧美日韩国产页| 亚洲第一网站免费视频| 精品视频www| 国产亚洲欧洲黄色| 中文字幕一区二区精品| 亚洲国产精品福利| 欧美日产国产成人免费图片| 亚洲精品美女网站| 亚洲老头老太hd| 欧美精品18videos性欧美| 久久精品成人一区二区三区| 91手机视频在线观看| 国产一区二区三区网站| 综合136福利视频在线| 亚洲爱爱爱爱爱| 亚洲国产天堂网精品网站| 尤物tv国产一区| 97婷婷涩涩精品一区| 国产精品欧美一区二区三区奶水| 亚洲毛片在线观看.|