前端之BOM和DOM
BOM (Browser Object Model)是指浏览器对象模型,它使JavaScript有能力与浏览器进行“对话”
DOM(Document Object Model))是指文档对象模型,通过它,可以访问HTML文档的所有元素
Window 对象是客户端 JavaScript 最高层对象之一,由于Windon对象是其它大部分对象的共同祖先,在调用 Window 对象的方法和属性时,可以省略 Window 对象的引用。例如:window.documenet.write() 可以简写成:document.write()
所有浏览器都支持 window 对象。它表示浏览器窗口
window.innerHeight 浏览器窗口的内部高度 642 window innerWidth 错误案例 VM218:1 Uncaught SyntaxError: Unexpected identifier window.innerWidth 浏览器窗口的内部宽度 770 window.open() 打开一个新窗口 Window {postMessage: ƒ, blur: ƒ, focus: ƒ, close: ƒ, parent: Window, …} window.close() 关闭当前窗口
window的子对象
navigator 对象(了解即可) 对象包含了浏览器相关信息
navigator.appName 浏览器的名字 "Netscape" navigator.appVersion 浏览器版本 "5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3704.400 QQBrowser/10.4.3587.400" navigator.userAgent 浏览客户端信息,以后用在爬虫,重要 "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3704.400 QQBrowser/10.4.3587.400" navigator.platform 浏览器运行所在的操作系统 "Win32"
history 对象 对象包含了浏览器历史
history.forward() 网页前进一页 history.back() 网页后退一页
location 对象 对象用于获得当前页面的地址(URL),并把浏览器重定向到新的页面
location.href 获取当前页面地址 location.href="https://www.baidu.com" 跳转到指定页面 location.reload() 刷新当前页面 reload(刷新)
弹出框
可以在 js 中创建三种消息框:警告框,确认框,提示框
alert('你看到了吗?') 警告框 blog-common.min.js?v=4QhAuTQQoOm-lM3IPePkpoT4bSJvxH-elPKwr4VYOAI:1 alert: 你看到了吗? true alert(123) blog-common.min.js?v=4QhAuTQQoOm-lM3IPePkpoT4bSJvxH-elPKwr4VYOAI:1 alert: 123 true confirm('确认删除?') 确认框 true confirm('确认删除?') false prompt('输入姓名') 提示框 "ssss"
定时器
setTimeout()
clearTimeout()
setInterval()
clearInterval()
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script> function f(){ alert('我是能弹的') } // var t = setTimeout(f,3000) 以毫秒为单位,用来及时多久后执行哪个命令 // setTimeout(f, 3000) // clearTimeout(t) 清除定时器命令 // var t = setInterval(f,2000) 反复执行计时命令 // clearInterval(t) 清除反复执行定时命令 function f1(){ var t =setInterval(f,2000) function inner(){ clearInterval(t) } setTimeout(inner,6000) } f1() </script> </head> <body> </body> </html>
DOM
DOM:是一套对文档的内容进行抽象和概念化的方法
当网页被加载时,浏览器会创建页面的文档对象模型(Document Object Model)
HTML DOM 模型被构造为对象的树
DOM 标准规定HTML文档中的每一成分都是一个节点(node):
文档节点(document对象):代表整个文档
元素节点(element对象):代表一个元素(标签)
文本节点(text对象):代表元素(标签)中的文本
属性节点(attribute对象):代表一个属性,元素(标签)才有属性
注释是注释节点(comment对象)
直接查找
document.getElementById('a1') id选择器 <div class="a" id="a1">我是第一个div</div> document.getElementsByClassName('b') 类选择器 HTMLCollection [div#b1.b, b1: div#b1.b]0: div#b1.blength: 1b1: div#b1.b__proto__: HTMLCollection document.getElementsByClassName('b')[0] 数组索引取值 <div class="b" id="b1">…</div> document.getElementsByTagName('a') 标签选择器 HTMLCollection [a]0: alength: 1__proto__: HTMLCollection document.getElementsByTagName('a')[0] 数组索引取值 <a href>a标签</a>
间接查找
DOM 操作HTML代码,以下各类方法基本是基于这个HTML代码基础
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <div class="a" id="a1">我是第一个div</div> <div class="b" id="b1">我是第二个div <span class="c" id="c1">我是第二个div的span</span> <div class="d" id="d1">我是第二个div的div <a href="">a标签</a> </div> </div> <div class="e" id="e1">我是第三个div</div> <input type="text" value="123"> </body> </html>
var dEle=document.getElementById('c1') undefined dEle <span class="c" id="c1">我是第二个div的span</span> dEle.parentElement 注:查找父级dom <div class="b" id="b1">"我是第二个div "<span class="c" id="c1">我是第二个div的span</span><div class="d" id="d1">…</div></div> var paEle=dEle.parentElement undefined paEle <div class="b" id="b1">…</div> paEle.children 注:查找儿子dom不包括孙子 HTMLCollection(2) [span#c1.c, div#d1.d, c1: span#c1.c, d1: div#d1.d]0: span#c1.c1: div#d1.dlength: 2c1: span#c1.cd1: div#d1.d__proto__: HTMLCollection paEle.firstChild 注:查找第一个儿子标签内容 "我是第二个div " paEle.firstElementChild 注:查找第一个儿子dom <span class="c" id="c1">我是第二个div的span</span> paEle.lastElementChild 注:查找最后一个儿子 <div class="d" id="d1">…</div> paEle.lastChild #text var cEle=dEle.nextElementSibling 注:查找当前标签的下一个兄弟 undefined cEle <div class="d" id="d1">…</div> cEle.previousSibling #text cEle.previousElementSibling 注:查找当前元素的上一个兄弟 <span class="c" id="c1">我是第二个div的span</span>
添加创建节点
var img=document.createElement('img') 创建标签 undefined img <img> img.src='1.jpg' 设置标签的默认属性 "1.jpg" img <img src="1.jpg"> var d1Ele=document.getElementById('a1') 获得标签对象 undefined d1Ele.appendChild(img) 插入标签 <img src="1.jpg">
时间显示器
onclick 当用户点击某个对象时调用的事件句柄
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <input type="text" id="a1"> <input type="button" value="开始" id="start"> <input type="button" value="暂停" id="stop"> <script> var t; var a1Ele=document.getElementById('a1'); var stopEle=document.getElementById('stop'); var startEle=document.getElementById('start') function showtime(){ var date_obj=new Date(); var now_time=date_obj.toLocaleString(); a1Ele.value=now_time; } startEle.onclick=function(){ if(!t){ t=setInterval(showtime,1000) } } stopEle.onclick=function(){ clearInterval(t) t='' } </script> </body> </html>
搜索框
onfocus 元素获得焦点。 // 练习:输入框
onblur 元素失去焦点。 应用场景:用于表单验证,用户离开某个输入框时,代表已经输入完了,我们可以对它进行验证.
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <input type="text" id="a1" value="请输入" onfocus="foo()" onblur="fool()"> <script> var a1Ele=document.getElementById('a1') function foo(){ var val=a1Ele.value if(val=='请输入'){ a1Ele.value='' } } function fool(){ var val=a1Ele.value if(val==''){ a1Ele.value='请输入' } } </script> </body> </html>
var d1Ele=document.getElementById('b1') 获取标签对象 undefined d1Ele <div class="b" id="b1">"我是第二个div "<span class="c" id="c1">我是第二个div的span</span><div class="d" id="d1">…</div></div> var imgEle=document.createElement('img') 创建标签 undefined imgEle <img> imgEle.src='1.jpg' 设置标签的默认属性 "1.jpg" imgEle <img src="1.jpg"> var d1Ele=document.getElementById('a1') undefined d1Ele.appendChild(imgEle) 插入子标签 <img src="1.jpg"> var d1Ele=document.getElementById('b1') undefined d1Ele.appendChild(imgEle) <img src="1.jpg"> var c1Ele=document.getElementById('c1') undefined d1Ele.insertBefore(imgEle,c1Ele) 插入指定位置的标签 <img src="1.jpg"> imgEle.setAttribute("name","val") 设置标签属性 undefined imgEle <img src="1.jpg" name="val">
d1Ele <div class="b" id="b1">"我是第二个div "<img src="1.jpg" name="val"><span class="c" id="c1">我是第二个div的span</span><div class="d" id="d1">…</div></div> d1Ele.removeChild(imgEle) 移除子标签 <img src="1.jpg" name="val"> d1Ele.replaceChild(imgEle,c1Ele) 替换标签,第一个参数是新标签,第二个参数是要被替换的标签 <span class="c" id="c1">我是第二个div的span</span> d1Ele <div class="b" id="b1">"我是第二个div "<img src="1.jpg" name="val"><div class="d" id="d1">…</div></div>
var a1Ele=document.getElementById('a1') 获取标签对象 undefined a1Ele <div class="a" id="a1">我是第一个div</div> a1Ele.innerText 获取标签文本内容 "我是第一个div" a1Ele.innerText='修改标签内容' 设置修改文本内容 "修改标签内容" a1Ele.innerHTML 如下解释 "修改标签内容" var b1Ele=document.getElementById('b1') undefined b1Ele <div class="b" id="b1">"我是第二个div "<span class="c" id="c1">我是第二个div的span</span><div class="d" id="d1">…</div></div> b1Ele.innerText 获取标签文本内容 "我是第二个div 我是第二个div的span 我是第二个div的div a标签" b1Ele.innerHTML 获取当前标签底下的所有内容, "我是第二个div <span class="c" id="c1">我是第二个div的span</span> <div class="d" id="d1">我是第二个div的div <a href="">a标签</a> </div> " a1Ele.innerText='<h1>111</h1>' 相当于对标签赋值,修改内容 "<h1>111</h1>" a1Ele.innerHTML='<h1>111</h1>' 设置标签内容,并执行样式 "<h1>111</h1>" 注:innerText 只对 文本内容 进行操作处理, innerHTML,不仅可操作文本内容,还操作当前标签下所有的 HTML 代码
var b1Ele=document.getElementById('b1') undefined b1Ele <div class="b b12 b13" id="b1">…</div> b1Ele.classList 获取所有的 class 属性值 DOMTokenList(3) ["b", "b12", "b13", value: "b b12 b13"] b1Ele.classList.remove('b12') 移除属性值 undefined b1Ele <div class="b b13" id="b1">…</div> b1Ele.classList.add('b14') 添加属性值 undefined b1Ele <div class="b b13 b14" id="b1">…</div> b1Ele.classList.contains('b') 判断值是否存在 true b1Ele.classList.toggle('b') toggle(),表示如果存在传的这个值,就删除,不存在就添加 false 这里存在就给删除了 b1Ele <div class="b13 b14" id="b1">…</div> b1Ele.classList.toggle('b') 这里不存在就添加上 true b1Ele <div class="b13 b14 b" id="b1">…</div> b1Ele.style.backgroundColor="red" 设置CSS样式属性 "red" var a1Ele=document.getElementById('a1') undefined a1Ele.style.backgroundColor='green' "green"
使用 JQ
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <!--写 JQ 代码一定要引入 jquery.js 文件--> <script src="jquery.js"></script> </head> <body> </body> </html>
toggle
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <style> #a1{ height: 400px; width: 400px; } .red{ background: red; } .green{ background: green } </style> </head> <body> <div id="a1" class="red green"></div> </body> </html>