DOM事件

2017-07-17  本文已影响0人  QQQQQCY

题目1: DOM0 事件和DOM2级在事件监听使用方式上有什么区别?

// 添加事件处理程序
var btn=document.querySelector("#btn");
btn.onclick=function () {
    alert(this.id);
}
// 删除事件处理程序
btn.onclick=null;
var btn=document.querySelector("#btn");
var handler=function(){
    alert(this.id);
}
// 指定事件处理程序
btn.addEventListener("click",handler,false);
// 删除事件处理程序
btn.removeEventListener("click",handler,false);

但是通过removeEventListener()函数来移除事件处理程序时,移除时的参数必须与添加处理程序时使用的参数相同,这也意味着通过addEventListener()添加的匿名函数将无法移除。如:

var btn=document.querySelector("#btn");
// 指定事件处理程序
btn.addEventListener("click",function(){
    alert(this.id);
},false);
// 删除事件处理程序,不会生效
btn.removeEventListener("click",function(){
    alert(this.id);
},false);

题目2: attachEvent与addEventListener的区别?

addEventListener和attachEvent区别

题目3: 解释IE事件冒泡和DOM2事件传播机制?

事件流描述的是从页面中接收事件的顺序,比如有两个嵌套的div,点击了内层的div,这时候是内层的div先触发click事件还是外层先触发?目前主要有三种模型

  1. IE的事件冒泡:事件开始时由最具体的元素接收,然后逐级向上传播到较为不具体的元素

  2. Netscape的事件捕获:不太具体的节点更早接收事件,而最具体的元素最后接收事件,和事件冒泡相反

  3. DOM2事件流:DOM2级事件规定事件流包括三个阶段,事件捕获阶段,处于目标阶段,事件冒泡阶段,首先发生的是事件捕获,为截取事件提供机会,然后是实际目标接收事件,最后是冒泡阶段

题目4:如何阻止事件冒泡? 如何阻止默认事件?

function stopEvent(e) {
  e.stopPropagation();
}
el.addEventListener('click', stopEvent, false);

将上面函数指定为监听函数,会阻止事件进一步冒泡到el节点的父节点

function l1(e){
  e.stopImmediatePropagation();
}
function l2(e){
  console.log('hello world');
}
el.addEventListener('click', l1, false);
el.addEventListener('click', l2, false);

上面代码在el节点上,为click事件添加了两个监听函数l1和l2。由于l1调用了stopImmediatePropagation方法,所以l2不会被调用

// HTML代码为
// <input type="checkbox" id="my-checkbox" />
var cb = document.getElementById('my-checkbox');
cb.addEventListener(
  'click',
  function (e){ e.preventDefault(); },
  false
);

上面代码为点击单选框的事件,设置监听函数,取消默认行为。由于浏览器的默认行为是选中单选框,所以这段代码会导致无法选中单选框。

题目5:有如下代码,要求当点击每一个元素li时控制台展示该元素的文本内容。不考虑兼容

<Doctype !html>
<ul class="ct">
    <li>这里是</li>
    <li>饥人谷</li>
    <li>前端6班</li>
</ul>
<script>
    document.querySelector('.ct').addEventListener('click',function(e){
        if (e.target.tagName.toLowerCase()==='li') console.log(e.target.innerText);
    })                               
</script>

题目6: 补全代码,要求:

<ul class="ct">
  <li>这里是</li>
  <li>饥人谷</li>
  <li>任务班</li>
</ul>
<input class="ipt-add-content" placeholder="添加内容"/>
<button id="btn-add-start">开头添加</button>
<button id="btn-add-end">结尾添加</button>
<script>
    var ph = document.querySelector('.ipt-add-content'),
        ct = document.querySelector('.ct'),
        lastClickTarget = document.createElement('li'),
        lastHoverTarget = document.createElement('li'),
        saveColor = 'white';
    document.querySelector('#btn-add-start').addEventListener('click',function(){
        var newElement = document.createElement('li');
        newElement.innerText = ph.value;
        if (ph.value) ct.insertBefore(newElement,ct.firstElementChild);
    })  
    document.querySelector('#btn-add-end').addEventListener('click',function(){
        var newElement = document.createElement('li');
        newElement.innerText = ph.value;
        if (ph.value) ct.appendChild(newElement);
    })          
    ct.addEventListener('click',function(e){
        if (e.target.nodeName.toLowerCase() === 'li') {
            console.log(e.target.innerText);
            lastClickTarget.style.background = 'white';
            e.target.style.background = 'yellow';
            lastClickTarget = e.target;
            saveColor = e.target.style.background;
        }
    })  
    ct.addEventListener('mouseover',function(e){
        var nowColer = e.target.style.background;
        if (e.target.nodeName.toLowerCase() === 'li') {
            lastHoverTarget.style.background = saveColor;
            saveColor = e.target.style.background;
            e.target.style.background = 'orange';
            lastHoverTarget = e.target;
        }
    })               
</script>

题目7: 补全代码,要求:当鼠标放置在li元素上,会在img-preview里展示当前li元素的data-img对应的图片。

<ul class="ct">
    <li data-img="1.png">鼠标放置查看图片1</li>
    <li data-img="2.png">鼠标放置查看图片2</li>
    <li data-img="3.png">鼠标放置查看图片3</li>
</ul>
<div class="img-preview"></div>
<style>
    .img-preview{
        height: 200px;
        width: 300px;
        background-size: cover;
    }
</style>
<script>
    var ct = document.querySelector('.ct'),
        img = document.querySelector('.img-preview');
    ct.addEventListener('mouseover',function(e){
        if (e.target.nodeName.toLowerCase() ==='li')
            img.style.backgroundImage = 'url(http://osafeurnt.bkt.clouddn.com/interests-'+e.target.getAttribute('data-img')[0]+'.jpg';
    })
    ct.addEventListener('mouseleave',function(e){
            img.style.backgroundImage = '';
    })

</script>
上一篇下一篇

猜你喜欢

热点阅读