前端之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>
02-13 20:56