初識(shí)JavaScript-DOM

一、BOM&DOM

1. BOM

BOM 是瀏覽器對(duì)象模型,就可以理解成是當(dāng)前瀏覽器打開(kāi)的窗口

window對(duì)象 就是 BOM

通過(guò)window對(duì)象 可以操作瀏覽器本身 它里面提供了一些操作當(dāng)前瀏覽器的對(duì)象和方法

1.1. 各種彈框:

window.alert('消息框')

window.prompt('輸入框')

window.confirm('確認(rèn)框')

1.2. 打開(kāi)和關(guān)閉窗口:

open()方法,打開(kāi)新的窗口

window.open('http://baidu.com')

close()方法,關(guān)閉當(dāng)前窗口

window.close()

1.3. 通用方法

window.parseInt('123') ????//將字符串的'123',強(qiáng)轉(zhuǎn)為整型的123

window.parseFloat('12.12') ????//將字符串的'12.12',強(qiáng)轉(zhuǎn)為浮點(diǎn)型的12.12

window.isNaN('abc') ????//判斷'abc',不是數(shù)值數(shù)據(jù),成立返回true

1.4. 定時(shí)器方法

1. 指定毫秒后,執(zhí)行的定時(shí)器

window.setTimeout()

setTimeout(() => {

????// 跳轉(zhuǎn)到新的地址欄

????window.location.

????// 刷新當(dāng)前窗口

????// window.location.reload() ?// 刷新

}, 5000)

2. 每隔指定的毫秒后,執(zhí)行的定時(shí)器

window.setInterval()

1.5. 常用屬性

location屬性:

location是window對(duì)象的屬性,該屬性用于設(shè)置網(wǎng)頁(yè)的地址欄

location.href屬性 表示跳轉(zhuǎn),當(dāng)前瀏覽器的地址欄發(fā)生了跳轉(zhuǎn)

其實(shí)超鏈接標(biāo)簽的內(nèi)部就是對(duì)location.href屬性的封裝

window.location.href = 'http://baidu.com'

location.reload()方法 表示刷新當(dāng)前地址欄(刷新當(dāng)前窗口

window.location.reload()

history屬性:

history是window對(duì)象的屬性,該屬性用于設(shè)置網(wǎng)頁(yè)的瀏覽歷史記錄

forward()前進(jìn)方法

window.history.forward()

back()后退方法

window.history.back()

go(number n)方法,既可以實(shí)現(xiàn)前進(jìn),也可以實(shí)現(xiàn)后退

// n為正整數(shù)時(shí)前進(jìn)n次,為負(fù)整數(shù)時(shí)后退|n|次

window.history.go(1) //前進(jìn)一次

window.history.go(3) //前進(jìn)三次

window.history.go(-1) //后退一次

window.history.go(-3) //后退三次

2. DOM

DOM 文檔對(duì)象模型,就是當(dāng)前網(wǎng)頁(yè)里面的所有內(nèi)容

因?yàn)榫W(wǎng)頁(yè)是在瀏覽器中顯示的,整個(gè)瀏覽器是BOM,所以DOM其實(shí)是BOM的一部分

BOM 就是 window對(duì)象?

DOM 就是 document對(duì)象

使用DOM獲取網(wǎng)頁(yè)元素:

如果該元素,是網(wǎng)頁(yè)的必備元素,而且只能有一個(gè),可以通過(guò)document對(duì)象直接獲取。

比如:head,title,body? (頭部,標(biāo)題,主體)

document.body.style.border = "1px solid #ccc"

document.title = 'helloworld'

更多的時(shí)候,我要需要獲取網(wǎng)頁(yè)中的指定元素,這就需要專(zhuān)門(mén)的方法來(lái)獲取了。

getElementById()方法,根據(jù)元素的id屬性值來(lái)獲取指定的元素。

注意:如果網(wǎng)頁(yè)中id屬性值重復(fù),只獲取第一個(gè)

getElementsByTagName()方法,根據(jù)元素的標(biāo)簽名獲取所有該元素。

getElementsByClassName()方法,根據(jù)元素的類(lèi)選擇器名稱(chēng)獲取所有該元素。

getElementsByName()方法,根據(jù)元素的name屬性值獲取所有該元素。


簡(jiǎn)單的封裝一下:

// 傳一個(gè)id屬性值,返回一個(gè)包含所有以該參數(shù)值為id值的元素的集合對(duì)象

function $(id) {

????return document.getElementById(id)

}

querySelector()方法,根據(jù)選擇器的名稱(chēng)返回元素,如果有多個(gè)元素,只返回第一個(gè)元素。

querySelectorAll()方法,根據(jù)選擇器的名稱(chēng)返回所有的元素。

注意:querySelectorAll()方法,返回的是集合對(duì)象,不是數(shù)組對(duì)象。可以利用展開(kāi)運(yùn)算符,將集合對(duì)象轉(zhuǎn)為數(shù)組對(duì)象。

轉(zhuǎn)為數(shù)組對(duì)象后,就可以使用數(shù)組相關(guān)的方法了。

let divs2 = [...divs]

querySelector()和querySelectorAll()方法里面也可以寫(xiě)所有的css選擇器。

3. 操作DOM元素的內(nèi)容和樣式

操作DOM的樣式,有多種方式:

????1. 通過(guò)style屬性直接設(shè)置

????2. 通過(guò)className屬性設(shè)置類(lèi)選擇器

????3. 也可以通過(guò)classList屬性添加多個(gè)類(lèi)選擇器

操作DOM的內(nèi)容:

????1. innerText屬性,用于獲取 和 操作 DOM的文本內(nèi)容。

????2. innerHTML屬性,用于獲取 和 操作 DOM的HTML內(nèi)容。

4. 操作DOM元素的屬性

獲取和設(shè)置標(biāo)簽自帶的屬性(原生屬性),直接點(diǎn)

let src = img.src //src是圖片標(biāo)簽的原生屬性

獲取和設(shè)置標(biāo)簽自定義的屬性,需要通過(guò)getAttribute()和setAttribute()方法

setAttribute()方法,設(shè)置元素的屬性值,需要傳兩個(gè)參數(shù)屬性名和屬性值

getAttribute()方法,獲取元素的屬性值,只需要傳一個(gè)參數(shù)屬性名

5. 創(chuàng)建和刪除DOM元素

createElement()方法,用于創(chuàng)建DOM元素

appendChild()方法,用于在當(dāng)前DOM元素中添加子元素

刪除元素有兩種寫(xiě)法:

????1. 自刪?

? ??????remove()方法,是元素刪除自己

????2. 通過(guò)父級(jí)刪除子級(jí)?

????????removeChild()方法,是刪除元素里面指定的子元素

補(bǔ)充1:onclick點(diǎn)擊事件,on表示當(dāng),click表示點(diǎn)擊

補(bǔ)充2:parentElement和parentNode屬性,返回父級(jí)元素

二、鼠標(biāo)事件

1. 鼠標(biāo)事件

// 點(diǎn)擊事件

onclick

// 雙擊事件

ondblclick

// 鼠標(biāo)右鍵點(diǎn)擊事件

oncontextmenu


// 鼠標(biāo)進(jìn)入事件

// onmouseover 比 onmouseenter 先執(zhí)行

onmouseenter

onmouseover

// 鼠標(biāo)離開(kāi)事件

// onmouseout 比 onmouseleave 先執(zhí)行

onmouseleave

onmouseout

注意:如果元素里面存在子元素,鼠標(biāo)在元素中移動(dòng)時(shí)會(huì)反復(fù)觸發(fā) onmouseover 和 onmouseout


// 鼠標(biāo)移動(dòng)事件

onmousemove

// 鼠標(biāo)按下事件

onmousedown

// 鼠標(biāo)彈起事件

onmouseup

2. 視口寬高

window.innerWidth 返回視口寬度

window.innerHeight 返回視口高度

3. 案例

購(gòu)物車(chē)

????復(fù)選框全選(checked屬性,返回復(fù)選框的狀態(tài))

????購(gòu)物車(chē)+復(fù)選框全選

????點(diǎn)擊div消失

三、焦點(diǎn)事件&阻止默認(rèn)行為

1. 焦點(diǎn)事件

獲得焦點(diǎn)事件

onfocus

失去焦點(diǎn)事件

onblur

2. 阻止默認(rèn)行為

e.preventDefault()

比如:阻止超鏈接跳轉(zhuǎn),阻止右鍵點(diǎn)擊事件

3. 案例

1. 拖動(dòng)框效果

dom.offsetLeft 獲取元素的默認(rèn)左邊距

dom.offsetTop 獲取元素的默認(rèn)上邊距

window.innerWidth 視口寬度

window.innerHeight 視口高度

dom.offsetWidth 獲取元素可見(jiàn)寬度(width+border+padding)

dom.offsetHeight 獲取元素可見(jiàn)高度(height+border+padding)

e.pageX 鼠標(biāo)指針到X軸坐標(biāo)

e.pageY 鼠標(biāo)指針到Y(jié)軸坐標(biāo)

2. 右鍵菜單

e.target 獲取具體的元素

e.preventDefault() 阻止默認(rèn)行為

3. 選項(xiàng)卡

classList.remove() 移除樣式

classList.add() 添加樣式

四、鍵盤(pán)事件

1. 鍵盤(pán)事件

onkeydown 按鍵按下事件

onkeypress 按鍵產(chǎn)生字符事件

onkeyup 按鍵彈起事件

e.keyCode 返回按鍵碼

注意:注冊(cè)事件時(shí)要加on,觸發(fā)時(shí)不需要on

2.案例

1. 打字游戲

2. 貪吃蛇

五、正則表達(dá)式

正則表達(dá)式:其實(shí)就是一種匹配規(guī)則,用于檢索字符串

定義正則表達(dá)式的兩種方式:1.直接定義????2.構(gòu)造函數(shù)定義

// 1. 直接定義

let reg1=/abc/

// 2. 構(gòu)造函數(shù)定義

let reg2 = new RegExp('abc')

let str = '歡迎學(xué)習(xí)abc正則表達(dá)式'

// test()方法,用于檢查一個(gè)字符串中,是否有滿(mǎn)足匹配規(guī)則的字符串。

console.log(reg1.test(str));

// 其實(shí)用字符串自己的includes()方法,也能解決上面的問(wèn)題

console.log(str.includes('abc'));

那么正則表達(dá)式真正強(qiáng)大的地方是它可以寫(xiě) 通配符(擁有特殊含義的字符)

1. 通配符

\w 表示:字母、數(shù)字、下劃線

\W 表示:除了字母、數(shù)字、下劃線以外的字符

\d 表示:數(shù)字

\D 表示:非數(shù)字

^ 表示:以^符號(hào)后面的第一個(gè)字符開(kāi)頭

表示:以表示:以符號(hào)前面的第一個(gè)字符結(jié)尾

{n} 表示:重復(fù)n次

{n,m} 表示:重復(fù)n到m次

[xyz] 表示:其中任意一個(gè)字符

+ 表示:重復(fù)前一項(xiàng)1次或多次 等價(jià)于 {1,}

* 表示:重復(fù)前一項(xiàng)0次或多次 等價(jià)于 {0,}

? 表示:重復(fù)前一項(xiàng)0次或1次 等價(jià)于 {0,1}

. 表示:除了換行符以外的任意一個(gè)字符

\. 表示:.字符 ^ 表示:^ \表示:表示:

可以用()將多個(gè)字符作為一個(gè)整體

\w 等價(jià)于 [0-9a-zA-Z_]

| 表示:或者

[\u4E00-\u9FA5] 是常用漢字的unicode編碼范圍

2. 使用正則表達(dá)式驗(yàn)證表單

驗(yàn)證學(xué)生的信息

3. 正則表達(dá)式配合字符串的方法

1. replace()方法

????默認(rèn)情況下,replace()方法,只會(huì)替換字符串中匹配第一段內(nèi)容

????使用正則表達(dá)式,添加全局匹配修飾符g,可以替換匹配全部內(nèi)容

????使用正則表達(dá)式,添加忽略大小寫(xiě)修飾符i,在匹配內(nèi)容時(shí)會(huì)忽略大小寫(xiě)

2. search()方法

????可以通過(guò)正則表達(dá)式查找位置

六、事件其他

1. 阻止事件冒泡

默認(rèn)情況下,觸發(fā)子元素的事件時(shí)會(huì)同時(shí)觸發(fā)父元素相同的事件,這就叫做事件冒泡

e.stopPropagation() ????// 阻止事件冒泡

e.preventDefault() ????// 取消默認(rèn)行為

2. 添加事件的幾種方式

????1. 在元素中通過(guò)onXXX定義事件,指定一個(gè)事件方法

????2. 先獲取元素,再給元素綁定事件

????3. 通過(guò)addEventListener方法,給元素注冊(cè)事件,傳遞兩個(gè)參數(shù)事件名和事件方法

????4. 通過(guò)removeEventListener方法,移除指定事件方法,傳遞兩個(gè)參數(shù)事件名和事件方法

3. 頁(yè)面的加載事件

1. window.onload頁(yè)面加載事件

????頁(yè)面的加載事件,該事件會(huì)在頁(yè)面中的所有內(nèi)容都加載完畢后執(zhí)行

????注意:所有內(nèi)容包括:標(biāo)簽結(jié)構(gòu),樣式文件,圖片文件,音頻文件,視頻文件...

????如果網(wǎng)頁(yè)內(nèi)容過(guò)大,會(huì)導(dǎo)致該事件延遲執(zhí)行

????window.onload = function() {

????????alert('頁(yè)面加載完成!')

????}

2. DOMContentLoaded頁(yè)面加載事件

????只要頁(yè)面中的DOM結(jié)構(gòu)加載完畢后,就會(huì)立即執(zhí)行

????注意:該事件只能采用事件監(jiān)聽(tīng)的方式添加,沒(méi)有提供快捷方式

????window.addEventListener('DOMContentLoaded', function() {

????????alert('頁(yè)面結(jié)構(gòu)加載完畢!')

????})

七、AJAX & JSON

AJAX = Asynchronous JavaScript and XML(異步的 JavaScript 和 XML)

AJAX技術(shù) 不需要刷新頁(yè)面的情況下,就可以產(chǎn)生局部刷新的效果

最初AJAX技術(shù)操作的是XML標(biāo)簽,現(xiàn)在絕大多數(shù)情況下操作的是JSON格式的字符串

1. json格式數(shù)據(jù)

// json對(duì)象

// 注意:對(duì)象的屬性名,必須要雙引號(hào)引起來(lái)

let obj={"name":"張三","age":20,"gender":"男"}

// json數(shù)組

let arr=[{"name":"張三","age":20,"gender":"男"},{"name":"李四","age":22,"gender":"女"}]

2. AJAX對(duì)象

// 01. 創(chuàng)建xhr對(duì)象 (原生ajax對(duì)象)

let xhr = new XMLHttpRequest()

// 02. 初始化請(qǐng)求(GET請(qǐng)求,POST請(qǐng)求)

// 第一個(gè)參數(shù)是請(qǐng)求方式:比如GET,第二個(gè)參數(shù)是請(qǐng)求地址:比如192.168.11.12:81/Server/List

xhr.open('GET','./data/koubei.json')

// 03. 發(fā)送請(qǐng)求

xhr.send()

// 04. 監(jiān)聽(tīng)讀取狀態(tài)改變事件

xhr.onreadystatechange = function() {

????// 請(qǐng)求已經(jīng)完成

????if(xhr.readyState === 4){

????????// 請(qǐng)求狀態(tài)為成功

? ? ? ? if(xhr.status === 200){

????????????// xhr.responseText 返回響應(yīng)體,它是一個(gè)json格式的字符串

????????????// 我們需要將該字符串轉(zhuǎn)為js對(duì)象

????????????let data = JSON.parse(xhr.responseText)

????????}

????}

}

readyState讀取狀態(tài)

0: 請(qǐng)求未發(fā)送

1:服務(wù)器連接已建立(請(qǐng)求已經(jīng)發(fā)送)

2:請(qǐng)求已接收(服務(wù)器已經(jīng)接收到該請(qǐng)求)

3:請(qǐng)求處理中(服務(wù)器正則準(zhǔn)備你要的數(shù)據(jù))

4:請(qǐng)求已完成,且響應(yīng)已就緒

status響應(yīng)的狀態(tài)碼

200:成功

404:請(qǐng)求資源錯(cuò)誤

500:服務(wù)器端錯(cuò)誤

3. 開(kāi)始搭建學(xué)生管理系統(tǒng)

1. 登錄頁(yè)

????GET請(qǐng)求方式的參數(shù),直接拼接在url里面

?????后面的內(nèi)容是請(qǐng)求參數(shù),就好比是在調(diào)用一個(gè)帶參數(shù)的方法一樣,需要傳參數(shù)

????多個(gè)參數(shù)用&符號(hào)隔開(kāi)

????登錄成功后,跳轉(zhuǎn)到首頁(yè):location.href = './index.html'

2. 首頁(yè)

????使用<iframe>嵌入外部頁(yè)面

????查詢(xún)?nèi)繉W(xué)生信息

八、學(xué)生管理系統(tǒng)

1. 查詢(xún)學(xué)生信息+篩選+分頁(yè)

封裝一個(gè)通用方法:function loadData(studentName,sex,pageIndex,pageSize)

2. 添加學(xué)生

將對(duì)象里面的數(shù)據(jù),轉(zhuǎn)為json字符串

JSON.stringify(對(duì)象)

將對(duì)象里面的數(shù)據(jù),轉(zhuǎn)為url字符串,寫(xiě)一個(gè)方法進(jìn)行轉(zhuǎn)換

studentNo=12345&loginPwd=123123&studentName=周杰倫

設(shè)置請(qǐng)求頭:

????1. xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded')

????2. xhr.setRequestHeader('Content-Type','application/json')

3.修改學(xué)生

????1. 先根據(jù)學(xué)號(hào)查詢(xún)指定學(xué)生

????2. 再修改該學(xué)生信息

4.刪除學(xué)生

????1. 刪除前提示用戶(hù)是否確定刪除

????2. 根據(jù)學(xué)號(hào)刪除學(xué)生信息

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容