💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
[TOC] # 1DOM ## 1.1什么是DOM > W3C 文档对象模型 (DOM) 是中立于平台和语言的接口,它允许程序和脚本动态地访问和更新文档的内容、样式和结构。 HTML Dom是关于如何增,删,改,查 HTML 元素的标准。 * DOM的支持性:凡是好用的IE9以下都不支持 * DOM:document object model # 2 节点 ## 2.1 什么是节点 节点树就是由一个个节点组成 父(parent)、子(child)和同胞(sibling)等术语用于描述这些关系。父节点拥有子节点。同级的子节点被称为同胞(兄弟或姐妹)。 ### 2.1.1 子节点的关系 * childNodes -->所有类型的子节点 * children -->只获取元素子节点 ~~~ <ul id="parent"> <li>1</li> <li>2</li> <li>3</li> </ul> <script> var childs = document.getElementById("parent").childNodes; var childEle = document.getElementById("parent").children; // console.log(childs.length); // alert(childs.length);测试节点ie7以下是3 其他为7 for(var i = 0 ; i <childs.length; i++){ if(childs[i].nodeType==1){ childs[i].style.color="red"; } } </script> ~~~ ## 2.2 如何获取节点(查询) ~~~ getElementById() getElementsByTagName() getElementsByClassName() querySelectorAll() ~~~ ### 2.2.1 `nodeType`节点类型` 还要研究` ~~~ <body id="body"> <p id="test">hello world</p> <script> /* nodeType 1-->元素节点 ElementNode 2-->属性节点 3-->文本节点 9-->document */ var attr = document.body.getAttributeNode("id"); var test = document.getElementById("test").firstChild; console.log(document.nodeType); console.log(document.body.nodeType); console.log(attr.nodeType); console.log(test.nodeType); </script> </body> ~~~ ### 2.2.2 分析实例 ![](https://box.kancloud.cn/f294c39aced7c99c0d1443f3d6a9e0a1_414x241.png) ~~~ <div> <button id="all">选中所有的</button><br> <button id="no">不选</button><br> <button id="reverse">反选</button><br> <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 checkbox = document.getElementsByTagName("input"); all.onclick = function () { for (var i = 0; i < checkbox.length; i++) { checkbox[i].checked = true; } } no.onclick = function () { for (var i = 0; i < checkbox.length; i++) { checkbox[i].checked = false; } } reverse.onclick = function () { for (var i = 0; i < checkbox.length; i++) { // checkbox[i].checked = (checkbox[i].checked==true)?false:true; checkbox[i].checked =!checkbox[i].checked; } } </script> ~~~ 实现: 点击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> ~~~ Chrome下获取外部样式 ~~~ getComputedStyle(div,null)[attr] //IE下获取 ele.currentStyle[attr] ~~~ ## 2.3 修改节点 ### 2.3.1 改变元素内容 * 1. innerHTML 改变元素的内容 * 2. textContent 改变文本内容 ~~~ <div id="test"> hello world </div> <script> var test = document.getElementById("test"); test.onclick = function(){ //this.innerHTML = "<p>change</P>"; 结果为change this.textContent = "<p>change</P>"; 结果为<p>change</P> } </script> ~~~ ### 2.3.2 修改元素样式 * ele.style.cssAttr * ele.className * ele.style.cssText * ele.classList 获取的是一个class集合 * ele.classList.add() * ele.classList.remove(); * ele.classList.toggle() -->再add和remove之切换 * ele.classList.contains() -->是否包含某个class,结果返回boolean值 ~~~ <style> .current{ color: #fff; } .bg{ background: #2dae2d; } .fs{ font-size: 30px; } </style> * * * * * <body> <p id="test" class="bg">hello world</p> <script> //ele.style.cssAttr //ele.className //ele.style.cssText //ele.classList 获取的是一个class集合 // ele.classList.add() // ele.classList.remove(); // ele.classList.toggle() -->再add和remove之切换 // ele.classList.contains() -->是否包含某个class,结果返回boolean值 var test = document.getElementById("test"); test.onclick = function(){ // this.style.backgroundColor = "blue"; // this.className = "current"; // this.style.cssText = "color:#fff ;font-size:20px;background-color:#2dae2d"; // this.classList.add("fs"); // this.classList.remove("bg"); this.classList.toggle("bg"); console.log(this.classList.contains("bg")); } </script> </body> ~~~ 点击title,centent出现对应的样式反应 ~~~ <style> *{margin: 0;padding: 0;} div{ border: 1px solid; width: 200px; text-align: center; } div:first-child{ line-height: 50px; cursor: pointer; background: blue; } div:last-child{ height: 200px; } .show{ display: none; } </style> * * * * * <div id="title"> HTML </div> <div id="content" class="show"> HTML负责网页的结构 </div> <script> var title = document.getElementById("title"); var content = document.getElementById("content"); title.onclick = function(){ if(content.classList.contains("show")){ content.classList.remove("show") }else{ content.classList.add("show"); } //content.classList.toggle("show"); } </script> ~~~ ### 2.3.3 `replace` 替换 * parentNode.replaceChild ( newChildNode ,oldChildNode) ~~~ <p id="child">hello world</p> <script> /* parentNode.replaceChild() */ var child = document.getElementById("child"); var h1 = document.createElement("h1"); h1.innerHTML="h1"; console.log(h1) // document.body.replaceChild(h1,child); </script> ~~~ ## 2.4 增加节点 ### 2.4.1` Attr`(给元素增加样式) * ele.setAttribute(attr,value) ~~~ <p id="test">hello world</p> <script> var test = document.getElementById("test"); test.setAttribute("style","color:red"); test.setAttribute("class","current"); </script> ~~~ ### 2.4.2 `appendChild ` 增加一个子节点(元素之后增加元素) * parent. appendChild( newchild ) #### 2.4.2.1 append ``` /* append() 可以传递多个参数 prepend() */ var p = document.createElement("p"); p.innerHTML = "hello world"; var h1 = document.createElement("p"); h1.innerHTML = "h1"; document.body.append(p,h1); ``` ### 2.4.3 增加元素属性 * img.src = "images/现代.png"; img.id = "img"; img.className = "img"; ~~~ <div id="parent"> <img src="images/现代.png" alt=""> <p>hello world</p> </div> <script> //appendChild() var parent = document.getElementById("parent"); var img = document.createElement("img"); img.src = "images/现代.png"; img.id = "img"; img.className = "img"; //class属性特殊,通过className设置 parent.appendChild(img); //在parent的子节点里的最后的一个节点之后增加 console.log(img); </script> ~~~ ### 2.4.4 `insertBefore` 元素之前增加元素 * parentNode.insertBefore(newElement,targetElement) * p.appendChild(txt); 给元素增加文本内容 ~~~ <div id="parent"> <!-- <p>first</p> --> <p id="one">hello world</p> </div> <script> //parentNode.insertBefore(newElement,targetElement) var parent = document.getElementById("parent"); var one = document.getElementById("one"); var p = document.createElement("p"); var txt = document.createTextNode("first"); p.appendChild(txt); console.log(p); parent.insertBefore(p,one); </script> ~~~ ### 2.4.5 `clone` 克隆/复制节点 * var clone = one.cloneNode(true); ~~~ <div id="parent"> <div id="one">one</div> </div> <script> var parent = document.getElementById("parent"); var one = document.getElementById("one"); var clone = one.cloneNode(true); console.log(clone); </script> ~~~ ### 2.4.6 createElement 创建节点 ``` var p = document.createElement("p"); p.innerHTML = "hello world"; ``` ## 2.5 删除 ### 2.5.1 `removeChild` 移除节点 ~~~ <div id="parent"> <div id="child">child</div> </div> <script> var parent = document.getElementById("parent"); var child = document.getElementById("child"); child.onclick = function(){ parent.removeChild(child); } </script> ### 2.5.2 Attr 移除属性 ``` <div> <p id="test" class="one">hello world</p> </div> <script> // getAttribute -- 设置属性 // removeAttrbute -- 移除属性 var test = document.getElementById("test"); test.onclick = function(){ var attr = this.getAttribute("class"); console.log(attr); this.removeAttribute("class") } </script> ``` ~~~ ## 2.6Node(了解) ~~~ <p id="test"> hello world</p> <script> //了解 var test = document.getElementById("test"); /* nodeValue -->textNode,commentNode 会输出值,其他类型输出null */ var txt = test.firstChild; console.log(test.nodeValue); console.log(txt.nodeValue); console.log(test instanceof Node); </script> ~~~ # 3. DOM事件 JavaScript与HTML之间的交互式通过事件实现 ~~~ onclick onfocus //获取焦点 onblur //失去焦点 onmouseover //鼠标移到某元素之上 onmouseout //鼠标从某元素移开 onload //页面加载时触发 onchange //域的内容改变时发生 onsubmit //表单中的确认按钮被点击时发生 //有事件一定有对应一个处理结果,用函数表示 onresize //浏览器的尺寸发生改变 onscroll //窗口滚动 onchange //事件支持的标签input,select,textarea ~~~ ## 3.1 `onclick` 点击事件 * 内联事件 ~~~ <p onclick="go()">hello world</p> <script> function go(){ alert(10); } </script> ~~~ ## 3.2 `onfocus/onblur` 获取/失去焦点 ~~~ <input type="text" id="txt"> <script> var txt = document.getElementById("txt"); txt.onfocus = function(){ this.style.background = "red" } txt.onblur = function(){ this.style.background = "green" } </script> ~~~ > jQuery 版 获取/失去焦点 ~~~ <script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.js"></script> <style> input{ width: 200px; } </style> * * * * * <input type="text" id="txt"> <script> $("#txt").focus(function(){ $(this).animate({width:"300px"},1000) }) $("#txt").blur(function(){ $(this).animate({width:"200px"},1000) }) </script> ~~~ ## 3.3 `onmouseover/onmouseout`----鼠标移入/移除 ~~~ <link rel="stylesheet" href="https://cdn.bootcss.com/animate.css/3.5.2/animate.css"> ~~~ ~~~ <p id="test" class="animated">hello world</p> <script> var test = document.getElementById("test"); test.onmouseover = function(){ this.classList.add("shake"); } test.onmouseout = function(){ this.classList.remove("shake"); } </script> ~~~ ## 3.4 load ## 3.5 `onchange `输入框的内容发生改变时触发 ~~~ <input type="text" id="txt"> <script> var txt = document.getElementById("txt"); txt.onchange = function (){ this.value = "change" alert(1); } </script> ~~~ ## 3.6`onsubmit` 当表单的submit按钮被点击的时候,表单会触发onsubmit事件 ~~~ <form action="" id="submit"> <p> <input type="text" id="user"> </p> <input type="submit"> </form> <script> var submit = document.getElementById("submit"); submit.onsubmit = function (event) { alert(user.value); var value = user.value; if(value == 123){ window.location.href="https://www.baidu.com" } event.preventDefault(); } </script> ~~~ ## 3.7 onresize 当浏览器的窗口大小发生改变的时候触发 ~~~ <script> // window.innerWidth -->获取浏览器窗口的width window.onresize = function(){ alert(window.innerWidth) } </script> ~~~ ## 3.8 onscroll -->窗口滚动的时候触发 * document.documentElement.scrollTop 滚动条距离顶部的高度 ~~~ <body style="height:2000px"> <script> window.onscroll = function(){ var height=document.documentElement.scrollTop; var height = window.scrollY; console.log(height); } </script> ~~~ ## 3.9 键盘事件与`KeyCode`属性 `onkeypress需百度` ~~~ onkeydown -->用户按下键盘上的一个键的时候触发 onkeypress -->在键盘按键按下并释放时发生 onkeyup -->在键盘按键松开时发生 keyCode -->键盘对应的编码 ~~~ ### 3.9.1 `onkeydown`键盘按下去触发 ~~~ <script> document.onkeydown = function(event){ alert(event.keyCode); } </script> ~~~ #### 3.9.1.1 输入框字符限制提示 `未完成` ~~~ <P>你还可以输入<em id="em" style="color: red">0</em>/300</P> <textarea name="" id="txt" cols="30" rows="10"></textarea> <script> //onkeydown -->键盘按下去触发 var em = document.getElementById("em"); var txt = document.getElementById("txt"); txt.onkeydown = function(){ var len = this.value.length; em.innerHTML = len; } </script> ~~~ # 4. BOM * BOM(browser object model)浏览器对象模型 ## 4.1.window > window是浏览器的一个实例,在浏览器中,window对象有双重角色,它既是通过Javascript访问浏览器窗口的一个接口,又是ECMAScript规定的Global对象(全局对象)。 ~~~ var age =15; //声明一个全局变量 window.name="meili"; //相当于var name = "meili" ~~~ 所有的全局变量和全局方法都被归在window上 ## 4.2 Window对象的方法 * 语法:window.alert() * 语法:window.confirm(“msg”) * 功能:显示一个带有指定消息和包含确定和取消按钮的对话框。点击确定返回true,取消返回false; ### 4.2.1语法:window.prompt("text,defaultText") * text:在对话框中显示的文本 * defaultText:默认输入文本 * 返回值:点取消按钮,返回null 点确定按钮,返回输入的文本 ~~~ <script> var value = window.prompt("输入你的年龄"); if(value>18){ alert("能进网吧") } </script> ~~~ ### 4.2.2window.location 对象 ~~~ <button id="btn">你想剁手吗?</button> <script> var btn = document.getElementById("btn"); btn.onclick = function(){ var value = window.confirm("你确定要剁手吗?"); if(value){ window.location.href = "https://www.taobao.com" }else{ window.location.href = "http://www.hudazx.cn" } } </script> ~~~ ### 4.2.3 window.open ~~~ <button id="btn">btn</button> <script> var btn = document.getElementById("btn"); btn.onclick = function(){ // window.close(); window.open("https://www.baidu.com","baidu",'width = 200,height=200,left=300,top=140'); } </script> ~~~ ### 4.2.4 window对象方法——定时器 * 1.超时调用-setTimerout() * 2.间歇调用-setInterval() #### 4.2.4.1 setTimerout(code,millisec) ~~~ 功能:在指定的毫秒数后调用函数或计算表达式 参数说明: 1.code:要调用的函数或要执行的JavaScript代码 2.millisec:在执行代码前需要等待的毫秒数 setTimeout方法返回一个id值,通过它取消超时调用 clearTimeout() ~~~ * * * * * ~~~ <script> //setTimeout() -->间隔一定时间执行函数,并且只执行一次 setTimeout(function(){ alert(1); },1000) </script> ~~~ * * * * * * clearTimerout() -->清除超时调用 ~~~ <script> // clearTimeout() -->清除超时调用 var num = 0; var max = 3; var timer; function go(){ num++; alert(num); if(num>max){ clearTimeout(timer) } else{ timer = setTimeout(go,1000) } } go(); </script> ~~~ #### 4.2.4.2 setInterval(code,millisec) 功能:每隔一段时间执行一次代码 clearInterval() ~~~ <script> //num=0,max=10,每过一秒num++,当num>max清除定时器 var num = 0; var max = 3; var timer; timer=setInterval(function(){ if (num >max){ clearInterval(timer); }else{ alert(num) num++ } },100) </script> ~~~ ## 4.3 事件冒泡 * 当子元素触发一个事件的时候,倘若父元素也有相同的事件,父元素的事件也会触发 ~~~ <style> #parent{ width: 200px; height: 200px; border: 1px solid; } #child{ width: 100px; height: 100px; border: 1px solid red; margin: 30px; } </style> * * * * * <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(){ alert("child"); //阻止事件冒泡 event.stopPropagation(); } </script> ~~~