BOM(Browser Object Model)瀏覽器對象模型 目前為止,我們已經學習了javaScript的一些簡單的語法。但是這些簡單的語法,並沒有和瀏覽器有任何交互。也就是我們還不能製作一些我們經常看到的網頁的一些交互,我們需要繼續學習BOM和DOM相關知識。 Javascript 由三部分 ...
目錄
BOM(Browser Object Model)瀏覽器對象模型
目前為止,我們已經學習了javaScript的一些簡單的語法。但是這些簡單的語法,並沒有和瀏覽器有任何交互。也就是我們還不能製作一些我們經常看到的網頁的一些交互,我們需要繼續學習BOM和DOM相關知識。
Javascript 由三部分構成,ECMAScript,DOM和BOM。
BOM(Browser Object Model)是指瀏覽器對象模型,它使 JavaScript 有能力與瀏覽器進行“對話”。
DOM (Document Object Model)是指文檔對象模型,通過它,可以訪問HTML文檔的所有元素
window對象
所有瀏覽器都支持 window 對象。它表示瀏覽器視窗。
常用的Window方法
window.innerHeight - 瀏覽器視窗的內部高度
window.innerWidth - 瀏覽器視窗的內部寬度
window.open() - 打開新視窗
window.close() - 關閉當前視窗
window的子對象
navigator對象
瀏覽器對象,通過這個對象可以判定用戶所使用的瀏覽器,包含了瀏覽器相關信息。
1.瀏覽器全稱
window.navigator.appName
輸出結果:
"Netscape"
2.瀏覽器廠商和版本的詳細字元串
window.navigator.appVersion
輸出結果:
'5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36'
3.用來標識\效驗當前是否是一個瀏覽器 是否存在(userAgent)參數
window.navigator.userAgent
輸出結果:
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36'
4.查看當前平臺
window.navigator.platform
擴展(user-agent)網站仿爬措施
1.最簡單最常用的一個就是校驗當前請求的發起者是否是一個瀏覽器 userAgent
user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36
如何破解該措施?
在你的代碼中加上上面的user-agent配置即可
history對象
瀏覽歷史對象,包含了用戶對當前頁面的瀏覽歷史,但我們無法查看具體的地址,可以簡單的用來前進或後退一個頁面。
history.forward() // 前進一頁
history.back() // 後退一頁
location對象
window.location 對象用於獲得當前頁面的地址 (URL),並把瀏覽器重定向到新的頁面。
location.href 獲取URL
location.href="URL" // 跳轉到指定頁面
location.reload() 重新載入頁面
location.href = 'https://www.sogo.com/'
彈出框
可以在 JavaScript 中創建三種消息框:警告框、確認框、提示框。
警告框
警告框經常用於確保用戶可以得到某些信息。
當警告框出現後,用戶需要點擊確定按鈕才能繼續進行操作。
alert("警告框");
確認框
確認框用於使用戶可以驗證或者接受某些信息。
當確認框出現後,用戶需要點擊確定或者取消按鈕才能繼續進行操作。
如果用戶點擊確認,那麼返回值為 true。如果用戶點擊取消,那麼返回值為 false。
confirm("你確定嗎?")
提示框
提示框經常用於提示用戶在進入頁面前輸入某個值。
當提示框出現後,用戶需要輸入某個值,然後點擊確認或取消按鈕才能繼續操縱。
如果用戶點擊確認,那麼返回值為輸入的值。如果用戶點擊取消,那麼返回值為 null。
prompt("請在下方輸入","你的答案")
計時相關
通過使用 JavaScript,我們可以在一定時間間隔之後來執行代碼,而不是在函數被調用後立即執行。我們稱之為計時事件。
- 過一段時間之後觸發
- 每隔一段時間觸發一次
案例:過一段時間之後觸發(一次)3秒觸發一次,可以取消定時任務,就不會進行執行
<script>
function func1() {
alert(123)
}
// 毫秒為單位 3秒之後自動執行func1函數
let t = setTimeout(func1,3000);
// 取消定時任務 如果你想要清除定時任務 需要提前用變數指代定時任務
clearTimeout(t)
</script>
限制每隔3秒觸發執行一次,九秒後觸發 停止執行。
<script>
function func2() {
alert(123)
}
function show(){
let t = setInterval(func2,3000); // 每隔3秒執行一次
function inner(){
clearInterval(t) // 清除定時器
}
setTimeout(inner,9000) // 9秒中之後觸發/執行
}
show()
</script>
DOM (Document Object Model)文檔對象模型
DOM 是一套對文檔的內容進行抽象和概念化的方法。
當網頁被載入時,瀏覽器會創建頁面的文檔對象模型(Document Object Model)。
HTML DOM 模型被構造為對象的數。
DOM標準規定HTML文檔中的每個成分都是一個節點(node)
文檔節點(document對象):代表整個文檔
元素節點(element 對象):代表一個元素(標簽)
文本節點(text對象):代表元素(標簽)中的文本
屬性節點(attribute對象):代表一個屬性,元素(標簽)才有屬性
註釋是註釋節點(comment對象)
所有的標簽都可以稱之為是節點
查找標簽
當我們的js文件中涉及到了查找標簽的時候,確保能找到該標簽,我們要把js文件放入body裡面最下麵,因為代碼是向下走,走到最下麵的時候,說明所有涉及到的標簽都已經存在了,就可以使用了,不會存在找不到的情況
id查找 類查找 標簽查找(直接查找)
document.getElementById()
根據id值查找標簽 結果直接是標簽對象本身
document.getElementsByClassName()
根據class值查找標簽 結果是數組類型
document.getElementsByTagName()
根據標簽名查找標簽 結果是數組類型
代碼練習
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="d2">div
<div>div>div</div>
<p class="c1">div>p
<span>div>p>span</span>
</p>
<p>div>p</p>
</div>
<div>div+div</div>
</body>
</html>
1.id查詢
註意三個方法的返回值是不一樣的
document.getElementById('d1') # id查詢(唯一)
輸出結果:
<div id="d1">…</div> // id不存在的話返回null
2.類查詢(多個標簽對象返回數組)
document.getElementsByClassName('c1') # 返回數組
輸出結果:
HTMLCollection(2) [div.c1, p.c1]
註意:
Element與Elements區別
Element:代表查詢單個元素
Elements: 代表查詢多個元素
3.標簽查詢(多個標簽對象返回 數組)
document.getElementsByTagName('div') # 數組
輸出結果:
HTMLCollection(3) [div#d1, div, div, d1: div#d1]
索引取值方法(獲取標簽數組內容)
document.getElementsByTagName('div')[1]
變數名 存儲方法
let divEle = document.getElementsByTagName('div')[1]
# 列印變數
divEle
輸出結果:
<div class="c1">div</div>
註意:(存儲變數名
當你用變數名指代標簽對象的時候 一般情況下都推薦你書寫成(見名知意)
以下示例:
xxxEle
divEle
aEle
pEle
ps:動態創建 臨時有效 非永久
間接查找(熟悉)
parentElement 父節點標簽元素
children 所有子標簽
firstElementChild 第一個子標簽元素
lastElementChild 最後一個子標簽元素
nextElementSibling 下一個兄弟標簽元素
previousElementSibling 上一個兄弟標簽元素
1.生成變數名(存儲變數名)
let divEle = document.getElementById('d1')
2.拿父節點(找父標簽)
let divEle = document.getElementById('d1')
divEle.parentElement
3.找所有的子標簽
divEle.children
返回結果:
HTMLCollection(3) [p, span, p]
4.找第一個孩子
divEle.firstElementChild
節點操作
1.需求
1.通過DOM操作動態的創建a標簽
2.並且給標簽加屬性
3.最後將a標簽追加到div標簽尾部文本中
2.創建標簽
臨時操作(刷新丟失)
1.創建標簽
let XXXEle = document.createElement('標簽名')
2.添加預設屬性值
XXXEle.id = 'id值'
3.添加內部文本
XXXEle.innerText = '內部文本'
4.尾部添加
divEle.append(XXXEle)
3.屬性操作
XXXEle.屬性 只能是預設屬性
XXXEle.setAttribute() 預設屬性、自定義屬性(可以只記住這個)
例子:
1.既可以設置自定義的屬性也可以設置預設的書寫
imgEle.setAttribute('username','jason')
undefined
2.列印標簽
imgEle
<img src="111.png" username="jason">
4.文本操作
divEle.innerText # 獲取標簽內部所有的文本
輸出結果:
"div 百度
div>p
div>span"
divEle.innerHTML # 內部文本和標簽都拿到
輸出結果:
"div
<a href="https://www.baidu.com/">百度</a><p id="d2">div>p</p>
<span>div>span</span>"
對比innerText與innerHTML區別
divEle.innerText = 'heiheihei'
"heiheihei"
divEle.innerHTML = 'hahahaha'
"hahahaha"
divEle.innerText = '<h1>heiheihei</h1>' # 不識別html標簽
"<h1>heiheihei</h1>"
divEle.innerHTML = '<h1>hahahaha</h1>' # 識別html標簽
"<h1>hahahaha</h1>"
總結它們倆個的區別
innerText: 只能獲取標簽內部的文本 設置文本的時候不識別HTML標簽
innerHTML: 文本和標簽都獲取 設置文本的時候識別HTML標簽