dom對象的innerText和innerHTML有什么區(qū)別?
答:
innerText是獲取元素中的文本部分,若有多層嵌套,則以從淺到深的方式進(jìn)行組合拼接內(nèi)容。
innerHTML是獲取HTML中的文檔結(jié)構(gòu),包括其中的所有標(biāo)簽。elem.children和elem.childNodes的區(qū)別?
答:
elem.children是獲取父節(jié)點的所有標(biāo)簽子元素
elem.childNodes是獲取父節(jié)點下的所有內(nèi)容,包括被父節(jié)點自身包裹的文本內(nèi)容查詢元素有幾種常見的方法?
答:
getElementById()通過id名去查詢元素
getElementsByClassName()通過類名去查詢含該類名的所有元素
getElementsByTagName()通過標(biāo)簽名去查詢該標(biāo)簽的所有元素
getElementsByName()通過標(biāo)簽所設(shè)置的name屬性去獲取元素
querySelector()ES5的新增查詢方法,可以在標(biāo)簽中輸入以點、#開頭或者直接標(biāo)簽名去查詢對應(yīng)id、class和標(biāo)簽的元素,返回的是具有該屬性的第一個元素。
querySelectorAll()和上面的querySelector()查詢方法一致,不同的是它是查詢所有元素如何創(chuàng)建一個元素?如何給元素設(shè)置屬性?
使用createElement()創(chuàng)建一個元素的標(biāo)簽,生成一個html元素節(jié)點
使用createTextNode()創(chuàng)建一個文本節(jié)點
使用setAttribute()來給元素設(shè)置屬性,其中傳入兩個值,第一個值為元素的屬性名,第二個值是定義的值元素的添加、刪除?
答:
使用appendChild()將傳入的元素添加到元素的末尾。
使用 insertBefore()將元素插入到指定元素之前
使用replaceChild()來替換元素,它接收兩個參數(shù),第一個是要插入的元素,第二個為要被替換的元素
removeChild()是用來刪除元素的,直接傳入需要刪除的元素即可
DOM0 事件和DOM2級在事件監(jiān)聽使用方式上有什么區(qū)別?
答:
DOM0事件是直接將事件以內(nèi)聯(lián)的方式寫在HTML標(biāo)簽內(nèi)部,比如:
<a href="#" onclick="console.log('clicked');">click</a>
這種方式定義的事件看起來書寫方面,但是存在缺點:
1.存在加載時間差的問題,若是用戶在其中的js部分還未加載完成時去點擊,則不會觸發(fā)事件
2.這樣的寫法讓HTML和js的耦合太過于緊密,代碼維護不方便,并且一個事件只能對應(yīng)一個元素,代碼沒有復(fù)用性
DOM2事件:有兩個方法addEventListener()和removeEventListener()
它們都接收三個參數(shù),包括事件類型、事件處理方法和布爾值,默認(rèn)布爾為false
attachEvent與addEventListener的區(qū)別?
答:
1.接收的參數(shù)數(shù)量不同:前者只接收事件類型和事件處理方法兩個參數(shù),而后者還需要接收布爾值來判斷是在捕獲階段調(diào)用事件處理程序還是在冒泡階段處理,而對于attachEvent()而言,由于IE只支持事件冒泡,所以添加的程序會被添加到事件冒泡階段;addEventListener的第一個參數(shù)指的是事件類型,而attachEvent則是接收事件處理程序名稱。
2.兼容性不同,IE并不支持addEventListener(),所以才有了attachEvent和removeEvent兩個方法來處理。
3.作用域不同,后者的作用域在元素本身,所以在其中添加this指的是觸發(fā)事件本身,而前者的作用域在全局變量內(nèi)運行,this則指向window。
4.執(zhí)行順序不同:后者按照事件的先后添加順序執(zhí)行,而前者的執(zhí)行則是不可預(yù)料的
- 解釋IE事件冒泡和DOM2事件傳播機制?
答:
IE事件冒泡:從發(fā)生事件的位置,一次向上冒泡,直到Document
DOM2事件傳播機制:首先進(jìn)行事件捕獲、找到目標(biāo)之后再進(jìn)行向上冒泡的操作。
如何阻止事件冒泡? 如何阻止默認(rèn)事件?
答:stopPropagation()取消事件進(jìn)一步捕獲和冒泡可以使用cancelable來查看默認(rèn)時間是否可以被阻止,如果查詢結(jié)果為true
,可以使用preventDefault()來阻止默認(rèn)事件。