1, DOM0 事件和DOM2級在事件監(jiān)聽使用方式上有什么區(qū)別?
DOM0事件就是把一個方法賦值給一個元素的事件處理程序?qū)傩浴?br> 它有兩種實現(xiàn)方式:一是在標(biāo)簽內(nèi)寫onclick事件;二是在JS中寫onlicke=function(){}函數(shù)。
DOM0事件只能覆蓋,不會連續(xù)觸發(fā)。
如果想要刪除事件處理程序,只需把相應(yīng)元素的onclick屬性賦值為null即可。DOM2定義了兩個方法:用于添加事件的addEventListener()和用于刪除事件的removeEventListener(),所有的DOM節(jié)點都包含這兩種方法。
它們都接受三個參數(shù):要處理的事件名(如click),事件處理程序的函數(shù),和一個布爾值。 最后一個參數(shù):如果為true,表示在捕獲階段調(diào)用事件處理程序;如果為false,則表示在冒泡階段調(diào)用事件處理程序。默認(rèn)值為false。
DOM2包含3個階段:事件捕獲階段、處于目標(biāo)階段和事件冒泡階段。
利用addEventListener(),我們可以為元素添加多個事件處理程序,觸發(fā)時會按照添加順序依次調(diào)用。
2,attachEvent與addEventListener的區(qū)別?
attachEvent()和addEventListener()的區(qū)別
1,參數(shù)個數(shù)不相同,IE只支持事件冒泡,所以attachEvent只有兩個參數(shù)。
2,第一個參數(shù)意義不同addEventListener()第一個參數(shù)是事件類型(比如click,load),而attachEvent()的第一個參數(shù)指明的是事件處理函數(shù)名稱(onclick,onload)
3,事件處理程序的作用域不同,addEventListener()的作用域是元素本身,this指的是觸發(fā)元素,而attachEvent()事件處理程序會在全局變量內(nèi)運行,this是window,所以剛才例子會返回undefined,而不是元素id
4,為一個事件添加多個事件處理程序時,執(zhí)行順序不同,addEventListener()添加會按照順序執(zhí)行,而attachEvent()添加多個事件處理程序時無規(guī)律(添加的多了的話),所以添加多個的時候,如果依賴函數(shù)執(zhí)行順序,需要自己處理。
3,解釋IE事件冒泡和DOM2事件傳播機制?
1,IE的事件冒泡:事件開始時由最具體的元素接收,然后逐級向上傳播到較為不具體的元素。
2,Netscape的事件捕獲:不太具體的節(jié)點更早接收事件,而最具體的元素最后接收事件,和時間冒泡相反
3,DOM事件流:DOM2級事件規(guī)定事件流包括三個階段,事件部或階段,處于目標(biāo)階段,事件冒泡階段,首先發(fā)生的是事件捕獲,為截取事件提供機會,然后是目標(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)點擊每一個元素li時控制臺展示該元素的文本內(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,補全代碼,要求:
- 當(dāng)點擊按鈕開頭添加時在<li>這里是</li>元素前添加一個新元素,內(nèi)容為用戶輸入的非空字符串;當(dāng)點擊結(jié)尾添加時在最后一個 li 元素后添加用戶輸入的非空字符串.
- 當(dāng)點擊每一個元素li時控制臺展示該元素的文本內(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,補全代碼,要求:當(dāng)鼠標(biāo)放置在li元素上,會在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 = '+ ' )';
})
node.addEventListener('mouseleave',function () {
show.innerHTML = '<div class="img-preview"></div>';
})
})
</script>