1, DOM0 事件和DOM2級(jí)在事件監(jiān)聽使用方式上有什么區(qū)別?
DOM0事件就是把一個(gè)方法賦值給一個(gè)元素的事件處理程序?qū)傩浴?br> 它有兩種實(shí)現(xiàn)方式:一是在標(biāo)簽內(nèi)寫onclick事件吧碾;二是在JS中寫onlicke=function(){}函數(shù)烟阐。
DOM0事件只能覆蓋,不會(huì)連續(xù)觸發(fā)拧晕。
如果想要?jiǎng)h除事件處理程序隙姿,只需把相應(yīng)元素的onclick屬性賦值為null即可。DOM2定義了兩個(gè)方法:用于添加事件的addEventListener()和用于刪除事件的removeEventListener()厂捞,所有的DOM節(jié)點(diǎn)都包含這兩種方法输玷。
它們都接受三個(gè)參數(shù):要處理的事件名(如click)队丝,事件處理程序的函數(shù),和一個(gè)布爾值欲鹏。 最后一個(gè)參數(shù):如果為true机久,表示在捕獲階段調(diào)用事件處理程序;如果為false赔嚎,則表示在冒泡階段調(diào)用事件處理程序膘盖。默認(rèn)值為false。
DOM2包含3個(gè)階段:事件捕獲階段尤误、處于目標(biāo)階段和事件冒泡階段侠畔。
利用addEventListener(),我們可以為元素添加多個(gè)事件處理程序损晤,觸發(fā)時(shí)會(huì)按照添加順序依次調(diào)用践图。
2,attachEvent與addEventListener的區(qū)別沉馆?
attachEvent()和addEventListener()的區(qū)別
1码党,參數(shù)個(gè)數(shù)不相同,IE只支持事件冒泡斥黑,所以attachEvent只有兩個(gè)參數(shù)揖盘。
2,第一個(gè)參數(shù)意義不同addEventListener()第一個(gè)參數(shù)是事件類型(比如click,load),而attachEvent()的第一個(gè)參數(shù)指明的是事件處理函數(shù)名稱(onclick锌奴,onload)
3兽狭,事件處理程序的作用域不同,addEventListener()的作用域是元素本身鹿蜀,this指的是觸發(fā)元素箕慧,而attachEvent()事件處理程序會(huì)在全局變量內(nèi)運(yùn)行,this是window茴恰,所以剛才例子會(huì)返回undefined颠焦,而不是元素id
4,為一個(gè)事件添加多個(gè)事件處理程序時(shí)往枣,執(zhí)行順序不同伐庭,addEventListener()添加會(huì)按照順序執(zhí)行,而attachEvent()添加多個(gè)事件處理程序時(shí)無規(guī)律(添加的多了的話)分冈,所以添加多個(gè)的時(shí)候圾另,如果依賴函數(shù)執(zhí)行順序,需要自己處理雕沉。
3集乔,解釋IE事件冒泡和DOM2事件傳播機(jī)制?
1坡椒,IE的事件冒泡:事件開始時(shí)由最具體的元素接收扰路,然后逐級(jí)向上傳播到較為不具體的元素尤溜。
2,Netscape的事件捕獲:不太具體的節(jié)點(diǎn)更早接收事件幼衰,而最具體的元素最后接收事件,和時(shí)間冒泡相反
3缀雳,DOM事件流:DOM2級(jí)事件規(guī)定事件流包括三個(gè)階段渡嚣,事件部或階段,處于目標(biāo)階段肥印,事件冒泡階段识椰,首先發(fā)生的是事件捕獲,為截取事件提供機(jī)會(huì)深碱,然后是目標(biāo)接收事件腹鹉,最后是冒泡階段。
4敷硅,如何阻止事件冒泡功咒? 如何阻止默認(rèn)事件?
- 取消事件冒泡 e.stopPropagation()
var btn = document.querySelector('#btn');
var box = document.querySelector('.box');
box.addEventListener('click',function (e) {
e.stopPropagation();//阻止了事件的繼續(xù)冒泡
})
- 取消默認(rèn)事件
<a >link</a>
var link = document.querySelector('a');
link.addEventListener('click',function(e) {
e.preventDefault(); // 阻止了默認(rèn)的跳轉(zhuǎn)
})
5绞蹦,有如下代碼力奋,要求當(dāng)點(diǎn)擊每一個(gè)元素li時(shí)控制臺(tái)展示該元素的文本內(nèi)容。不考慮兼容
<ul class="ct">
<li>這里是</li>
<li>DeeJay</li>
<li>陜西西安</li>
</ul>
<script>
</script>
<ul class="ct">
<li>這里是</li>
<li>DeeJay</li>
<li>陜西西安</li>
</ul>
<script>
var ulNode = document.querySelector('.ct');
var liNodes = document.querySelectorAll('li');
// 使用事件代理
ulNode.addEventListener('click',function (e){
var target = e.target;
if (target.tagName.toLowerCase() === 'li') {
console.log(target.innerText);
}
})
// 不用事件代理
// liNodes.forEach(function (node) {
// node.addEventListener('click',function () {
// console.log(this.innerText);
// })
// })
</script>
6,補(bǔ)全代碼幽七,要求:
- 當(dāng)點(diǎn)擊按鈕開頭添加時(shí)在<li>這里是</li>元素前添加一個(gè)新元素景殷,內(nèi)容為用戶輸入的非空字符串;當(dāng)點(diǎn)擊結(jié)尾添加時(shí)在最后一個(gè) li 元素后添加用戶輸入的非空字符串.
- 當(dāng)點(diǎn)擊每一個(gè)元素li時(shí)控制臺(tái)展示該元素的文本內(nèi)容澡屡。
<ul class="ct">
<li>這里是</li>
<li>DeeJay</li>
<li>陜西西安</li>
</ul>
<input class="ipt-add-content" placeholder="添加內(nèi)容"/>
<button id="btn-add-start">開頭添加</button>
<button id="btn-add-end">結(jié)尾添加</button>
<script>
</script>
<script>
var ulNode = document.querySelector('.ct');
var liNodes = document.querySelectorAll('li');
var input = document.querySelector('.ipt-add-content');
var btnS = document.querySelector('#btn-add-start');
var btnE = document.querySelector('#btn-add-end');
ulNode.addEventListener('click',function (e) {
if (e.target.tagName.toLowerCase() === 'li') {
console.log(e.target.innerText);
}
})
btnS.addEventListener('click',function () {
var text = document.createElement('li');
if (input.value.length == 0) {
alert('請輸入內(nèi)容');
}
else {
text.innerText = input.value;
ulNode.insertBefore(text,ulNode.firstChild);
}
})
btnE.addEventListener('click',function () {
var text = document.createElement('li');
if (input.value.length == 0) {
alert('請輸入內(nèi)容');
}
else {
text.innerText = input.value;
ulNode.appendChild(text);
}
})
</script>
7猿挚,補(bǔ)全代碼,要求:當(dāng)鼠標(biāo)放置在li元素上驶鹉,會(huì)在img-preview里展示當(dāng)前l(fā)i元素的data-img對應(yīng)的圖片绩蜻。
<ul class="ct">
<li data-img="1.png">鼠標(biāo)放置查看圖片1</li>
<li data-img="2.png">鼠標(biāo)放置查看圖片2</li>
<li data-img="3.png">鼠標(biāo)放置查看圖片3</li>
</ul>
<div class="img-preview"></div>
<script>
</script>
<ul class="ct">
<li data-img="http://cdn.jirengu.com/book.jirengu.com/img/1.jpg">鼠標(biāo)放置查看圖片1</li>
<li data-img="http://cdn.jirengu.com/book.jirengu.com/img/2.jpg">鼠標(biāo)放置查看圖片2</li>
<li data-img="http://cdn.jirengu.com/book.jirengu.com/img/3.jpg">鼠標(biāo)放置查看圖片3</li>
</ul>
<div class="img-preview"></div>
<script>
var ulNode = document.querySelector('.ct');
var liNodes = document.querySelectorAll('li');
var show = document.querySelector('.img-preview');
liNodes.forEach(function (node) {
node.addEventListener('mouseenter',function () {
show.innerHTML = '![]( '+ this.getAttribute('data-img')+ ' )';
})
node.addEventListener('mouseleave',function () {
show.innerHTML = '<div class="img-preview"></div>';
})
})
</script>