//声明一个全局变量
var index=0,//当前显示图片的索引,默认值设置为0
timer=null,//定时器
main=byId("main"),
prev=byId("prev"),//上一张按钮
next=byId("next"),//下一张按钮接着给他们绑定事件
pics=byId("banner").getElementsByTagName("div"),//箭头效果换图的主要设置 返回的数组
dots=byId("dots").getElementsByTagName("span");
banner=byId("banner"),
menuContent=byId("menu-content"),
//可以看作元素的集合也可以看作为数组
menuItems=menuContent.getElementsByClassName("menu-item"),
subMenu=byId("sub-menu"),
innerBox=subMenu.getElementsByClassName("inner-box"),
size=pics.length;
//console.log(size);
//封装getElementById()
//==用于一般比较 ===用于严格比较
//==在比较的时候可以转换数据类型 ===严格比较,只要类型不匹配就会返回false
// function byId(id){
// return typeof(id)==="string"?document.getElementById(id):id;
// }
//DOM0级事件:只能给一个元素得某一个行为绑定一次方法,第二次绑定得话会把前面得覆盖掉;
//DOM2级事件:可以给某一个元素得同一个行为绑定多个 不同得方法
//DOM1级事件他是1998年10月1号称为W3的推荐标准里面没有定义事件相关得内容 只是讲了模型并没有讲事件
//监听方法:可以去随时监听到每异步操作来执行
// addEventListener() and removeEventListener() --除了ie9以下
// addEventListener()可以为元素添加多个事件处理程序,触发时候按照添加的而顺序一次进行调用
// removeEventListener()是移除事件处理程序(不能移除匿名添加的函数)
// addEventListener() and removeEventListener()
//第一个参数:事件名字
//第二个参数:事件处理程序函数
//第三个参数:布尔值;true表示在捕获阶段调用 flase表示在冒泡阶段调用
// 从上向下执行 从第低向上执行 直接包含的父元素
//IE浏览器 -- IE6-8版本
//attachEvent() and detachEvent()
//attachEvent()代表可以添加多个事件处理程序,也是可以触发的时候按照添加的而顺序一次处理程序
//detachEvent()代表的的移除事件处理程序(不能溢出匿名添加的函数)
//attachEvent() and detachEvent()
//第一个参数:一个事件名字
//第二个参数:事件处理程序函数
//IE浏览器没有第三个浏览器 就这个两个
// next.onclick=function(){
// alert("匿名函数");
// }
// next.onclick=function(){
// alert("这是0级事件覆盖上面的事件");
// }
//点击下一张按钮显示下一张图片 编写DOM二级事件
// next.addEventListener("click",function(){
// alert("在DOM2级事件中这张是第一张显示的")
// });
// next.addEventListener("click",function(){
// alert("在DOM2级事件中上一张显示出来了之后这样也会一次执行")
// });
function byId(id){
return typeof(id)==="string"?document.getElementById(id):id;
}
//封装通用事件的绑定方法
//传送三个参数
//第一个是绑定事件的DOM元素
// 第二个是事件名字
// 第三个是事件处理程序
function addHandler(element,type,handler){
//非IE浏览器
if(element.addEventListener){
element.addEventListener(type,handler,true);
//IE浏览器支持的DOM2级事件
} else if (element.attachEvent) {
element.attachEvent("on"+type,handler);
//IE浏览器不支持DOM2级事件时
} else {
element["on"+type]=null;
}
}
//封装测试
// addHandler(next,"click",function(){alert("11")});
// addHandler(next,"click",function(){alert("22")});
//点击下一张按钮显示下一张图片
// addHandler(next,"click",function(){
// //点击下一个按钮,使得索引递增 上面设置的index=0
// index++
// // alert(index)调试弹出窗口
// if (index>=size) {index=0}
// // console.log(index);
// for(var i=0;i<size;i++){
// pics[i].style.display="none";
// //数组里面的全部先设置为不显示在下面到了哪里就显示哪个
// dots[i].className="";
// //先设置全部圆点不亮等到下面颠倒哪里圆点就亮哪个
// //这里设置空的话就找不到任何名字就不会显示
// }
// pics[index].style.display="block";
// //小圆点换图设置
// dots[index].className="active";//动态的给她添加高亮样式
// });
//清除定时器,停止自动轮播
function stopAutoplay(){
if (timer) {
clearInterval(timer);
}
}
//鼠标滑过主菜单
for (var m=0,idx,mlen=menuItems.length;m<mlen;m++){
//给所有的主菜单定义属性,表明它索引
menuItems[m].setAttribute("data-index",m);
addHandler(menuItems[m],"mouseover",function(){
//显示主菜单所在的背景
subMenu.className="sub-menu";//隐形的将hide属性移除
//获取当前主菜单的索引
idx=this.getAttribute("data-index");
//alert(idx);
//便利所有的子菜单innerBox,将他们先隐藏起来
for(var j=0,jlen=innerBox.length;j<jlen;j++){
//隐藏所有的子菜单
innerBox[j].style.display="none";
menuItems[j].style.background="none";
}
//找到当前的字菜单,让他显示出来
innerBox[idx].style.display="block";
menuItems[idx].style.background="rgba(0,0,0,0.1)";
});
}
//鼠标离开banner区域。隐藏子菜单
addHandler(banner,"mouseout",function(){
subMenu.className="sub-menu hide";
});
//鼠标离开主菜单。隐藏子菜单
addHandler(menuContent,"mouseout",function(){
subMenu.className="sub-menu hide";
});
//鼠标划入子菜单。显示子菜单
addHandler(subMenu,"mouseover",function(){
subMenu.className="sub-menu";
});
//鼠标离开子菜单时。隐藏子菜单
addHandler(subMenu,"mouseout",function(){
subMenu.className="sub-menu hide";
});
//鼠标划入main大盒子 停止轮播
addHandler(main,"mouseover",stopAutoplay);
//鼠标划出main大盒子 开启轮播
addHandler(main,"mouseout",startAutoplay);
//定时器设置自动轮播 第一个参数索引值递增第二个参数就是时间
//开启自动轮播
function startAutoplay(){
timer=setInterval(function(){
index++;
//console.log(index)
if (index>=size) {index=0}
changeImg();
},2000)
}
function changeImg(){
//便利所有的图片,将图片隐藏起来,将点上的类消除
for(var i=0;i<size;i++){
pics[i].style.display="none";
//数组里面的全部先设置为不显示在下面到了哪里就显示哪个
dots[i].className="";
//先设置全部圆点不亮等到下面颠倒哪里圆点就亮哪个
//这里设置空的话就找不到任何名字就不会显示
}
pics[index].style.display="block";
//小圆点换图设置
dots[index].className="active";//动态的给她添加高亮样式
}
//把上面的代码封装
//点击下一张按钮显示下一张图片
addHandler(next,"click",function(){
//单击下一个按钮,是的索引递增
index++;
if (index>=size) {index=0};
changeImg();
});
//点击上一个按钮显示上一张图片
addHandler(prev,"click",function(){
//单击上一张按钮,是的索引递减
index--;
if (index<0) {index=size-1};
changeImg();
});
//点击圆点索引切换图片
for(var d=0;d<size;d++){
//dots[d].id=d;默认给每一个span标签添加名为id的属性 赋值为d 不过这种方式不太好
//dots[d].id=d;
//如何添加自定义属性
dots[d].setAttribute("data-id",d);
//setAttribute设置属性
addHandler(dots[d],"click",function(){
//htis表示当前每一个对象的使用
index=this.getAttribute("data-id");//因为作用域的问题只能获取最后一个值这里只能得到3
changeImg();
});//setAttribute设置getAttribute接收
}
//定时器设置
//图片每间隔几秒就会自动切换一次图片
//当鼠标滑倒轮播图上的时候,消除每间隔几秒切换的效果,清楚定时器
//自动开启轮播
startAutoplay();