1. //声明一个全局变量
    2. var index=0,//当前显示图片的索引,默认值设置为0
    3. timer=null,//定时器
    4. main=byId("main"),
    5. prev=byId("prev"),//上一张按钮
    6. next=byId("next"),//下一张按钮接着给他们绑定事件
    7. pics=byId("banner").getElementsByTagName("div"),//箭头效果换图的主要设置 返回的数组
    8. dots=byId("dots").getElementsByTagName("span");
    9. banner=byId("banner"),
    10. menuContent=byId("menu-content"),
    11. //可以看作元素的集合也可以看作为数组
    12. menuItems=menuContent.getElementsByClassName("menu-item"),
    13. subMenu=byId("sub-menu"),
    14. innerBox=subMenu.getElementsByClassName("inner-box"),
    15. size=pics.length;
    16. //console.log(size);
    17. //封装getElementById()
    18. //==用于一般比较 ===用于严格比较
    19. //==在比较的时候可以转换数据类型 ===严格比较,只要类型不匹配就会返回false
    20. // function byId(id){
    21. // return typeof(id)==="string"?document.getElementById(id):id;
    22. // }
    23. //DOM0级事件:只能给一个元素得某一个行为绑定一次方法,第二次绑定得话会把前面得覆盖掉;
    24. //DOM2级事件:可以给某一个元素得同一个行为绑定多个 不同得方法
    25. //DOM1级事件他是1998年10月1号称为W3的推荐标准里面没有定义事件相关得内容 只是讲了模型并没有讲事件
    26. //监听方法:可以去随时监听到每异步操作来执行
    27. // addEventListener() and removeEventListener() --除了ie9以下
    28. // addEventListener()可以为元素添加多个事件处理程序,触发时候按照添加的而顺序一次进行调用
    29. // removeEventListener()是移除事件处理程序(不能移除匿名添加的函数)
    30. // addEventListener() and removeEventListener()
    31. //第一个参数:事件名字
    32. //第二个参数:事件处理程序函数
    33. //第三个参数:布尔值;true表示在捕获阶段调用 flase表示在冒泡阶段调用
    34. // 从上向下执行 从第低向上执行 直接包含的父元素
    35. //IE浏览器 -- IE6-8版本
    36. //attachEvent() and detachEvent()
    37. //attachEvent()代表可以添加多个事件处理程序,也是可以触发的时候按照添加的而顺序一次处理程序
    38. //detachEvent()代表的的移除事件处理程序(不能溢出匿名添加的函数)
    39. //attachEvent() and detachEvent()
    40. //第一个参数:一个事件名字
    41. //第二个参数:事件处理程序函数
    42. //IE浏览器没有第三个浏览器 就这个两个
    43. // next.onclick=function(){
    44. // alert("匿名函数");
    45. // }
    46. // next.onclick=function(){
    47. // alert("这是0级事件覆盖上面的事件");
    48. // }
    49. //点击下一张按钮显示下一张图片 编写DOM二级事件
    50. // next.addEventListener("click",function(){
    51. // alert("在DOM2级事件中这张是第一张显示的")
    52. // });
    53. // next.addEventListener("click",function(){
    54. // alert("在DOM2级事件中上一张显示出来了之后这样也会一次执行")
    55. // });
    56. function byId(id){
    57. return typeof(id)==="string"?document.getElementById(id):id;
    58. }
    59. //封装通用事件的绑定方法
    60. //传送三个参数
    61. //第一个是绑定事件的DOM元素
    62. // 第二个是事件名字
    63. // 第三个是事件处理程序
    64. function addHandler(element,type,handler){
    65. //非IE浏览器
    66. if(element.addEventListener){
    67. element.addEventListener(type,handler,true);
    68. //IE浏览器支持的DOM2级事件
    69. } else if (element.attachEvent) {
    70. element.attachEvent("on"+type,handler);
    71. //IE浏览器不支持DOM2级事件时
    72. } else {
    73. element["on"+type]=null;
    74. }
    75. }
    76. //封装测试
    77. // addHandler(next,"click",function(){alert("11")});
    78. // addHandler(next,"click",function(){alert("22")});
    79. //点击下一张按钮显示下一张图片
    80. // addHandler(next,"click",function(){
    81. // //点击下一个按钮,使得索引递增 上面设置的index=0
    82. // index++
    83. // // alert(index)调试弹出窗口
    84. // if (index>=size) {index=0}
    85. // // console.log(index);
    86. // for(var i=0;i<size;i++){
    87. // pics[i].style.display="none";
    88. // //数组里面的全部先设置为不显示在下面到了哪里就显示哪个
    89. // dots[i].className="";
    90. // //先设置全部圆点不亮等到下面颠倒哪里圆点就亮哪个
    91. // //这里设置空的话就找不到任何名字就不会显示
    92. // }
    93. // pics[index].style.display="block";
    94. // //小圆点换图设置
    95. // dots[index].className="active";//动态的给她添加高亮样式
    96. // });
    97. //清除定时器,停止自动轮播
    98. function stopAutoplay(){
    99. if (timer) {
    100. clearInterval(timer);
    101. }
    102. }
    103. //鼠标滑过主菜单
    104. for (var m=0,idx,mlen=menuItems.length;m<mlen;m++){
    105. //给所有的主菜单定义属性,表明它索引
    106. menuItems[m].setAttribute("data-index",m);
    107. addHandler(menuItems[m],"mouseover",function(){
    108. //显示主菜单所在的背景
    109. subMenu.className="sub-menu";//隐形的将hide属性移除
    110. //获取当前主菜单的索引
    111. idx=this.getAttribute("data-index");
    112. //alert(idx);
    113. //便利所有的子菜单innerBox,将他们先隐藏起来
    114. for(var j=0,jlen=innerBox.length;j<jlen;j++){
    115. //隐藏所有的子菜单
    116. innerBox[j].style.display="none";
    117. menuItems[j].style.background="none";
    118. }
    119. //找到当前的字菜单,让他显示出来
    120. innerBox[idx].style.display="block";
    121. menuItems[idx].style.background="rgba(0,0,0,0.1)";
    122. });
    123. }
    124. //鼠标离开banner区域。隐藏子菜单
    125. addHandler(banner,"mouseout",function(){
    126. subMenu.className="sub-menu hide";
    127. });
    128. //鼠标离开主菜单。隐藏子菜单
    129. addHandler(menuContent,"mouseout",function(){
    130. subMenu.className="sub-menu hide";
    131. });
    132. //鼠标划入子菜单。显示子菜单
    133. addHandler(subMenu,"mouseover",function(){
    134. subMenu.className="sub-menu";
    135. });
    136. //鼠标离开子菜单时。隐藏子菜单
    137. addHandler(subMenu,"mouseout",function(){
    138. subMenu.className="sub-menu hide";
    139. });
    140. //鼠标划入main大盒子 停止轮播
    141. addHandler(main,"mouseover",stopAutoplay);
    142. //鼠标划出main大盒子 开启轮播
    143. addHandler(main,"mouseout",startAutoplay);
    144. //定时器设置自动轮播 第一个参数索引值递增第二个参数就是时间
    145. //开启自动轮播
    146. function startAutoplay(){
    147. timer=setInterval(function(){
    148. index++;
    149. //console.log(index)
    150. if (index>=size) {index=0}
    151. changeImg();
    152. },2000)
    153. }
    154. function changeImg(){
    155. //便利所有的图片,将图片隐藏起来,将点上的类消除
    156. for(var i=0;i<size;i++){
    157. pics[i].style.display="none";
    158. //数组里面的全部先设置为不显示在下面到了哪里就显示哪个
    159. dots[i].className="";
    160. //先设置全部圆点不亮等到下面颠倒哪里圆点就亮哪个
    161. //这里设置空的话就找不到任何名字就不会显示
    162. }
    163. pics[index].style.display="block";
    164. //小圆点换图设置
    165. dots[index].className="active";//动态的给她添加高亮样式
    166. }
    167. //把上面的代码封装
    168. //点击下一张按钮显示下一张图片
    169. addHandler(next,"click",function(){
    170. //单击下一个按钮,是的索引递增
    171. index++;
    172. if (index>=size) {index=0};
    173. changeImg();
    174. });
    175. //点击上一个按钮显示上一张图片
    176. addHandler(prev,"click",function(){
    177. //单击上一张按钮,是的索引递减
    178. index--;
    179. if (index<0) {index=size-1};
    180. changeImg();
    181. });
    182. //点击圆点索引切换图片
    183. for(var d=0;d<size;d++){
    184. //dots[d].id=d;默认给每一个span标签添加名为id的属性 赋值为d 不过这种方式不太好
    185. //dots[d].id=d;
    186. //如何添加自定义属性
    187. dots[d].setAttribute("data-id",d);
    188. //setAttribute设置属性
    189. addHandler(dots[d],"click",function(){
    190. //htis表示当前每一个对象的使用
    191. index=this.getAttribute("data-id");//因为作用域的问题只能获取最后一个值这里只能得到3
    192. changeImg();
    193. });//setAttribute设置getAttribute接收
    194. }
    195. //定时器设置
    196. //图片每间隔几秒就会自动切换一次图片
    197. //当鼠标滑倒轮播图上的时候,消除每间隔几秒切换的效果,清楚定时器
    198. //自动开启轮播
    199. startAutoplay();