js學習 六、瀏覽器記錄
六、瀏覽器
6.1、瀏覽器物件
windows
充當全域性作用域,而且表示瀏覽器視窗。
window
物件有innerWidth
和innerHeight
屬性,可以獲取瀏覽器視窗的內部寬度和高度。內部寬高是指除去選單欄、工具欄、邊框等佔位元素後,用於顯示網頁的淨寬高。
navigator
navigator
物件表示瀏覽器的資訊,最常用的屬性包括:
- navigator.appName:瀏覽器名稱;
- navigator.appVersion:瀏覽器版本;
- navigator.language:瀏覽器設定的語言;
- navigator.platform:作業系統型別;
- navigator.userAgent:瀏覽器設定的
User-Agent
字串。
不建議使用以上的屬性進行判斷和編寫程式碼 因為是使用者可以更改的
screen
screen
物件表示螢幕的資訊,常用的屬性有:
- screen.width:螢幕寬度,以畫素為單位;
- screen.height:螢幕高度,以畫素為單位;
- screen.colorDepth:返回顏色位數,如8、16、24。
location
location
物件表示當前頁面的URL資訊。
location
http://localhost:63342/JavaScript/lesson01/one.html?_ijt=h4md6ke1rnp906690ha6hvbfjr#TOP
location.protocol
"http:"
location.host
"localhost:63342"
location.port
"63342"
location.pathname
"/JavaScript/lesson01/one.html"
location.search
"?_ijt=h4md6ke1rnp906690ha6hvbfjr"
location.hash
"TOP"
location.href
"http://localhost:63342/JavaScript/lesson01/one.html?_ijt=h4md6ke1rnp906690ha6hvbfjr"
location.reload()//重新整理網頁
location.assign(跳轉的URL)//跳轉網頁
document
document
物件表示當前頁面。由於HTML在瀏覽器中以DOM形式表示為樹形結構,document
物件就是整個DOM樹的根節點。
document
的title
屬性是從HTML文件中的<title>xxx</title>
讀取的,但是可以動態改變:
document
物件還有一個cookie
屬性,可以獲取當前頁面的Cookie。
Cookie是由伺服器傳送的key-value標示符。因為HTTP協議是無狀態的,但是伺服器要區分到底是哪個使用者發過來的請求,就可以用Cookie來區分。當一個使用者成功登入後,伺服器傳送一個Cookie給瀏覽器,例如user=ABC123XYZ(加密的字串)...
,此後,瀏覽器訪問該網站時,會在請求頭附上這個Cookie,伺服器根據Cookie即可區分出使用者。
history
history
物件儲存了瀏覽器的歷史記錄,JavaScript可以呼叫history
物件的back()
或forward ()
,相當於使用者點選了瀏覽器的“後退”或“前進”按鈕。
任何情況,你都不應該使用history
這個物件了。
6.2、操作BOM物件
BOM:瀏覽器物件模型
始終記住DOM是一個樹形結構。操作一個DOM節點實際上就是這麼幾個操作:
- 更新:更新該DOM節點的內容,相當於更新了該DOM節點表示的HTML的內容;
- 遍歷:遍歷該DOM節點下的子節點,以便進行進一步操作;
- 新增:在該DOM節點下新增一個子節點,相當於動態增加了一個HTML節點;
- 刪除:將該節點從HTML中刪除,相當於刪掉了該DOM節點的內容以及它包含的所有子節點。
要操作一個DOM節點,就必須先獲得者DOM節點
由於ID在HTML文件中是唯一的,所以document.getElementById()
可以直接定位唯一的一個DOM節點。document.getElementsByTagName()
和document.getElementsByClassName()
總是返回一組DOM節點。要精確地選擇DOM,可以先定位父節點,再從父節點開始選擇,以縮小範圍。
var ID = document.getElementById('要選擇的ID');
// 先定位ID為'test-table'的節點,再返回其內部所有tr節點:
var trs = document.getElementById('test-table').getElementsByTagName('tr');
// 先定位ID為'test-div'的節點,再返回其內部所有class包含red的節點:
var reds = document.getElementById('test-div').getElementsByClassName('red');
// 獲取節點test下的所有直屬子節點:
var cs = test.children;
// 獲取節點test下第一個、最後一個子節點:
var first = test.firstElementChild;
var last = test.lastElementChild;
更新節點
可以直接修改節點的文字,方法有兩種
- 一種是修改
innerText
或textContent
屬性,這樣可以自動對字串進行HTML編碼,保證無法設定任何HTML標籤: - 兩者的區別在於讀取屬性時,
innerText
不返回隱藏元素的文字,而textContent
返回所有文字。
elementById.innerText= "124";
- 一種是修改
innerHTML
屬性,這個方式非常強大,不但可以修改一個DOM節點的文字內容,還可以直接通過HTML片段修改DOM節點內部的子樹:
elementById.innerHTML = '<strong>123</strong>';
修改CSS也是經常需要的操作。DOM節點的style
屬性對應所有的CSS,可以直接獲取或設定。因為CSS允許font-size
這樣的名稱,但它並非JavaScript有效的屬性名,所以需要在JavaScript中改寫為駝峰式命名fontSize
、屬性使用字串:
elementById.style.color = "red";
elementById.style.fontSize = '20px'
刪除節點
刪除節點的步驟:先獲取父節點,呼叫父節點的removeChild
把自己刪掉:
<div id="id1">
<p id="p1">as</p>
</div>
<script>
'use strict'
var elementById = document.getElementById("id1");
var father = p1.parentElement;
father.removeChild(p1);
</script>
注意到刪除後的節點雖然不在文件樹中了,但其實它還在記憶體中,可以隨時再次被新增到別的位置。
<div id="father">
<p>1</p>
<p>2</p>
</div>
var father = document.getElementById('father');
parent.removeChild(father.children[0]);
parent.removeChild(father.children[1]); // 瀏覽器報錯
瀏覽器報錯:father.children[1]不是一個有效的節點。原因就在於,當
1
節點被刪除後,
father.children
的節點數量已經從2變為了1,索引
[1]`已經不存在了。
因此,刪除多個節點時,要注意children
屬性時刻都在變化。
插入節點
如果這個DOM節點是空的,例如,<div></div>
,那麼,直接使用innerHTML = '<span>child</span>'
就可以修改DOM節點的內容,相當於“插入”了新的DOM節點。
如果這個DOM節點不是空的,那就不能這麼做,因為innerHTML
會直接替換掉原來的所有子節點。
有兩個辦法可以插入新的節點。一個是使用appendChild
,把一個子節點新增到父節點的最後一個子節點。例如:
<!-- HTML結構 -->
<p id="js">JavaScript</p>
<div id="list">
<p id="se">JavaSE</p>
<p id="ee">JavaEE</p>
<p id="me">JavaME</p>
</div>
<script>
'use strict'
var js = document.getElementById('js');
var list = document.getElementById('list');
list.appendChild(js)
</script>
建立標籤
從零建立一個新的節點,然後插入到指定位置:
var newp = document.createElement('p');
newp.id = 'newp';
newp.innerText = "newp";
list.appendChild(newp);
var myscript = document.createElement('script');
myscript.setAttribute("type", "text/javascript");
list.appendChild(myscript);
insertBefore
如果我們要把子節點插入到指定的位置怎麼辦?可以使用parentElement.insertBefore(newElement, referenceElement);
,子節點會插入到referenceElement
之前。