JS基础-06 (BOM、轮播图、类的操作、下拉列表、Json)

1. BOM

BOM: 浏览器对象模型
BOM提供了很多对象,用于访问浏览器的功能,这些功能和任何网页内容无关;
BOM将浏览器中的各个部分转换成一个一个的对象,我们通过修改这些对象属性,调用它们的方法,从而控制浏览器的各种行为;
BOM对象:

  1. Window: 浏览器窗口, 并且保存浏览器的全局对象;
  2. Navigator: 浏览器信息, 通过该对象可以用来识别不同的浏览器, 因为历史原因已没有意义, 现通过userAgent可以判断浏览器类型; 例: /chrome/i.test(navigator.userAgent);
  3. Location: 浏览器地址栏信息;
    打印location,则能获取到当前网址栏的信息;
    修改location属性为一个完整路径或相对路径则页面会直接跳转, 即直接location="http://www.baidu.com";
    assign(): 直接跳转到某个页面,与直接修改location一样, location.assign("http://www.baidu.com");;
    reload(): 用于重新加载当前页面,与刷新按钮一样,传递true作为参数时会强制清空缓存(如清空input框内信息):
    replace(): 与assign类似但是它不会生成历史记录,无法回退,location.replace("01-BOM.html");;
  4. History: 代表历史记录,只能前进后退;
    length: 当次访问的历史次数,关闭浏览器时清零;
    back(): 回到上一个页面;
    forward(): 前往下一个页面;
    go(a): 使用整数a作为参数来指定需要跳转到的页面; 对于a, 1:标识向前跳转一个页面,等同于forward(); 2: 标识向前跳转两个页面; -1: 标识向后跳转一个页面; -2: 标识向后跳转两个页面; 例istory.go(-1);;
  5. Screen: 代表用户当前屏幕;

定时调用: window.setInterval(func, num), num为每次调用间隔的时间, 单位是毫秒; 返回值x为一个Number类型的数据, 为此定时器的标识 ;
关闭定时器: window.clearInterval(定时器标识x);
延时调用: window.setTimeout(func, num), 经过num毫秒后调用,只调用一次;

var num = 1;
var timer = setInterval(function () {
	count.innerHTML = num++;
    if (num === 11) {
		// 关闭定时器
        clearInterval(timer);
    }
}, 1000);

2. 轮播图实现

<!DOCTYPE html>

<html>
    <head>
        <meta charset="UTF-8">
        <title>轮播图</title>
        <style type="text/css">
            *{
                margin: 0;
                padding: 0;
            }

            #outer{
                width: 470px;
                height: 300px;
                margin: 50px auto;
                background-color: aquamarine;
                padding: 10px 0;
                position: relative;
                /* 裁剪溢出内容 */
                overflow: hidden;
                
            }

            #imgList{
                list-style: none;
                width: 5000px;
                position: absolute;
                /* 子元素绝对定位, 父元素最好相对定位 */
                /* 每向左移动470px, 显示下一张图片 */
                left: 0px;
            }

            #imgList li{
               float: left;
               margin: 0 10px;
            }

            #imgList li img{
               width: 450px;
               height: 300px;
            }

            #navDiv{
                position: absolute;
                /* 设置位置 */
                bottom: 15px;

                /* 居中 需要计算
                * outer:470 navDiv:(15+10)*3=75 
                * 470-75=395 395/2=197.5
                * 这种方法固定不可改, a数量多了后就会不居中, 舍弃,
                */
                /* left: 197px; */

            }

            #navDiv a{
                /* 设置超链接浮动 */
                float: left;

                width: 15px;
                height: 15px;
                background-color: burlywood;
                margin: 0 5px;

                /* 在IE8没有 */
                opacity: 0.5;
                /* 兼容IE8 */
                filter: alpha(opacity=0.5);
            }

            /* 鼠标移入显示 */
            #navDiv a:hover{
                background-color: black;
            }


        </style>
        <!-- 引入工具 -->
        <script type="text/javascript" src="js/tools.js">

        </script>
        <script type="text/javascript" >
            window.onload = function(){
                var imgList = document.getElementById("imgList");
                var imgArr = document.getElementsByTagName("img");
                imgList.style.width = 470*imgArr.length+"px";

                // 导航按钮居中
                var navDiv = document.getElementById("navDiv");
                var outer = document.getElementById("outer");
                navDiv.style.left = (outer.offsetWidth - navDiv.offsetWidth)/2 + "px";

                var index = 0;
                var allA = document.getElementsByTagName("a");
                allA[index].style.backgroundColor = "black";

                // 点击超链接切换指定图片
                for(var  i=0; i<allA.length; i++){


                    //为每一个超链接都添加一个num属性
                    allA[i].num = i;

                    allA[i].onclick = function(){

                        // 关闭autochange 自动切换定时器
                        // 否则刚点击到图片就会自动切换走
                        clearInterval(timer);

                        // 由于执行次序的问题, i全是allA.length
                        // 所以引入allA[i].num代替i
                        // alert(i);

                        // this 为onclick的allA[i]
                        // 获取点击超链接的索引,并将其设置为index
                        index = this.num;

                        // 切换图片 修改imgList 的left属性
                        // imgList.style.left = -470 * index + "px";
                        move(imgList, "left", -470*index, 20, function(){

                            // 动画执行完毕, 开启自动切换
                            autoChange();

                        });
                        setA();

                    };
                }

                autoChange();

                function setA(){

                    if(index >= imgArr.length-1){
                        index = 0;
                        // 此时显示最后一张图片 而最后一张和第一张一样
                        // 通过CSS将最后一张切换成第一张
                        // 肉眼不会知道
                        imgList.style.left = 0;
                    }
                    // 设置超链接按钮颜色
                    // 当前点击的背景为black
                    // 其余的重置为空 如没有这一步的话,点击过的按钮都会为black
                    for(var i = 0 ; i < allA.length ; i++)
                    {
                        allA[i].style.backgroundColor = "";
                    }
                    allA[index].style.backgroundColor = "black";

                };

                // 自动切换定时器
                var timer;

                // 自动切换图片
                function autoChange(){
                    // 开启一个定时器
                    timer = setInterval(function(){
                        // 使索引自增
                        index++;
                        index %= imgArr.length;
                        move(imgList , "left", -470*index, 20, function(){
                            // 修改导航点
                            setA();
                        })
                    }, 3000);
                };

            }
        </script>

    </head>
    <body>
        <!-- 创建一个大的div, 作为大的容器, 里面放无序列表 -->
        <div id="outer">
            <!-- 创建一个ul 用于放置图片 -->
            <ul id="imgList">
                <li><img src="img/pic1.jpg" /></li>
                <li><img src="img/pic2.jpg" /></li>
                <li><img src="img/pic3.jpg" /></li>
                <li><img src="img/pic1.jpg" /></li>
            </ul>
            <!-- 创建导航 -->
            <div id="navDiv">
                <a href="javascript:;"></a>
                <a href="javascript:;"></a>
                <a href="javascript:;"></a>
            </div>
        </div>
    </body>
</html>

tools.js

function getStyle(obj , name){
    if(window.getComputedStyle){
        return getComputedStyle(obj, null)[name];
    }
    else{
        return obj.currentStyle[name];
    }
}

function move(obj, attr, target, speed, callback){
    clearInterval(obj.timer);

    var current = parseInt(getStyle(obj, attr));

    if(current>target){
        speed = -speed;
    }
    obj.timer = setInterval(function(){
        var oldValue = parseInt(getStyle(obj, attr));
        var newValue = oldValue+speed;

        if((speed<0 && newValue<target) || (speed>0 && newValue>target))
        {
            newValue = target;
        }

        obj.style[attr] = newValue + "px";
        if(newValue == target){
            clearInterval(obj.timer);
            callback && callback();
        }
    },30);

}

3. 类的操作

二级菜单

<!DOCTYPE html>
<html>
 
	<head>
		<meta charset="UTF-8">
		<title>二级菜单</title>
		<style type="text/css">
			* {
				margin: 0;
				padding: 0;
				list-style-type: none;
			}
			
			a,img {
				border: 0;
				text-decoration: none;
			}
			
			body {
				font: 12px/180% Arial, Helvetica, sans-serif, "新宋体";
			}
		</style>
 
		<link rel="stylesheet" type="text/css" href="css/sdmenu.css" />
		
		<script type="text/javascript" src="js/tools.js"></script>
			<script>
				window.onload=function(){
					// 我们的每一个菜单就是一个div
					// 当这个div具有collapse的这个类时,div就是折叠的状态
					// 当div没有这个类时,就是展开的状态
					
					// 点击菜单,切换菜单的显示状态
					// 获取所有的class为menuSpan的span标签
					var menuSpan=document.querySelectorAll(".menuSpan");

					// 定义一个变量,来保存当前打开的菜单
					var openDiv=menuSpan[0].parentNode;

					for(var i=0;i<menuSpan.length;i++){

						menuSpan[i].onclick=function(){

							// this代表当前点击的span
							// 获取当前span的父节点
							var parentDiv=this.parentNode;

							// 打开或者关闭当前点击的div
							toggleMenu(parentDiv);
							
							// 打开菜单以后,应该关闭之前打开的菜单
							// 判断openDiv和parentDiv是否相同
							// 如果不相同,则去看openDiv是否有collapsed类
							// 没有collapsed类是打开状态,则对当前openDiv进行toggle操作
							if(openDiv!=parentDiv && !hasClass(openDiv,"collapsed")){

								// 为了可以统一处理动画过度效果,我们希望在这将addClass改为toggleClass
								// addClass(openDiv,"collapsed")
								alert(1);
								// 此处toggleClass()不要有移除的效果
								toggleClass(openDiv);
							}

							// 修改opendiv为当前打开的菜单
							openDiv=parentDiv;
						};
					}

                    
					// 用来切换菜单折叠和显示状态
					function toggleMenu(obj){
						// 在切换类之前,获取元素的高度
						var begin=obj.offsetHeight;
						// 切换parentDiv
						toggleClass(obj,"collapsed");
						// 在切换类之后获取一个高度
						var end=obj.offsetHeight;
						// console.log(begin+" "+end)
						// 动画效果就是将高度从begin向end过渡
						// 将元素的高度重置为begin
						obj.style.height=begin+"px";
						// 执行动画,从begin向end过渡
						move(obj,"height",end,10,function(){
							// 动画执行完毕,内联样式以及没有存在的意义清除
							obj.style.height=""
					});
				}
				}
			</script>
		
	</head>
 
	<body>
 
		<div id="my_menu" class="sdmenu">
			<div>
				<span class="menuSpan">在线工具</span>
				<a href="#">图像优化</a>
				<a href="#">收藏夹图标生成器</a>
				<a href="#">邮件</a>
				<a href="#">htaccess密码</a>
				<a href="#">梯度图像</a>
				<a href="#">按钮生成器</a>
			</div>
			<div class="collapsed">
				<span class="menuSpan">支持我们</span>
				<a href="#">推荐我们</a>
				<a href="#">链接我们</a>
				<a href="#">网络资源</a>
			</div>
			<div class="collapsed">
				<span class="menuSpan">合作伙伴</span>
				<a href="#">JavaScript工具包</a>
				<a href="#">CSS驱动</a>
				<a href="#">CodingForums</a>
				<a href="#">CSS例子</a>
			</div>
			<div class="collapsed">
				<span class="menuSpan">测试电流</span>
				<a href="#">Current or not</a>
				<a href="#">Current or not</a>
				<a href="#">Current or not</a>
				<a href="#">Current or not</a>
			</div>
		</div>
	</body>
</html>
@charset "utf-8";
 
/* sdmenu */
 
div.sdmenu {
	width: 150px;
	margin: 0 auto;
	font-family: Arial, sans-serif;
	font-size: 12px;
	padding-bottom: 10px;
	background: url(bottom.gif) no-repeat right bottom;
	color: rgb(28, 20, 71);
}
 
div.sdmenu div {
	background: url(title.gif) repeat-x;
	overflow: hidden;
}
 
div.sdmenu div:first-child {
	background: url(toptitle.gif) no-repeat;
}
 
div.sdmenu div.collapsed {
	height: 25px;
}
 
div.sdmenu div span {
	display: block;
	height: 15px;
	line-height: 15px;
	overflow: hidden;
	padding: 5px 25px;
	font-weight: bold;
	color: rgb(54, 44, 110);
	background: url(expanded.gif) no-repeat 10px center;
	cursor: pointer;
	border-bottom: 1px solid rgb(26, 28, 68);
}
 
div.sdmenu div.collapsed span {
	background-image: url(collapsed.gif);
}
 
div.sdmenu div a {
	padding: 5px 10px;
	background: rgb(126, 134, 224);
	display: block;
	border-bottom: 1px solid rgb(22, 5, 78);
	color: rgb(9, 15, 15);
}
 
div.sdmenu div a.current {
	background: rgb(10, 58, 69);
}
 
div.sdmenu div a:hover {
	background: rgb(176, 216, 216) url(linkarrow.gif) no-repeat right center;
	color: rgb(8, 50, 68);
	text-decoration: none;
}

4. Json

JSON是一个特殊格式的字符串,这个字符串可以被任意的语言所识别,并且可以转换为任意语言的对象,JSON在开发中主要用于数据的交互。
JSON JavaScript Object Notation JS对象表示法;
JSON和JS对象的格式一样,只不过JSON字符串中的属性名必须加双引号,其他的和JS语法一致。
分类:对象,数组;
允许的值:数字、字符串、布尔值、 null、对象、数组;
JSON转化为JS对象 JSON.parse() ,使用JS对象作为参数,返回JSON;
兼容IE7及以下使用eval来代替不能使用的JSON.parse(),或者引入JSON2库;eval(), 如果执行的字符串中有{},则会被当做代码块,如果不希望被当做代码块被解析,在{}前后使用(),由于效率与安全问题,尽量不要使用;
左右查询:对等号左右两边查询即左右查询,右查询没有找到时会直接报错,左查询没有找到时会在全局创建;

var obj = '{"name":"孙悟空", "age":18}';
var arr = '[1,2,3,true, "hello"]';
var obj2 = '{"arr":[1,2,3]}';
var arr2 = '[{"name":"孙悟空", "age":18}, {"name":"孙悟空", "age":17}]';
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值