ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
[TOC] ## 1.控制语句 ### 1.1条件判断 > 多个判断,switch(){case} ~~~ var x = 1; switch (x) { case 1:{/*x=1时执行该语句内容*/ console.log('x 等于1'); break; } case 2:{/*x=2时执行该语句内容*/ console.log('x 等于2'); break; } default:{/*case里面的情况无一发生时,执行该语句*/ console.log('x 等于其他值'); } } ~~~ ### 1.2 循环 > while()循环 ~~~ //eg: var a=0; while(a<=10){ //只要a<=10为true就一直循环 console.log(a); a++; } ~~~ > for...in...循环:获取对象属性的值 ~~~ var obj = { name: 'Jack', age: 20, city: 'Beijing' }; for (var key in obj) { alert(obj[key]); } ~~~ ### 1.3break和continue(牢记) > 1.break 达到条件,跳出循环 ~~~ for (var i = 0; i < 10; i++) { if (i == 5) { break; } console.log(i); //0,1,2,3,4 } ~~~ > 2.continue 结束本次循环,继续开始下一次 ~~~ for(var i=0;i<5;i++){ if(i==2){continue}; console.log(i); //0,1,3,4 } ~~~ ## 2.DOM基础 ### 1.什么是DOM? > W3C 文档对象模型 (DOM) 是中立于平台和语言的接口,它允许程序和脚本动态地访问和更新文档的内容、样式和结构。 HTML Dom是关于如何增,删,改,查 HTML 元素的标准。 **DOM的支持性:凡是好用的IE9以下都不支持** *DOM:document object model HTML DOM 将 HTML 文档视作树结构。这种结构被称为节点树:* ### 2.节点 > 节点树就是由一个个节点组成 > 父(parent)、子(child)和同胞(sibling)等术语用于描述这些关系。父节点拥有子节点。同级的子节点被称为同胞(兄弟或姐妹)。 #### 2.1如何获取节点 ~~~ getElementById() getElementsByTagName() getElementsByClassName() querySelectorAll() ~~~ #### 例子1: ![](https://box.kancloud.cn/45b6ec1e5c0e6f32e01a30231f14f34c_313x163.gif) ~~~ <div> <button id="all">选中所有的</button> <button id="no">不选</button> <button id="reverse">反选</button> <h3>选择爱好</h3> <input type="checkbox">足球 <input type="checkbox">篮球 <input type="checkbox">棒球 <input type="checkbox">乒乓球 </div> ~~~ ~~~ <script> var all = document.getElementById("all"); var no = document.getElementById("no"); var reverse = document.getElementById("reverse"); var inputs = document.getElementsByTagName("input"); all.onclick = function(){ for(var i=0;i<inputs.length;i++){ inputs[i].checked = true; } } no.onclick = function(){ for(var i=0;i<inputs.length;i++){ inputs[i].checked = false; } } reverse.onclick = function(){ for(var i=0;i<inputs.length;i++){ /* inputs[i].checked = (inputs[i].checked==true)?false:true; */ inputs[i].checked = !(inputs[i].checked); } } </script> ~~~ #### 例子2: 点击button按钮,如果div是显示的则隐藏,如果隐藏则显示 ~~~ <div id="div" style="display:block"></div> <button id="btn">切换</button> <script> var div = document.getElementById("div"); var btn = document.getElementById("btn"); btn.onclick = function(){ var value = div.style.display; if(value == "block"){ div.style.display = "none" }else{ div.style.display = "block" } } </script> ~~~ #### 2.2修改元素节点的内容,样式 **修改元素节点的内容** ~~~ 1. innerHTML 2. textContent /*little demo*/ <div id="test"> hello world </div> <script> var test = document.getElementById("test"); test.onclick = function(){ // this.innerHTML = "<p>change</p>"; this.textContent = "<p>change</p>"; } </script> ~~~ **修改样式** ~~~ <style> .current{ color: brown; } .bg{ background: #fafa; } .fs{ font-size: 40px; } </style> <p id="test" class="current">hello world</p> <script> var test = document.getElementById("test"); test.onclick = function(){ // this.style.background = "#f1f1f1"; // this.className = "current"; // this.style.cssText = "color:red;font-size:30px;background-color:green;"//添加css样式 // this.classList.add("fs","bg","current");//添加class名字 // this.classList.remove("fs");//移除class名字 this.classList.toggle("current");//toggle:在add和remove之间切换 console.log(this.classList.contains("current"));//是否包含某个class,结果返回boolean值 } </script> ~~~ > 隔行变色 ~~~ <ul> <li>1</li> <li>2</li> <li>3</li> <li>4</li> <li>5</li> </ul> ~~~ css实现方法 ~~~ <style> //偶数项 ul>li:nth-child(odd){ color:red; } //奇数项 ul>li:nth-child(even){ color:green; } </style> ~~~ js实现方法 ~~~ <script> var lis = document.getElementsByTagName("li"); for(var i=0;i<lis.length;i++){ if(i%2==0){ lis[i].style.backgroundColor = "red"; }else{ lis[i].style.backgroundColor = "green" } } </script> ~~~ ### 3. textContent,nodeValue #### 3.1node.textContent > textContent属性返回当前节点和它的所有后代节点的文本内容。 #### 3.2Node.nodeValue > 只有文本节点(text)和注释节点(comment),有文本值,因此这两类节点的nodeValue可以返回结果,其他类型的节点一律返回null ### 4.节点的分类nodeType * nodeType==1 为元素节点 * nodeType==2 为属性节点 * nodeType==3 位文本节点 ~~~ <body id="body"> <p id="test">hello word</p> <script> var attr = document.body.getAttributeNode("id");//getAttribute() 方法返回指定属性名的属性值,以 Attr 对象. var test = document.getElementById("test").firstChild; /*nodeType 属性返回以数字值返回指定节点的节点类型。*/ console.log(document.body.nodeType);//输出 1 console.log(attr.nodeType);//输出 2 console.log(test.nodeType);//输出 3 </script> </body> ~~~ ### 5.增加获取节点 #### 5.1appendChild() > 该方法可向节点的子节点列表的末尾添加新的子节点 ~~~ createElement(); //创建元素节点 createTextNode(); //创建文本节点 var p = document.createElement("p"); var txt = document.createTextNode("hello world"); //创建属性节点 var attr = document.createAttribute("class"); attr.value = "democlass"; p.setAttributeNode(attr) p.appendChild(txt); document.body.appendChild(p) ~~~ > parentNode.insertBefore(newNode,targetElementNode) #### 5.2insertBefore() 方法 > 该方法在您指定的已有子节点之前插入新的子节点;insertAfter() 方法在被选元素之后插入 HTML 标记或已有的元素。 ~~~ <ul id="parent"> <li>hello world</li> </ul> <script> var parent = document.getElementById("parent"); for (let i = 0; i < 3; i++) { var li = document.createElement("li"); li.innerHTML = "java" + i; parent.insertBefore(li, parent.firstElementChild) } </script> ~~~ ### 6.删除节点 ~~~ parentNode.removeChild(childNode) //removeChild() 方法指定元素的某个指定的子节点。 ~~~ ### 7.修改节点(替换节点) >parentNode.replaceChild(newNode,oldNode); replaceChild() 方法可将某个子节点替换为另一个。 ~~~ <div id="div1"> <p id="p1">This is a paragraph.</p> <p id="p2">This is another paragraph.</p> </div> <script> var para = document.createElement("p"); var node = document.createTextNode("This is new."); para.appendChild(node); var parent = document.getElementById("div1"); var child = document.getElementById("p1"); parent.replaceChild(para, child); </script> ~~~ ### 8.克隆节点 > node.cloneNode(true) **cloneNode(deep) 方法克隆所有属性以及它们的值。如果您需要克隆所有后代,请把 deep 参数设置 true,否则设置为 false。** ~~~ <p id="test">hello world</p> <script> var test = document.getElementById("test"); var cTest = test.cloneNode(true); console.log(cTest); document.body.appendChild(cTest); </script> ~~~ ## 3. DOM事件 > JavaScript与HTML之间的交互式通过事件实现的 > **不熟悉的地方:bootstrap Vue,onloaf-document.readState事件** ### 3.1onfocus、onblur事件 ~~~ onfocus 事件在对象获得焦点时发生。(即鼠标点击到对象上时) onfocus 事件的相反事件为 onblur 事件。 ~~~ egs:简书输入框的伸缩实现 ~~~ <style> input{ width: 200px; } </style> <script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.js"></script> <input type="text" id="txt"> <script> var txt = document.getElementById("txt"); $("#txt").focus(function(){ $(this).animate({width:"300px"},1000) }) $("#txt").blur(function(){ $(this).animate({width:"200px"}),1000 }) </script> ~~~ ### 3.2onmouseover、onmouseout事件(鼠标移入、移出事件) egs: ~~~ <link href="https://cdn.bootcss.com/animate.css/3.5.2/animate.css" rel="stylesheet"> <p id="test" class="animated">hello world</p> <script> /* onmouseover--鼠标移入 onmouseout--鼠标移出 */ var test = document.getElementById("test"); test.onmouseover = function(){ this.classList.add("shake"); } test.onmouseout = function(){ this.classList.remove("shake"); } </script> ~~~ ### 3.3onloadonload事件 该事件会在页面或图像加载完成后立即发生。 egs: ~~~ window.onload = function(){ if(document.readyState == "complete"){//readyState 属性返回当前文档的状态(载入中……)。该属性返回以下值:uninitialized - 还未开始载入loading - 载入中interactive - 已加载,文档与用户可以开始交互complete - 载入完成 //coding alert("已加载完成"); } } ~~~ ### 3.4onchange事件 onchange 事件会在域的内容改变时发生,它支持的标签有input,select,textarea egs: ~~~ <input type="text" id="txt"> <script> var txt = document.getElementById("txt"); txt.onchange = function(){ if(this.value == "im"){ alert("请输入密码:") }else{ alert("禁止输入!"); } } </script> ~~~ ### 3.5onsubmit事件 onsubmit 事件会在表单中的确认按钮被点击时发生。 egs: ~~~ <form id="submit"> <p><input type="text" placeholder="输入你的密码:" id="user"></p> <input type="submit"> </form> <script> var submit = document.getElementById("submit"); var user = document.getElementById("user"); submit.onsubmit = function(event){ if(user.value == "123"){ alert("you win"); window.location.href = "http://www.baidu.com"; } else{ alert("请输入密码:"); } return false; } </script> ~~~ ### 3.6onresize事件 onresize 事件会在窗口或框架被调整大小时发生。 egs: ~~~ <script> // window.innerWidth-->获取浏览器窗口的width window.onresize= function(){ alert(window.innerWidth) } </script> ~~~ ### 3.7onscroll事件 onscroll 事件在元素滚动条在滚动时触发 egs: ~~~ <script> /* document.documentElement.scrollTop滚动条距离顶部的高度 */ window.onscroll = function(){ // var height = window.scrollY; var height = document.documentElement.scrollTop; console.log(height); } </script> ~~~ ### 3.8onkey键盘事件 > onkeydown:用户按下一个键盘按键时发生 onkeypress:在键盘按键按下并释放一个键时发生 onkeyup:在键盘按键松开时发生 keyCode:返回onkeypress,onkeydown或onkeyup事件触发的键的值的字符代码,或键的代码 eg1: ~~~ <script> document.onkeydown = function(event){//键盘按下去触发 alert(event.keyCode);//读取键盘值 } </script> ~~~ eg2: ~~~ <p>你还可以输入<em id="em" style="color:red;">0</em>/300</p> <textarea cols="30" rows="10" id="txt"></textarea> <script> var em = document.getElementById("em"); var txt = document.getElementById("txt"); txt.onkeydown = function(){ var len = this.value.length; em.innerHTML = len; } </script> ~~~ ### 3.9冒泡事件 egs: ~~~ <style> #parent{ width: 200px; height: 200px; border: 1px solid #333; } #child{ margin: 30px; width: 100px; height: 100px; border: 1px solid #ff2d51; } </style> </head> <body> <div id="parent"> parent <div id="child">child</div> </div> <script> var parent = document.getElementById("parent"); var child = document.getElementById("child"); parent.onclick = function(){ alert("parent"); } child.onclick = function(event){ alert("child");//点击子元素,若父元素与子元素有同样的事件,父元素的事件也会触发;这便是事件冒泡 //阻止事件冒泡 // event.stopPropagation(); } </script> ~~~ ## 4.BOM > BOM(browser object model)浏览器对象模型 ### 4.1window window是浏览器的一个实例,在浏览器中,window对象有双重角色,它既是通过Javascript访问浏览器窗口的一个接口,又是ECMAScript规定的Global对象(全局对象)。 ~~~ var age =15; //声明一个全局变量,相当于window.age=15; ~~~ **所有的全局变量和全局方法都被归在window上** ### 4.2Window对象的方法 #### 1.语法:window.alert() #### 2.语法:window.confirm(“msg”) 功能:显示一个带有指定消息和包含确定和取消按钮的对话框。点击确定返回true,取消返回false; egs: ~~~ <button id="btn">你想剁手吗?</button> <script> var btn = document.getElementById("btn"); btn.onclick = function(){ var value = window.confirm("are you sure"); if(value){ window.location.href = "https://www.taobao.com"; }else{ window.location.href = "http://www.hudazx.cn" } } </script> ~~~ #### 3.语法:window.prompt(“text,defaultText”) > 参数说明: > text:在对话框中显示的文本 > defaultText:默认输入文本 > 返回值:点取消按钮,返回null > 点确定按钮,返回输入的文本 egs: ~~~ <script> var value = window.prompt("请输入你的年龄"); if(value>=18){ alert("你可以进网吧了"); }else{ alert("小屁孩快走开") } </script> ~~~ #### 4.语法:window.open(pageURL,name,parameters) ~~~ 功能:打开一个新的窗口或查找一个已命名的窗口 ~~~ > 参数说明: > pageURL:子窗口的路基 > name:子窗口的句柄(name声明了新窗口的名称,方便后期通过name对子窗口进行引用) > parameters:窗口参数(各参数之间用逗号分隔) > window.close() > 功能:关闭窗口 egs: ~~~ <button id="btn">btn</button> <script> var btn = document.getElementById("btn"); btn.onclick = function(){ // window.open("https://www.baidu.com"); window.open("https://www.baidu.com","baidu",'width=400px,height=200px,top=0px'); // window.close();//关闭窗口 } </script> ~~~ ### 4.3window对象方法——定时器 * 1.超时调用-setTimeout() * 2.间歇调用-setInterval() JavaScript是单线程语言,所有代码按顺序执行 **setTimeout(code,millisec) 功能:在指定的毫秒数后调用函数或计算表达式** ~~~ <script> setTimeout(function() {//会执行一次 alert(1); }, 1000); </script> ~~~ ~~~ 参数说明: 1.code:要调用的函数或要执行的JavaScript代码 2.millisec:在执行代码前需要等待的毫秒数 setTimeout方法返回一个id值,通过它取消超时调用 clearTimeout() ~~~ **setInterval(code,millisec) 功能:每隔一段时间执行一次代码 clearInterval()clearInterval() 方法可取消由 setInterval() 设置的 timeout。 clearInterval() 方法的参数必须是由 setInterval() 返回的 ID 值。** eg:num=0,max=3每过一秒num++,当num>max清除定时器 ~~~ <script> var num=0; var max=3; var timer; function go(){ num++; if(num>max){ clearTimeout(timer); }else{ timer=setTimeout(go,1000); alert(num); } } go(); </script> ~~~ ### 4.4location对象 location对象提供了与当前窗口中加载的文档有关信息,还提供了一些导航的功能,他既是window对象的属性,也是document对象的属性。 ~~~ location.href与window.location.href等价 语法:location.hash 功能:返回URL中的hash(#号后跟0或多个字符),如果不包含则返回空字符串 语法:location.host 功能:返回服务器名称和端口号 语法:location.hostname 功能:返回不带端口号的服务器名称 语法:location.pathname 功能:返回URL中的目录和(或)文件名 语法:location.port 功能:返回URL中指定的端口号,如果没有,返回空字符串 ~~~ ### 4.5history对象 ~~~ history对象保存了用户在浏览器中访问页面的历史记录 语法:history.back() 功能:回到历史记录的上一步 相当于是用了history.go(-1) //-1表示前一步,-2前两部 语法:history.go(1) 功能:回到历史记录的前一步 相当于history.forward() 语法:history.go(-n) 功能:回到历史记录的前n部 语法:history.go(n) 功能:回到历史记录的后n步 ~~~ egs: ~~~ /*在第一个页面添加一个链接,使得可以跳转到另一个页面,在另一个页面添加按钮之类的元素,使用js的history.back()回退到上一个页面*/ <button id="back">back06</button> <script> var back = document.getElementById("back"); back.onclick = function(){ history.back(); } </script> ~~~ ### 4.6screen对象 ~~~ screen对象包含有关客户端显示屏幕的信息 screen.availWidth screen.availHeight document.documentElement.clientWidth;//页面布局视口的width screen.availWidth;//显示设备的width window.devicePixelRatio;//设备与布局视口的像素比 ~~~ ### 4.7navigator对象 ~~~ 1.需要掌握Navigator对象的userAgent属性 2.需要掌握如何判断浏览器的类型 3.需要掌握如何判断设备的终端是移动还是PC UserAgent:用来识别浏览器名称,版本,引擎以及操作系统等信息的内容。* //检测浏览器类型 /*关于如何才能看到检测效果,f12打开控制台,切换为iphone端,刷新页面即可显示效果*/ if(/Android|iphone|webOS/i.test(navigator.userAgent)){ location.href="https://www.baidu.com/" }else if(/ipad/i.test(navigator.userAgent)){ location.href="https://www.sogou.com/" } ~~~ ## 5.this的指向问题 > 在事件函数中,this指向正在执行事件的对象 egs: ~~~ <input type="button" value="hello" id="test"> <script> var value = "change"; var test = document.getElementById("test"); test.onclick = function(){ console.log(this.value);//hello setTimeout(function(){ console.log(this.value);//change },300) setTimeout(()=>{//箭头函数this指向test console.log(this.value);//hello },300) go();//change 函数正常调用,this指向window } function go(){ console.log(this.value); } </script> ~~~ > 案例中,我们发现当调用方法时this会指向我们所定义的全局变量value,而非函数test,使得控制台输出change,当使用箭头函数和直接输出this.value,控制台才会输出hello,对此,我们还另外提出两种解决方案 ~~~ /*还是同一个案例*/ test.onclick = function(){ //方法1 将this赋值给一个变量 /* var self = this; setTimeout(function() { console.log(self.value);//hello }, 300); */ //方法2 bind bind可以改变函数内部this关键字的指向 //bind setTimeout(function() { console.log(this.value);//hello }.bind(this), 300); } ~~~ 有关bind的一个小例子: ~~~ <script> var name = "zhang"; var obj = { name:"厉害了", }; var func = function(){ console.log(this.name);//cheng }.bind(obj); func(); </script> ~~~