js轮播图的插件化封装详解


Posted in Javascript onJuly 17, 2017

本文实例为大家分享了js轮播图的插件化封装代码,供大家参考,具体内容如下

具体代码如下:

~function(){
 function AutoBanner(curEleId,ajaxURL,interval){
  //把之前存储获取元素的变量都作为当前实例的私有属性
  this.banner = document.getElementById(curEleId);
  this.bannerInner = utils.firstChild(this.banner);
  this.bannerTip = utils.children(this.banner,"ul")[0];
  this.bannerLink = utils.children(this.banner,'a');
  this.bannerLeft = this.bannerLink[0];
  this.bannerRight = this.bannerLink[1];
  this.divList = this.bannerInner.getElementsByTagName('div');
  this.imgList = this.bannerInner.getElementsByTagName('img');
  this.oLis = this.bannerTip.getElementsByTagName('li');

  //之前的全局变量也应该变为自己的私有属性
  this.jsonData = null;
  this.interval = interval || 3000;
  this.autoTimer = null;
  this.step = 0;
  this.ajaxURL = ajaxURL;
  //返回当前实例
  return this.init();
 }

 AutoBanner.prototype = {
  constructor:AutoBanner,
  //Ajax请求数据
  getData:function(){
   var _this = this;
   var xhr = new XMLHttpRequest;
   xhr.open("get",this.ajaxURL + "?_="+Math.random(),false);
   xhr.onreadystatechange = function(){
    if(xhr.readyState ===4 && /^2\d{2}$/.test(xhr.status)){
     _this.jsonData = utils.formatJSON(xhr.responseText)
    }
   }
   xhr.send(null)
  },
  //实现数据绑定
  bindData:function(){
   var str = "",str2 = "";
   if(this.jsonData){
    for(var i = 0,len=this.jsonData.length;i<len;i++){
     var curData = this.jsonData[i];
     str+='<div><img src="" alt="" trueImg="'+curData['img']+'"></div>';
     i===0?str2+="<li class='bg'></li>":str2+="<li></li>"
    }
   }
   this.bannerInner.innerHTMl = str;
   this.bannerTip.innerHTML = str2;
  },
  //延迟加载
  lazyImg:function(){
   var _this = this;
   for(var i = 0,len = this.imgList.length;i<len;i++){
    ~function(i){
     var curImg = _this.imgList[i];
     var oImg = new Image;
     oImg.src = curImg.getAttribute('trueImg');
     oImg.onload = function(){
      curImg.src = this.src;
      curImg.style.display = block;
      //只对第一张处理
      if(i===0){
       var curDiv = curImg.parentNode;
       curDiv.style.zIndex = 1;
       myAnimate(curDiv,{opacity:1},200);
      }
      oImg = null;
     }
    }(i)
   }
  },
  //自动轮播
  autoMove:function(){
   if(this.step === this.jsonData.length-1){
    this.step = -1
   }
   this.step++;
   this.setBanner();
  },
  //切换效果和焦点对齐
  setBanner:function(){
   for(var i = 0,len = this.divList.length;i<len;i++){
    var curDiv = this.divList[i];
    if(i===this.step){
     utils.css(curDiv,"zIndex",1)
     //2、让当前的透明度从0变为1,当动画结束,我们需要让其他的div的透明度的值直接变为0
     myAnimate(curDiv,{opacity:1},200,function(){
      var curDivSib = utils.siblings(this);
      for(var k = 0,len = curDivSib.length;k<len;k++){
       utils.css(curDivSib[k],'opacity',0)
      }

     })
     continue
    }
    utils.css(curDiv,"zIndex",0)
   }
   //实现焦点对其
   for(i = 0,len = this.oLis.length;i<len;i++){
    var curLi = this.oLis[i];
    i === this.step?utils.addClass(curLi,"bg"):utils.removeClass(curLi,"bg");
   }
  },
  //控制自动轮播
  mouseEvent:function(){
   var _this = this;
   this.banner.onmouseover = function(){
    window.clearInterval(_this.autoTimer);
    _this.bannerLeft.style.display = _this.bannerRight.style.display = "block"

   }
   this.banner.onmouseout = function(){
    _this.autoTimer = window.setInterval(function(){
     _this.autoMove.call(_this)
    },_this.interval);
    _this.bannerLeft.style.display = _this.bannerRight.style.display = "none"
   }
  },
  //实现焦点切换
  tipEvent:function(){
   var _this = this;
   for(var i = 0,len = this.oLis.length;i<len;i++){
    var curLi = this.oLis[i];
    curLi.index = i;
    curLi.onclick = function(){
     _this.step = this.index;
     _this.setBanner();
    }
   }
  },
  //实现左右切换
  leftRight:function(){
   var _this = this;
   this.bannerRight.onclick = function(){
    _this.autoMove();
   };
   this.bannerLeft.onclick = function(){
    if(_this.step === 0){
     _this.step = _this.jsonData.length;
    }
    _this.step--;
    _this.setBanner();
   }
  },
  //当前插件的唯一入口 命令模式:init相当于指挥室,指挥各军队协同作战
  init:function(){
   var _this = this;
   this.getData();
   this.bindData();
   window.setTimeout(function(){
    _this.lazyImg();
   },500);
   this.autoTimer = window.setInterval(function(){
    _this.autoMove();
   },this.interval);

   this.mouseEvent();
   this.tipEvent();
   this.leftRight();
   return this;
  }

 }

 window.AutoBanner = AutoBanner
}()

//使用
var banner1 = new AutoBanner('banner','json/banner.txt',1000)

精彩专题分享:jQuery图片轮播 JavaScript图片轮播 Bootstrap图片轮播

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jquery ui 1.7 ui.tabs 动态添加与关闭(按钮关闭+双击关闭)
Apr 01 Javascript
Firefox中autocomplete=&quot;off&quot; 设置不起作用Bug的解决方法
Mar 25 Javascript
jquery 添加节点的几种方法介绍
Sep 04 Javascript
jquery和js实现对div的隐藏和显示方法
Sep 26 Javascript
jQuery+PHP打造滑动开关效果
Dec 16 Javascript
BootStrap tab选项卡使用小结
Aug 09 Javascript
easyui form validate总是返回false的原因及解决方法
Nov 07 Javascript
Jquery Easyui对话框组件Dialog使用详解(14)
Dec 19 Javascript
jQuery.cookie.js使用方法及相关参数解释
Mar 06 Javascript
解决webpack+Vue引入iView找不到字体文件的问题
Sep 28 Javascript
vuex 实现getter值赋值给vue组件里的data示例
Nov 05 Javascript
vue 解决computed修改data数据的问题
Nov 06 Javascript
Vue.js中extend选项和delimiters选项的比较
Jul 17 #Javascript
Vue.js中组件中的slot实例详解
Jul 17 #Javascript
Vue.js上下滚动加载组件的实例代码
Jul 17 #Javascript
JS实现仿UC浏览器前进后退效果的实例代码
Jul 17 #Javascript
详解利用jsx写vue组件的方法示例
Jul 17 #Javascript
Javascript实现找不同色块的游戏
Jul 17 #Javascript
Vue.js 单页面多路由区域操作的实例详解
Jul 17 #Javascript
You might like
解析thinkphp中的M()与D()方法的区别
2013/06/22 PHP
PHP清除数组中所有字符串两端空格的方法
2014/10/20 PHP
layui框架实现文件上传及TP3.2.3(thinkPHP)对上传文件进行后台处理操作示例
2018/05/12 PHP
Laravel框架控制器,视图及模型操作图文详解
2019/12/04 PHP
PHP使用PDO实现mysql防注入功能详解
2019/12/20 PHP
在视频前插入广告
2006/11/20 Javascript
Prototype PeriodicalExecuter对象 学习
2009/07/19 Javascript
可自己添加html的伪弹出框实现代码
2013/09/08 Javascript
jQuery和AngularJS的区别浅析
2015/01/29 Javascript
jQuery Mobile框架中的表单组件基础使用教程
2016/05/17 Javascript
数组Array的排序sort方法
2017/02/17 Javascript
Node.js+Express+MySql实现用户登录注册功能
2017/07/10 Javascript
js 事件的传播机制(实例讲解)
2017/07/20 Javascript
vue-cli webpack2项目打包优化分享
2018/02/07 Javascript
详解基于node.js的脚手架工具开发经历
2019/01/28 Javascript
Vuex持久化插件(vuex-persistedstate)解决刷新数据消失的问题
2019/04/16 Javascript
解决vue admin element noCache设置无效的问题
2019/11/12 Javascript
javascript实现时间日期的格式化的方法汇总
2020/08/06 Javascript
python实现矩阵乘法的方法
2015/06/28 Python
初步认识Python中的列表与位运算符
2015/10/12 Python
Python进程间通信之共享内存详解
2017/10/30 Python
python实现诗歌游戏(类继承)
2019/02/26 Python
PyQt5 如何让界面和逻辑分离的方法
2020/03/24 Python
pandas分组聚合详解
2020/04/10 Python
Matplotlib.pyplot 三维绘图的实现示例
2020/07/28 Python
html5贪吃蛇游戏使用63行代码完美实现
2013/06/25 HTML / CSS
NUK奶瓶美国官网:NUK美国
2016/09/26 全球购物
荷兰最大的鞋子、服装和运动折扣店:Bristol
2021/01/07 全球购物
某/etc/fstab文件中的某行如下: /dev/had5 /mnt/dosdata msdos defaults,usrquota 1 2 请解释其含义
2013/04/11 面试题
一套软件测试笔试题
2014/07/25 面试题
大专学生求职信
2014/07/04 职场文书
乡镇安全生产目标责任书
2014/07/23 职场文书
幼儿园卫生保健制度
2015/08/05 职场文书
2016春季校长开学典礼致辞
2015/11/26 职场文书
MySQL配置主从服务器(一主多从)
2021/08/07 MySQL
Python进程间的通信之语法学习
2022/04/11 Python