事件的传播
事件的传播 关于事件的传播网景公司和微软公司有不同的理解
- 微软公司认为事件应该是由内向外传播,也就是当事件触发时,应该先触发当前元素上的事件
然后再向当前元素的祖先元素上传播,也就说事件应该在冒泡阶段执行
网景公司认为事件应该是由外向内传播的,也就是当前事件触发时,
应该先触发当前元素的最外层的祖先元素的事件<br />W3C综合了两个公司的方案,将事件传播分成了三个阶段
1.捕获阶段
在捕获阶段时从最外层的祖先元素,向目标元素进行事件的捕获,但是默认此时不会触发事件
2.目标阶段
事件捕到目标元素,捕获结束开始在目标元素上触发事件
3.冒泡阶段
事件从目标元素向他的祖先元素传递,依次触发祖先元素上的事件
如果希望在捕获阶段就触发事件,可以将 addEventlistener()的第三个参数设置为true<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <style type="text/css"> #box1{ width:300px; height:300px; } #box2{ width:200px; height:200px; } #box3{ width:100px; height:100px; } </style> <script type="text/javascript"> window.onload = function(){ var box1 = document.getElementById("box1"); var box2 = document.getElementById("box2"); var box3 = document.getElementById("box3"); var ul = document.getElementById("ul"); function bind(obj,eventStr,callback){ if(obj.addEventListener){ obj.addEventListener(eventStr,callback,false); }else{ obj.attachEvent("on"+eventStr,function(){callback.call(obj)});//匿名函数中调用回调函数来this为 }; }; bind(box1,"click",function(){alert(1);}); bind(box2,"click",function(){alert(2);}); bind(box3,"click",function(){alert(3);}); }; </script> <title>测试</title> </head> <body> <div id = "box1"> <div id = "box2"> <div id = "box3"> </div> </div> </div> </body> </html>拖拽
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <style type="text/css"> #box1{ width:300px; height:300px; position:absolute; } #box2{ width:300px; height:300px; position:absolute; left:200px; top:200px; } </style> <script type="text/javascript"> window.onload = function(){ var box1 = document.getElementById("box1"); box1.onmousedown = function(event){ var ol = event.clientX - box1.offsetLedt-ol; //相对位置 var ot = event.clientY - box1.offsetTop-ot; document.onmousemove = function(event){ var x = event.clientX; var y = event.clientY; box1.style.left = left+"px"; box1.style.top = top+"px"; }; }; document.onmouseup = function(){ document.onmousemove = null; document.onmouseup = null; }; //当我们拖拽一个网页中的内容时,浏览器会默认去搜索引擎中搜索内容,此时会导致拖功能的异常,这个是浏览器提默认行为 return false; //如果不希望发生这个行为,则可以通过 return false来取消默认行为 }; //IE8 不想管了 //最后可以封装成函数 绑定ID就可以调用 </script> <title>测试</title> </head> <body> <div id = "box1"></div> <div id = "box2"></div> </body> </html>滚轮事件
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <style type="text/css"> #box1{ width:300px; height:300px; } </style> <script type="text/javascript"> window.onload = function(){ var box1 = document.getElementById("box1"); box1.onmousewheel = function(event){ //为box绑定滚轮事件 event = event || window.event; alert(event.wheelDelta);//向上120 向下-120 向上向下只看正负 //火狐中event.detail if(event.wheelDelta>0|| event.detail<0){ box1.style.height = box1.clientHeight - 10 +"px"; }else{ box1.style.height = box1.clientHeight + 10 +"px"; } }; return false; //使用 addEventlistener()方法绑定响应函数,取消默认行为时不能使用 return false IE8 不支持 //在火狐中 DOMMouseScrool 来绑定滚动事件 //bind(box1,"DOMMouseScroo",function(){}); bind(box1,"DOMMouseScroo",box1.onmousewheel)//回调 都兼容了 event.preventDefault && event.preventDefault(); </script> <title>测试</title> </head> <body style = "height:2000px;"> <div id = "box1"></div> </body> </html>键盘事件
键盘事件
onkeydown 按键被按下
对于onkeydown来说如果一直按着某个按键不松手,则事件会一直触发
当onkeydown连续触发时,第一次和第二次之间会间隔稍微长一点,其他的会非常的快
这种设计是为了防止误操作的发生
- onkeyup
按键被松开
```html
<!DOCTYPE html>
<a name="JRrIS"></a> ### 键盘移动div ```html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <script type="text/javascript"> //键盘事件一般都会绑定给一些可以获取到焦点的对象或者是document window.onload = function(){ var box1 = document.getElementById("box1"); document.onkeydown = function(event){ event = event || window.event; switch(event.keyCode){ case 37: box1.style.left = box1.offsetLeft - 10 +"px"; break; case 39: box1.style.left = box1.offsetLeft + 10 +"px"; break; case 38: box1.style.top = box1.offsetLeft - 10 +"px"; break; case 40: box1.style.top = box1.offsetLeft + 10 +"px"; break; } var input = document.getElementsByTagName("input")[0]; input.onkeydown = function(event){ //在文本框中辑入内容,属于 onkeydown的默认行为 //如果在 onkeydown中取消了默认行为,则输入的内容,不会出现在文本框中 return false event = event || window.event; //数字48-57 if(event.keyCode >=48 && event.keyCode <=57){ return false; } }; }; //可以添加定时器来使起步不卡 </script> <title>测试</title> </head> <body> <div id = "box1"></div> </body> </html>Navigator
BOM 浏览器对象模型:
BOM可以使我们通过JS来操作浏览器
在BOM中为我们提供了一组对象,用来完成对浏览器的操作
BOM对象
Window:代表的是整个浏览器的窗口,同时 window也是网页中的全局对象
Navigator:代表的当前浏览器的信息,通过该对象可以来识别不同的浏览器
Location:代表当前浏览器的地址栏信息,可以跳转页面
History:代表浏览器的历史记录,可以通过该对象来操作浏览器的历史记录,只能向前向后翻页
Screen:代表用户的屏幕的信息,通过该对象可以获取到用户的显示器的相关的信息
这些BOM对象在浏览器中都是作为 window对象的属性保存的<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <script type="text/javascript"> console.log(navigator.appName); console.log(navigator.userAgent);//一般我们只会使用 userAgent来判断浏览器的信息 //userAgent是一个字符串,这个字符串中包含有用来描述浏览器信息的内容,不同的浏览器会有不同的 userAgent var ua = navigator.userAgent; if(/firefox/i.test(ua)){ alert("firefox"); } if("ActiveXObject" in window){ alert("IE"); }else{ alert("not IE"); } </script> <title>测试</title> </head> <body> </body> </html>History
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <script type="text/javascript"> console.log(history.length); //可以荻取到当成访问的链接数量 window.onload = function(){ var btn = document.getElementById("btn"); btn.onclick = function(){ history.back(); //history.forward(); //history.gp(1); }; }; </script> <title>测试</title> </head> <body> <h1>Test</h1> <a href = "test.html">去History</a> <button id= "btn"></button> </body> </html>Location
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <script type="text/javascript"> console.log(history.length); //可以荻取到当成访问的链接数量 window.onload = function(){ var btn = document.getElementById("btn"); btn.onclick = function(){ alert(location); location = "www.baidu.com";//会生成相应记录 //location.assign("www.baidu.com"); location.reload();//刷新 location.reload(true);//强制清空缓存 }; }; </script> <title>测试</title> </head> <body> <h1>Test</h1> <a href = "test.html">去History</a> <button id= "btn"></button> </body> </html>定时器
setInterval() 定时调用
可以将一个函数,每隔一段时间执行一次
参数:
1.回调函数,该函数会每隔一段时间被调用一次
2.每次调用间隔的时间,单位是毫秒
返回Number 这个数字用来作为定时器的唯一标识<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <script type="text/javascript"> window.onload = function(){ var count = document.getElementById("count"); var Num = 1; var timer = setInterval(function(){ count.innerHTML = Num++; if(Num ==11){ clearInterval(timer); } },1000); }; </script> <title>测试</title> </head> <body> <h1 id="count">Test</h1> </body> </html>切换图片练习
clearInterval()可以接收任意参数,
如果参数是一个有效的定时器的标识,则停止对应的定时器
如果参数不是一个有效的标识,则什么也不做<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <script type="text/javascript"> window.onload = function(){ var img1 = document.getElementById("img1"); var imgArr = ["img/1.jpg","img/1.jpg","img/1.jpg"]; var index = 0; var timer; var btn1 = document.getElementById("btn1"); var btn2 = document.getElementById("btn2"); btn1.onclick = function(){ //点一次开一个定时器 clearInterval(timer);//关掉上一个 timer = setInterval(function(){ index ++ if(index >= imgArr.length){ index = 0; } // index = index % imgArr.length; img1.src = imgArr[index]; },1000); }; btn2.onclick = function(){ clearInterval(timer); }; }; </script> <title>测试</title> </head> <body> ... </body> </html>延时调用
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <script type="text/javascript"> window.onload = function(){ var Num = 1; setTimeout(function(){ var timer = console.log(Num++); },3000);//3秒后在执行 ,只执行一次 }; cleatTimeout(timer); </script> <title>测试</title> </head> <body> <h1 id="count">Test</h1> </body> </html>定时器的应用
parseInt取出字符串中的合法数字
注意不要重复创建定时器,及时删除
创建函数的话 ,定时器用timer保存,那么只会存在一个
将timer放在对象上形成专属的,obj.timer...单独放在js中<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <script type="text/javascript"src = "js/tools.js"></script> <title>测试</title> </head> <body> ... </body> </html>完成轮播图
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <style type="text/css"> *{ margin: 0; padding: 0; } #outer{ width: 520px; height: 333px; margin: 50px auto; background-color: greenyellow; padding: 10px 0; position: relative; overflow: hidden; } #imgList{ list-style: none; /*width: 2600px;*/ position: absolute; left: 0px; } #imgList li{ float: left; margin: 0 10px; } #navDiv{ position: absolute; bottom: 15px; /*left: 50%; transform: translateX(-50%);*/ } #navDiv a{ float: left; width: 15px; height: 15px; background-color: red; margin: 0 5px; opacity: 0.5; } #navDiv a:hover{ background-color: black; opacity: 0.5; } </style> <script type="text/javascript"> window.onload = function (){ var imgList = document.getElementById("imgList"); var imgArr = document.getElementsByTagName("img"); imgList.style.width = 520 * 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++){ //为每个绑定单击相应事件 allA[i].num = i; allA[i].onclick = function (){ clearInterval(timer); index = this.num; // imgList.style.left = -520*index+"px"; setA(); move(imgList,"left",-520*index,20,function (){ //回调函数 //动画执行完毕,再次开启切换 autoChange(); });//前面章节写的定时器的应用 }; } autoChange(); var timer; //自动切换图片 function autoChange(){ timer = setInterval(function (){ index++; index = index % imgArr.length; move(imgList,"left",-520*index,20,function (){ //修改导航点 setA(); }); },3000); } //创建方法用来设置选中的a function setA(){ //判断是否为最后一张图片 if(index >= imgArr.length-1){ index = 0; imgList.style.left = 0; //通过CSS将最后一张切换成第一张 } for (var i =0;i<allA.length;i++){ allA[i].style.backgroundColor = "";//默认样式 内联级别更高 } allA[index].style.backgroundColor = "black";//选中为黑 } }; </script> <title>Title</title> </head> <body> <div id="outer"> <ul id="imgList"> <li> <img src="img/1.jpg" /> </li> <li> <img src="img/2.jpg" /> </li> <li> <img src="img/3.jpg" /> </li> <li> <img src="img/4.jpg" /> </li> <li> <img src="img/5.jpg" /> </li> <li> <img src="img/1.jpg" /> </li> </ul> <div id="navDiv"> <a href="javascript:;"></a> <a href="javascript:;"></a> <a href="javascript:;"></a> <a href="javascript:;"></a> <a href="javascript:;"></a> </div> </div> </body> </html>类的操作
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <style type="text/css"> .b1{ width: 100px; height: 100px; background-color: red; } .b2{ width: 100px; height: 100px; background-color: yellow; } </style> <script type="text/javascript"> window.onload = function (){ var box = document.getElementById("box"); var btn01 = document.getElementById("btn01"); btn01.onclick = function (){ //通过style属性来修改元素的样式,每修改一个样式,浏览器就需要重新涫染一次页面 // box.style.width = "200px"; // box.style.height = "200px"; box.className += " b2"; //这样一来,我们只需要修改一次,即可同时修改多个样式 }; function addClass(obj,className){ if(!hasClass(obj,className)){ obj.className += " "+className;} } function hasClass(obj,className){ // var reg = /\b\b/; //单词边界 var reg = new RegExp("\\b"+className+"\\b"); // 构造函数要\\ return reg.test(obj.className); } function removeClass(obj,className){ var reg = new RegExp("\\b"+className+"\\b"); obj.className = obj.className.replace(reg,""); //替换原理 } function toggleClass(obj,className){ //切换 if(hasClass(obj,className)){ removeClass(obj,className); }else { addClass(obj,className); } } }; </script> <title>Document</title> </head> <body> <button id="btn01">点击以后修改样式</button> <div id="box" class="b1" ></div> </body> </html>二级菜单
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <script> window.onload = function (){ // 我们的每一个菜单都是一个div // 当div具有collapsed这个类时,diV就是折叠的状态 // 当diV没有这个类是,div就是属开的状态 var menuSpan = document.querySelectorAll(".menuSpan"); //获取类 var openDiv = menuSpan[0],parentNode; //定义一个变量,来保存当前打开的菜单 for(var i =0;i<menuSpan.length;i++){ menuSpan[i].onclick = function (){ var parentDiv = this.parentNode; toggleMenu(parentDiv); if(openDiv != parentDiv && !hasClass(openDiv,"collapsed")){ // toggleClass(openDiv,"collapsed") //确保别才删就又加上 不用adc等下好写动画 toggleMenu(openDiv); } openDiv = parentDiv; //确保最新的 }; } //用来切换菜单折叠和显示状态 function toggleMenu(obj){ var begin = obj.offsetHeight; toggleClass(obj,"collapsed"); //切换 var end = obj.offsetHeight; obj.style.height = begin +"px"; //从开始到结束进行动画,免得直接回去了 move(obj,"height",end,10,function (){ obj.style.height = ""; }); } }; </script> <title>Document</title> </head> <body> ... </body> </html>JSON
JSON
JS中的对象只有JS自己认识,其他的语言都不认识
JSON就是一个特殊格式的字符串,这个字符串可以被任意的语言所识别
并且可以转换为任意语言中的对象,JSON在开发中主要用来数据的交互
分类:
对象:{}
数组:[]
JSON中允许的值
1.字符串
2.数值
3.布尔值
4.null
5.对象
6.数组<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <script type="text/javascript"> var obj = '{"name":"tom"}'; //对象 var arr = '[1,2,3]'; //数组 var obj = JSON.parse(obj); var obj = {"name":"tom"}; var obj = JSON.stringify(obj); </script> <title>Document</title> </head> <body> </body> </html>完结散花!
