美文网首页
4.事件源对象

4.事件源对象

作者: 素弥 | 来源:发表于2016-10-10 17:55 被阅读594次
事件对象是事件触发时关于事件的一些信息
事件源对象是事件对象里面的一部分,表示的是真正触发事件的那个对象

<br />
以下面这段代码为例:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
    </head>
    <body>
        <div>
            <p>
                <span></span>
            </p>
        </div>
    </body>
    <script>
        var div = document.querySelector('div');
        div.onclick=function(){
            console.log(1);
        };
    </script>
</html>

上面这段代码中,点击事件前面的对象是div,然而在我点击span或者p的时候,真正触发这个事件的对象就不是div了,而是span或者p,那么如果html嵌套层数过多,那么如何去获取事件的源对象呢?
可以用如下的代码

div.onclick=function(ev){
    console.log(ev.target);
}

此时

  • 点击div(p和span以外的区域)的时候,控制台输出的结果为<div>...</div>
  • 点击p(span以外的区域)的时候,控制台输出出来的结果为<p>...</p>
  • 点击span的时候,控制台输出出来的结果为<span>...</span>

事件的源对象可以利用事件对象.target的方法来找到

它的作用机制是从html文档中一层一层的向下查找,直到找到最里层的那个触发事件的源对象

<br />

那么它主要应用在哪里呢?

我们可以来看一个例子:
有一个界面html结构如下

<body>
    <ul></ul>
</body>

它里面的li都是动态添加进去的,我需要在点击里面的li的时候,获得当前li里面的内容,大部分人会这么去做

var lis=document.querySelectorAll('li');
document.body.innerHTML+='<li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li>'
for(var i=0;i<lis.length;i++){
    lis[i].onclick=function(){
        console.log(this.innerHTML);
    };
};

在这里功能失效了,因为添加li的操作在获取li的操作之后,所以这里的li是获取不到的
如果将获取操作写在添加操作前,调换一下它们的位置,那么功能可以生效

document.body.innerHTML+='<li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li>'
var lis=document.querySelectorAll('li');
for(var i=0;i<lis.length;i++){
    lis[i].onclick=function(){
        console.log(this.innerHTML);
    };
};

可是如何忽视这种顺序问题呢?
这时候就需要用到事件源对象

var ul = document.querySelector('ul');
ul.onclick=function(ev){
    console.log(ev.target.innerHTML);
};
ul.innerHTML='<li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li>';

而且这里存在一个问题,如果点击到li旁边ul的空白上,就会在控制台输出<ul>...</ul>
这时就需要添加一个判断条件来完善这段代码

var ul = document.querySelector('ul');
ul.onclick=function(ev){
    if(ev.target.tagName=='LI'){        //这里的tagName使用存在兼容性问题,在ie中是小写的li
        console.log(ev.target.innerHTML);
    }
};
ul.innerHTML='<li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li>';

本来这个点击事件是在li身上,但是我们这时候利用了事件源对象,将事件委托到了li的父级上去完成
故这个操作称为事件委托(代理)

相关文章

  • 4.事件源对象

    事件对象是事件触发时关于事件的一些信息 事件源对象是事件对象里面的一部分,表示的是真正触发事件的那个对象 以下面这...

  • Web笔记-Listener

    事件源、事件、监听器 事件源:发生事件的对象 事件:事件封装了事件源,方便监听器的某个方法获取到事件源对象 监听器...

  • 监听器

    概念 事件源:被监听的对象(request、session、servletContext)监听器:监听事件源对象(...

  • 菜鸟学习javascript16

    17.事件对象 事件even window.event 属性: 1.srcElement代表事件源对象 2.key...

  • 事件与信号

    事件模型三个主要角色:事件源,事件,事件目标。 事件源:发生状态改变的对象(将处理事件任务委托给事件目标) 事件:...

  • 常用事件

    事件 事件的三大要素 事件源 事件类型 事件函数 事件对象 : 事件函数里提供的形参 事件对象兼容性 vareve...

  • 事件

    事件三要素 事件源 (Dom对象)事件 (Type)事件处理函数 (functionHandler) 注册事件的方...

  • 事件上

    typora-copy-images-to: media 事件对象(上) 事件复习 事件三要素: 事件源 + 事...

  • DOM 事件源对象

    当 点击 div 的时候,会输出事件对象,IE9以下不兼容会输出undefined IE9以下的事件对象为 win...

  • CoreData使用方法

    1、查询对象,添加到数据源中 2、添加对象 3.删除对象 4.修改对象

网友评论

      本文标题:4.事件源对象

      本文链接:https://www.haomeiwen.com/subject/lmhvyttx.html