題目1: DOM0 事件和DOM2級在事件監(jiān)聽使用方式上有什么區(qū)別藐石?
- DOM0:使用btn.onClick方法直接指定事件
var btnClick = document.getElementById('btnClick');
//添加事件
btnClick.onclick = function showMessage() {
alert(this.id);
};
//刪除事件
btnClick.onclick = null;
- DOM1:使用addEventListener和removeEventListener來添加和刪除事件
const $ = (str) => document.querySelector(str);
//添加事件
$('.btn').addEventListener('click', fn);
$('#re').addEventListener('click', ()=>{
$('.btn').removeEventListener('click',fn);//刪除事件
});
題目2: attachEvent與addEventListener的區(qū)別玉罐?
- addEventListener是DOM2的添加事件方法(也是目前的標(biāo)準(zhǔn)),attachEvent只是老IE(IE6,7)的方法
- 參數(shù)個(gè)數(shù)不同旁壮,addEventListener有3個(gè)參數(shù)(事件類型哥牍,處理方法非迹,是否攔截)环鲤,而attachEvent只有2個(gè)參數(shù)(事件類型,處理方法)
- 第一個(gè)參數(shù)名稱不一致:addEventListener的事件類型參數(shù)為'click','dblclick'等(type)憎兽;而attachEvent的事件類型參數(shù)為'onclick','ondblclick'等(on+type)
- 事件流不一樣冷离,addEventListener通過設(shè)置第三個(gè)參數(shù)可以決定添加的事件處理程序是在捕獲階段還是冒泡階段處理(我們一般為了瀏覽器兼容性都設(shè)置為冒泡階段);而attachEvent的事件處理只能在冒泡階段
- 事件處理程序的作用域不相同:addEventListener的作用域是元素本身纯命,this是指的觸發(fā)元素西剥,而attachEvent事件處理程序會(huì)在全局變量內(nèi)運(yùn)行,this是window
- 為一個(gè)事件添加多個(gè)事件處理程序時(shí)亿汞,執(zhí)行順序不同:addEventListener添加會(huì)按照添加順序執(zhí)行瞭空,而attachEvent添加多個(gè)事件處理程序時(shí)順序無規(guī)律
題目3: 解釋IE事件冒泡和DOM2事件傳播機(jī)制?
- IE事件冒泡:事件開始時(shí)由最具體的元素接收,然后逐級向上傳播到較為不具體的元素
-
DOM2事件傳播機(jī)制:DOM2級事件規(guī)定事件流包括三個(gè)階段咆畏,事件捕獲階段南捂,處于目標(biāo)階段,事件冒泡階段旧找,首先發(fā)生的是事件捕獲溺健,為截取事件提供機(jī)會(huì),然后是實(shí)際目標(biāo)接收事件钮蛛,最后是冒泡階段
題目4:如何阻止事件冒泡鞭缭? 如何阻止默認(rèn)事件?
- stopPropagation()
- preventDefault()
題目5:有如下代碼魏颓,要求當(dāng)點(diǎn)擊每一個(gè)元素li時(shí)控制臺展示該元素的文本內(nèi)容岭辣。不考慮兼容
<ul class="ct">
<li>這里是</li>
<li>饑人谷</li>
<li>前端6班</li>
</ul>
<script>
//todo ...
const $ = (str) => document.querySelector(str);
const $$ = (str) => document.querySelectorAll(str);
$('ul.ct').addEventListener('click',(e)=>{
if(e.target.tagName.toLowerCase()==="li"){
console.log(e.target.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í)控制臺展示該元素的文本內(nèi)容。
<ul class="ct">
<li>這里是</li>
<li>饑人谷</li>
<li>任務(wù)班</li>
</ul>
<input class="ipt-add-content" placeholder="添加內(nèi)容"/>
<button id="btn-add-start">開頭添加</button>
<button id="btn-add-end">結(jié)尾添加</button>
<script>
//你的代碼
const $ = (str) => document.querySelector(str);
const $$ = (str) => document.querySelectorAll(str);
const nodeInput = $('.ipt-add-content');
const btnAddStart = $('#btn-add-start');
const btnAddEnd = $('#btn-add-end');
const nodeUl = $('ul.ct');
nodeUl.addEventListener('click',(e)=>{
if(e.target.tagName.toLowerCase()==="li"){
console.log(e.target.innerText);
}
});
btnAddStart.addEventListener('click',()=>{
let text = nodeInput.value;
if(/^\s*$/.test(text)){
alert("內(nèi)容不能為空!");
} else {
nodeLi = document.createElement('li');
nodeLi.innerText=text;
nodeUl.insertBefore(nodeLi,nodeUl.firstChild);
}
});
btnAddEnd.addEventListener('click',()=>{
let text = nodeInput.value;
if(/^\s*$/.test(text)){
alert("內(nèi)容不能為空!");
} else {
nodeLi = document.createElement('li');
nodeLi.innerText=text;
nodeUl.appendChild(nodeLi);
}
});
</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>
//你的代碼
const $ = (str) => document.querySelector(str);
const $$ = (str) => document.querySelectorAll(str);
const nodeUl = $('.ct'),
nodeDiv = $('.img-preview');
nodeUl.addEventListener('click', (e) => {
if (e.target.tagName.toLowerCase() === 'li') {
let imgPath = e.target.getAttribute('data-img');
nodeDiv.style.backgroundImage = 'url(' + imgPath + ')';
}
});
</script>