應(yīng)用:tab 欄切換
H5自定義屬性
自定義屬性目的:是為了保存并使用數(shù)據(jù)。有些數(shù)據(jù)可以保存到頁面中而不用保存到數(shù)據(jù)庫中。
自定義屬性獲取是通過getAttribute(‘屬性’) 獲取。
但是有些自定義屬性很容易引起歧義,不容易判斷是元素的內(nèi)置屬性還是自定義屬性。
H5給我們新增了自定義屬性:
設(shè)置H5自定義屬性
H5規(guī)定自定義屬性data-開頭做為屬性名并且賦值。
比如
或者使用 JS 設(shè)置
element.setAttribute(‘data-index’, 2)
獲取H5自定義屬性
兼容性獲取 element.getAttribute(‘data-index’);
H5新增 element.dataset.index 或者 element.dataset[‘index’] ie 11才開始支持
h5新增的獲取自定義屬性的方法 它只能獲取data-開頭的
dataset 是一個(gè)集合里面存放了所有以data開頭的自定義屬性
如果自定義屬性里面有多個(gè)-鏈接的單詞,我們獲取的時(shí)候采取 駝峰命名法
console.log(div.dataset.listName);
console.log(div.dataset[‘listName’]);
節(jié)點(diǎn)操作
1. 父級節(jié)點(diǎn)
node.parentNode
parentNode 屬性可返回某節(jié)點(diǎn)的父節(jié)點(diǎn),注意是最近的一個(gè)父節(jié)點(diǎn)
如果指定的節(jié)點(diǎn)沒有父節(jié)點(diǎn)則返回 null
2. 子節(jié)點(diǎn)
parentNode.childNodes(標(biāo)準(zhǔn))
parentNode.childNodes 返回包含指定節(jié)點(diǎn)的子節(jié)點(diǎn)的集合,該集合為即時(shí)更新的集合。
注意:返回值里面包含了所有的子節(jié)點(diǎn),包括元素節(jié)點(diǎn),文本節(jié)點(diǎn)等。
如果只想要獲得里面的元素節(jié)點(diǎn),則需要專門處理。 所以我們一般不提倡使用childNodes
獲取元素節(jié)點(diǎn):
var ul = document. querySelector(‘ul’);
for(var i = 0; i < ul.childNodes.length;i++) {
if (ul.childNodes[i].nodeType == 1) { ? ?// ul.childNodes[i] 是元素節(jié)點(diǎn)
console.log(ul.childNodes[i]);}
}
相當(dāng)于:
console.log(ul.children);
parentNode.children(非標(biāo)準(zhǔn)
parentNode.children 是一個(gè)只讀屬性,返回所有的子元素節(jié)點(diǎn)。它只返回子元素節(jié)點(diǎn),其余節(jié)點(diǎn)不返回
parentNode.firstChild
firstChild 返回第一個(gè)子節(jié)點(diǎn),找不到則返回null。同樣,也是包含所有的節(jié)點(diǎn)。
parentNode.lastChild
lastChild 返回最后一個(gè)子節(jié)點(diǎn),找不到則返回null。同樣,也是包含所有的節(jié)點(diǎn)。
parentNode.firstElementChild
firstElementChild 返回第一個(gè)子元素節(jié)點(diǎn),找不到則返回null
parentNode.lastElementChild
lastElementChild 返回最后一個(gè)子元素節(jié)點(diǎn),找不到則返回null。
實(shí)際開發(fā)中,firstChild 和 lastChild 包含其他節(jié)點(diǎn),操作不方便,而 firstElementChild 和 lastElementChild 又有兼容性問題,那么我們?nèi)绾潍@取第一個(gè)子元素節(jié)點(diǎn)或最后一個(gè)子元素節(jié)點(diǎn)呢?
解決方案:
如果想要第一個(gè)子元素節(jié)點(diǎn),可以使用 parentNode.chilren[0]
如果想要最后一個(gè)子元素節(jié)點(diǎn),可以使用 parentNode.chilren[parentNode.chilren.length - 1]
案例:下拉菜單
兄弟節(jié)點(diǎn)
node.nextSibling
nextSibling 返回當(dāng)前元素的下一個(gè)兄弟節(jié)點(diǎn),找不到則返回null。同樣,也是包含所有的節(jié)點(diǎn)。
node.previousSibling
previousSibling 返回當(dāng)前元素上一個(gè)兄弟節(jié)點(diǎn),找不到則返回null。同樣,也是包含所有的節(jié)點(diǎn)。
node.nextElementSibling
nextElementSibling 返回當(dāng)前元素下一個(gè)兄弟元素節(jié)點(diǎn),找不到則返回null。
node.previousElementSibling
previousElementSibling 返回當(dāng)前元素上一個(gè)兄弟元素節(jié)點(diǎn),找不到則返回null。
code.nextElementSibing與previousElementSibling存在兼容性問題
創(chuàng)建節(jié)點(diǎn)
document.createElement(‘tagName’)
ocument.createElement() 方法創(chuàng)建由 tagName 指定的 HTML 元素。因?yàn)檫@些元素原先不存在,是根據(jù)我們的需求動態(tài)生成的,所以我們也稱為動態(tài)創(chuàng)建元素節(jié)點(diǎn)。
node.appendChild(child)
node.appendChild() 方法將一個(gè)節(jié)點(diǎn)添加到指定父節(jié)點(diǎn)的子節(jié)點(diǎn)列表末尾。類似于 CSS 里面的 after 偽元素。
node.insertBefore(child, 指定元素)
node.insertBefore() 方法將一個(gè)節(jié)點(diǎn)添加到父節(jié)點(diǎn)的指定子節(jié)點(diǎn)前面。類似于 CSS 里面的 before 偽元素。
案例:簡單版發(fā)布留言案例
刪除節(jié)點(diǎn)
node.removeChild(child)
node.removeChild() 方法從 DOM 中刪除一個(gè)子節(jié)點(diǎn),返回刪除的節(jié)點(diǎn)
案例:刪除留言案例
復(fù)制節(jié)點(diǎn)(克隆節(jié)點(diǎn))
node.cloneNode()
node.cloneNode() 方法返回調(diào)用該方法的節(jié)點(diǎn)的一個(gè)副本。 也稱為克隆節(jié)點(diǎn)/拷貝節(jié)點(diǎn)
注意:
如果括號參數(shù)為空或者為 false ,則是淺拷貝,即只克隆復(fù)制節(jié)點(diǎn)本身,不克隆里面的子節(jié)點(diǎn)。
如果括號參數(shù)為 true ,則是深度拷貝,會復(fù)制節(jié)點(diǎn)本身以及里面所有的子節(jié)點(diǎn)。
案例:動態(tài)生成表格
三種動態(tài)創(chuàng)建元素區(qū)別
document.write()
element.innerHTML
document.createElement()
document.write 是直接將內(nèi)容寫入頁面的內(nèi)容流,但是文檔流執(zhí)行完畢,則它會導(dǎo)致頁面全部重繪
innerHTML 是將內(nèi)容寫入某個(gè) DOM 節(jié)點(diǎn),不會導(dǎo)致頁面全部重繪
innerHTML 創(chuàng)建多個(gè)元素效率更高(不要拼接字符串,采取數(shù)組形式拼接),結(jié)構(gòu)稍微復(fù)雜
createElement() 創(chuàng)建多個(gè)元素效率稍低一點(diǎn)點(diǎn),但是結(jié)構(gòu)更清晰
總結(jié):不同瀏覽器下,innerHTML 效率要比 creatElement 高
注冊事件
給元素添加事件,稱為注冊事件或者綁定事件。
注冊事件有兩種方式:傳統(tǒng)方式和方法監(jiān)聽注冊方式
傳統(tǒng)注冊方式
利用 on 開頭的事件 onclick
<button οnclick=“alert(‘hi~’)”>
btn.onclick = function() {}
特點(diǎn): 注冊事件的唯一性
同一個(gè)元素同一個(gè)事件只能設(shè)置一個(gè)處理函數(shù),最后注冊的處理函數(shù)將會覆蓋前面注冊的處理函數(shù)
方法監(jiān)聽注冊方式
eventTarget.addEventListener(type, listener[, useCapture])
w3c 標(biāo)準(zhǔn) 推薦方式
addEventListener() 它是一個(gè)方法
IE9 之前的 IE 不支持此方法,可使用 attachEvent() 代替
特點(diǎn):同一個(gè)元素同一個(gè)事件可以注冊多個(gè)監(jiān)聽器
按注冊順序依次執(zhí)行
eventTarget.addEventListener()方法將指定的監(jiān)聽器注冊到 eventTarget(目標(biāo)對象)上,當(dāng)該對象觸發(fā)指定的事件時(shí),就會執(zhí)行事件處理函數(shù)。
該方法接收三個(gè)參數(shù):
type:事件類型字符串,比如 click 、mouseover ,注意這里不要帶 on
listener:事件處理函數(shù),事件發(fā)生時(shí),會調(diào)用該監(jiān)聽函數(shù)
useCapture:可選參數(shù),是一個(gè)布爾值,默認(rèn)是 false可以選擇是冒泡還是捕獲
刪除事件的方式
傳統(tǒng)注冊方式
eventTarget.onclick = null;
方法監(jiān)聽注冊方式
eventTarget.removeEventListener(type, listener[, useCapture]);
eventTarget.detachEvent(eventNameWithOn, callback);
事件流
事件流描述的是從頁面中接收事件的順序。
事件發(fā)生時(shí)會在元素節(jié)點(diǎn)之間按照特定的順序傳播,這個(gè)傳播過程即 DOM 事件流。
比如我們給一個(gè)div 注冊了點(diǎn)擊事件
DOM 事件流分為3個(gè)階段:
1捕獲階段
2當(dāng)前目標(biāo)階段
3冒泡階段
事件冒泡: IE 最早提出,事件開始時(shí)由最具體的元素接收,然后逐級向上傳播到到 DOM 最頂層節(jié)點(diǎn)的過程。
事件捕獲: 網(wǎng)景最早提出,由 DOM 最頂層節(jié)點(diǎn)開始,然后逐級向下傳播到到最具體的元素接收的過程。
JS 代碼中只能執(zhí)行捕獲或者冒泡其中的一個(gè)階段。
onclick 和 attachEvent 只能得到冒泡階段。
addEventListener(type, listener[, useCapture])第三個(gè)參數(shù)如果是 true,表示在事件捕獲階段調(diào)用事件處理程序;如果是 false(不寫默認(rèn)就是false),表示在事件冒泡階段調(diào)用事件處理程序。
實(shí)際開發(fā)中我們很少使用事件捕獲,我們更關(guān)注事件冒泡。
有些事件是沒有冒泡的,比如 onblur、onfocus、onmouseenter、onmouseleave
事件對象
eventTarget.onclick = function(event) {
// 這個(gè) event 就是事件對象,我們還喜歡的寫成 e 或者 evt
}
eventTarget.addEventListener(‘click’, function(event) {
// 這個(gè) event 就是事件對象,我們還喜歡的寫成 e 或者 evt
})
自我介紹一下,小編13年上海交大畢業(yè),曾經(jīng)在小公司待過,也去過華為、OPPO等大廠,18年進(jìn)入阿里一直到現(xiàn)在。
深知大多數(shù)前端工程師,想要提升技能,往往是自己摸索成長或者是報(bào)班學(xué)習(xí),但對于培訓(xùn)機(jī)構(gòu)動則幾千的學(xué)費(fèi),著實(shí)壓力不小。自己不成體系的自學(xué)效果低效又漫長,而且極易碰到天花板技術(shù)停滯不前!
因此收集整理了一份《2024年Web前端開發(fā)全套學(xué)習(xí)資料》,初衷也很簡單,就是希望能夠幫助到想自學(xué)提升又不知道該從何學(xué)起的朋友,同時(shí)減輕大家的負(fù)擔(dān)。
既有適合小白學(xué)習(xí)的零基礎(chǔ)資料,也有適合3年以上經(jīng)驗(yàn)的小伙伴深入學(xué)習(xí)提升的進(jìn)階課程,基本涵蓋了95%以上前端開發(fā)知識點(diǎn),真正體系化!
由于文件比較大,這里只是將部分目錄大綱截圖出來,每個(gè)節(jié)點(diǎn)里面都包含大廠面經(jīng)、學(xué)習(xí)筆記、源碼講義、實(shí)戰(zhàn)項(xiàng)目、講解視頻,并且后續(xù)會持續(xù)更新
如果你覺得這些內(nèi)容對你有幫助,可以添加V獲?。簐ip1024c (備注前端)
判斷
回到題目,如果你真想檢驗(yàn)一個(gè)人的水平。第一步先考察一下基本的編程基礎(chǔ),問幾個(gè)基本的編程問題,可以和前端相關(guān)也可以無關(guān)。比如垃圾收集大致是怎么做的,setTimeout 大致做了什么(說會在另一個(gè)線程里執(zhí)行回調(diào)的直接斃掉)。
第二步考察一下知識面,問問http、tcp的基本知識,dns是怎么工作的,或者常用框架的實(shí)現(xiàn)原理,看看候選人是不是除了自己的一畝三分地什么都不關(guān)心。
第三步考察hold業(yè)務(wù)邏輯的能力,從一個(gè)簡單的注冊頁,或者查詢頁開始,先讓說下代碼的基本架構(gòu),然后需求、性能、可靠性、安全層層加碼,看看能不能很快的反饋出解決方案。能對答如流的要么做過,要么對他來說這種復(fù)雜度的東西是小case。
前三步都沒問題,基本上說明候選人已經(jīng)還行了,但是行到什么程度,不知道。如果想找比較厲害的,就增加個(gè)第四步,亮點(diǎn)項(xiàng)目考察。
總的來說,面試官要是考察思路就會從你實(shí)際做過的項(xiàng)目入手,考察你實(shí)際編碼能力,就會讓你在電腦敲代碼,看你用什么編輯器、插件、編碼習(xí)慣等。所以我們在回答面試官問題時(shí),有一個(gè)清晰的邏輯思路,清楚知道自己在和面試官說項(xiàng)目說技術(shù)時(shí)的話就好了,我整理一套前端面試題分享給大家,希望對即將去面試的小伙伴們有幫助!
tcp的基本知識,dns是怎么工作的,或者常用框架的實(shí)現(xiàn)原理,看看候選人是不是除了自己的一畝三分地什么都不關(guān)心。
第三步考察hold業(yè)務(wù)邏輯的能力,從一個(gè)簡單的注冊頁,或者查詢頁開始,先讓說下代碼的基本架構(gòu),然后需求、性能、可靠性、安全層層加碼,看看能不能很快的反饋出解決方案。能對答如流的要么做過,要么對他來說這種復(fù)雜度的東西是小case。
前三步都沒問題,基本上說明候選人已經(jīng)還行了,但是行到什么程度,不知道。如果想找比較厲害的,就增加個(gè)第四步,亮點(diǎn)項(xiàng)目考察。
總的來說,面試官要是考察思路就會從你實(shí)際做過的項(xiàng)目入手,考察你實(shí)際編碼能力,就會讓你在電腦敲代碼,看你用什么編輯器、插件、編碼習(xí)慣等。所以我們在回答面試官問題時(shí),有一個(gè)清晰的邏輯思路,清楚知道自己在和面試官說項(xiàng)目說技術(shù)時(shí)的話就好了,我整理一套前端面試題分享給大家,希望對即將去面試的小伙伴們有幫助!
[外鏈圖片轉(zhuǎn)存中…(img-wpWB7fbG-1711641048450)]文章來源:http://www.zghlxwxcb.cn/news/detail-845811.html
[外鏈圖片轉(zhuǎn)存中…(img-UJmguBfI-1711641048451)]文章來源地址http://www.zghlxwxcb.cn/news/detail-845811.html
到了這里,關(guān)于JavaScript Web APIs2(2),GitHub標(biāo)星1w的前端架構(gòu)師必備技能的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!