1,dom對(duì)象的innerText和innerHTML有什么區(qū)別?
- innerText是將對(duì)象中的字符串過(guò)濾組合展示;而innerHTML則是將對(duì)象中的所有內(nèi)容都進(jìn)行展示;
- 對(duì)于鏈接,innerHTML會(huì)將其保留連接屬性,而innerText則會(huì)將鏈接轉(zhuǎn)化為字符串;
2,elem.children和elem.childNodes的區(qū)別?
elem.children:非標(biāo)準(zhǔn)型,它返回指定元素的子元素集合。只返回HTML節(jié)點(diǎn)。
-
elem.childNodes:標(biāo)準(zhǔn)型,返回指定元素的子元素集合,包括HTML屬性,所有屬性,文本??梢酝ㄟ^(guò)nodeType來(lái)判斷是那種類型的節(jié)點(diǎn),當(dāng)nodeType==1時(shí)時(shí)元素節(jié)點(diǎn),2是屬性節(jié)點(diǎn),3是文本節(jié)點(diǎn)。
<html> <head> <meta charset="utf-8"> </head> <body> <div id = "part"> <p class="part1">段落二<a href=" http://www.baidu.com ">我是鏈接</a></p> <p class="part2">段落三</p> </div> </body> <script> var parts = document.getElementById("part") parts.children // [p.part1, p.part2] parts.childNodes // [text, p.part1, text, p.part2, text] </script> </html>
3,查詢?cè)赜袔追N常見(jiàn)的方法?
document節(jié)點(diǎn)獲取
document.getElementById(' '):
返回匹配指定ID屬性的元素節(jié)點(diǎn).如果沒(méi)有發(fā)現(xiàn)匹配的節(jié)點(diǎn),則返回null。
document.getElementsByClassName(' '):
返回一個(gè)類似數(shù)組的對(duì)象(HTMLCollection類型的對(duì)象),包括了所有class名字符合指定條件的元素(搜索范圍包括本身),元素的變化實(shí)時(shí)反映在返回結(jié)果中.這個(gè)方法不僅可以在document對(duì)象上調(diào)用,也可以在任何元素節(jié)點(diǎn)上調(diào)用;
document.getElementsByTagName(' '):
返回所有指定標(biāo)簽的元素(搜索范圍包括本身).返回值是一個(gè)HTMLCollection對(duì)象,也就是說(shuō),搜索結(jié)果是一個(gè)動(dòng)態(tài)集合,任何元素的變化都會(huì)實(shí)時(shí)反映在返回的集合中.這個(gè)方法不僅可以在document對(duì)象上調(diào)用,也可以在任何元素節(jié)點(diǎn)上調(diào)用;
document.querySelector(''):
返回匹配指定的CSS選擇器的元素節(jié)點(diǎn).如果有多個(gè)節(jié)點(diǎn)滿足匹配條件,則返回第一個(gè)匹配的節(jié)點(diǎn).如果沒(méi)有發(fā)現(xiàn)匹配的節(jié)點(diǎn),則返回null;
document.querySelectorAll():
返回匹配指定的CSS選擇器的所有節(jié)點(diǎn),返回的是NodeList類型的對(duì)象.NodeList對(duì)象不是動(dòng)態(tài)集合,所以元素節(jié)點(diǎn)的變化無(wú)法實(shí)時(shí)反映在返回結(jié)果中;
document.getElementsByName():
方法用于選擇擁有name屬性的HTML元素,比如form、img、frame、embed和object,返回一個(gè)NodeList格式的對(duì)象,不會(huì)實(shí)時(shí)反映元素的變化。
document.elementFromPoint(x, y):
elementFromPoint方法的參數(shù)x和y,分別是相對(duì)于當(dāng)前窗口左上角的橫坐標(biāo)和縱坐標(biāo),單位是CSS像素。elementFromPoint方法返回位于這個(gè)位置的DOM元素,如果該元素不可返回(比如文本框的滾動(dòng)條),則返回它的父元素(比如文本框)。如果坐標(biāo)值無(wú)意義(比如負(fù)值),則返回nul
父元素節(jié)點(diǎn)獲?。?/p>
parentNode
parentElement
兄弟節(jié)點(diǎn)獲?。?/p>
nextSibling
previousSibling
通過(guò)子節(jié)點(diǎn)獲取:
childNodes
firstChild
lastChild
4,如何創(chuàng)建一個(gè)元素?如何給元素設(shè)置屬性?
創(chuàng)建元素:
document.createElement(''):
createElement方法用來(lái)生成HTML元素節(jié)點(diǎn)。
document.createTextNode(''):
createTextNode方法用來(lái)生成文本節(jié)點(diǎn),參數(shù)為所要生成的文本節(jié)點(diǎn)的內(nèi)容。
document.DocumentFragment():
createDocumentFragment方法生成一個(gè)DocumentFragment對(duì)象。DocumentFragment對(duì)象是一個(gè)存在于內(nèi)存的DOM片段,但是不
屬于當(dāng)前文檔,常常用來(lái)生成較復(fù)雜的DOM結(jié)構(gòu),然后插入當(dāng)前文檔。這樣做的好處在于,因?yàn)镈ocumentFragment不屬于當(dāng)前文檔,
對(duì)它的任何改動(dòng),都不會(huì)引發(fā)網(wǎng)頁(yè)的重新渲染,比直接修改當(dāng)前文檔的DOM有更好的性能表現(xiàn)。
屬性操作:
getAttribute():getAttribute()用于獲取元素的attribute值
createAttribute():createAttribute()方法生成一個(gè)新的屬性對(duì)象節(jié)點(diǎn),并返回它setAttribute():setAttribute()方法用于設(shè)置元素屬性
removeAttribute():removeAttribute()用于刪除元素屬性
5,元素的添加、刪除?
appendChild():在元素末尾添加元素;
insertBefore():在某個(gè)元素前插入元素;
replaceChild():替換某個(gè)元素(要插入的元素,要替換的元素);
removeChild():刪除元素;
舉例:
<body>
<div id="part">
<p class="part1">段落一<a href="#">我是鏈接</a></p>
</div>
<script>
var p = document.createElement('p');
document.body.appendChild(p); //在body最后添加了<p></p>;
添加div,給div添加class,添加內(nèi)容為hello:
<div class=wrap></div>
var node = document.createElement('div');
node.setAttribute('class','d');
node.innerHTML = "hello";
wrap.appendChild(node);
6,DOM0 事件和DOM2級(jí)在事件監(jiān)聽(tīng)使用方式上有什么區(qū)別?
-
DOM0
DOM0在事件監(jiān)聽(tīng)使用方式上,采用HTML內(nèi)鏈方式,即通過(guò)onclick 寫(xiě)在HTML標(biāo)簽里的事件<a href="#" onclick="console.log('clicked');">點(diǎn)我</a> 或者: <div id="ct"> <a class="button" href="#">點(diǎn)我</a> </div> <script> document.querySelector(".button").onclick = function(e){ console.log('click me...'); console.log(this.innerText); console.log(e); }
這種寫(xiě)法的缺點(diǎn)是不利于日后維護(hù),代碼只能使用一次,不可以重復(fù)使用。
-
DOM2
DOM2事件有兩種方法:addEventListener()和removeEventListener()。他們都返回三個(gè)參數(shù),分別是:事件類型、事件處理方法、布爾值(默認(rèn)為false,false是冒泡階段處理,true是調(diào)用階段處理)。<div id="ct"> <a class="button" href="#">點(diǎn)我</a> </div> <script> document.querySelector("#ct").addEventListener('click', function(){ console.log(this); console.log('in ct...'); },false);
7,attachEvent與addEventListener的區(qū)別?
適用的瀏覽器不同:
addEventListener適用于現(xiàn)代瀏覽器(非低版本IE瀏覽器);
attachEvent是最低版本IE瀏覽器的私有方法;參數(shù)和觸發(fā)階段不同:
addEventListener有三個(gè)參數(shù),分別是事件類型,事件處理方法,布爾值,其中布爾值可以定義處理方式在捕獲/冒泡階段觸發(fā);
true表明該事件監(jiān)聽(tīng)器綁定在捕獲階段(和目標(biāo)階段),false則表明綁定在冒泡階段(和目標(biāo)階段)且false是被默認(rèn)的選項(xiàng)。第一個(gè)參數(shù)的形式不同:
addEventListener的第一個(gè)參數(shù)是click;
attachEvent的第一個(gè)參數(shù)是onclick;this不同:
addEventListener中的this是觸發(fā)事件的元素;
attachEvent的this指代的是window;在同一個(gè)事件上綁定多個(gè)事件處理程序時(shí)的執(zhí)行順序不同:
addEventListener會(huì)按照添加順序并按照布爾值執(zhí)行;
attachEvent的執(zhí)行是無(wú)序的;
8,解釋IE事件冒泡和DOM2事件傳播機(jī)制?
<html>
<head>
<meta charset="utf-8">
</head>
<body>
<div id="ct">
<a class="button" href="#">點(diǎn)我</a>
</div>
</body>
<script>
document.querySelector(".button").onclick = function(e){
console.log('click me...');
console.log(this.innerText);
console.log(e);
}
document.querySelector("#ct").addEventListener('click', function(){
console.log(this);
console.log('in ct...');
});
</script>
</html>
-
IE事件冒泡:
IE事件冒泡是事件由第一個(gè)被觸發(fā)的元素接收,然后逐級(jí)向上傳播。
DOM2的事件傳播機(jī)制:
DOM2事件傳播,事件由最外層元素接收,然后逐層向內(nèi)傳播,這個(gè)過(guò)程為捕獲階段,當(dāng)達(dá)到目標(biāo)元素時(shí),處于目標(biāo)階段,然后事件由目標(biāo)元素向最外層開(kāi)始傳遞,這個(gè)過(guò)程稱之為冒泡階段。

捕獲階段:

9,如何阻止事件冒泡? 如何阻止默認(rèn)事件?

常規(guī)瀏覽器:
-
阻止事件冒泡:stopPropagation( )
<body> <a id="btn" >點(diǎn)我</a> <script> var btn = document.querySelector("#btn"); btn.addEventListener('click',function(e){ console.log('at btn...',e); e.stopPropagation(); //阻止事件冒泡函數(shù) }) document.body.addEventListener("click",function(e){ console.log('at body...',e); }) </script>
當(dāng)執(zhí)行到a鏈接時(shí),事件就會(huì)被阻止在a鏈接處,不會(huì)傳到body上。
-
阻止默認(rèn)事件:preventDefault( )
<body> <a id="btn" >點(diǎn)我</a> <script> var btn = document.querySelector("#btn"); btn.addEventListener('click',function(e){ console.log('at btn...',e); e.preventDefault(); //阻止默認(rèn)事件函數(shù) }) document.body.addEventListener("click",function(e){ console.log('at body...',e); }) </script>
當(dāng)點(diǎn)擊a鏈接時(shí),由于a鏈接默認(rèn)會(huì)跳轉(zhuǎn),e.preventDefault()阻止了a鏈接的跳轉(zhuǎn)。
IE瀏覽器:
-
阻止事件冒泡:
<body> <a id="btn" >點(diǎn)我</a> <script> var btn = document.querySelector('#btn'); btn.attachEvent('onclick',function(e){ console.log('at btn...',e); e.cancelBubble = true; //默認(rèn)為false,設(shè)置為true后可以取消事件冒泡 }) </script> </body> -
阻止默認(rèn)事件:
<body> <a id="btn" >點(diǎn)我</a> <script> var btn = document.querySelector('#btn'); btn.attachEvent('onclick',function(e){ console.log('at btn...',e); e.returnValue = false; //默認(rèn)為true,設(shè)置為false后可以取消事件默認(rèn)行為 }) </script> </body>
