浅谈jQuery/JS函数中的event(e)、element、this、event.target、event.currentTarget、tagName、nodeName

1、将 event(e) 作为函数的参数,其中这个 event 代表的是“事件对象”,并且 event 拥有属性和方法,如:

html代码:

<button id="btn" onclick="clickFn()">点我</button>

js代码:

var btn = document.getElementById("btn");
btn.onclick = function(event){
    console.log(event.type)     //获取事件类型
    console.log(event.target)     //获取事件源
    console.log(event.target.nodeName)    //获取触发事件的DOM元素
}
结果.png

(1)获取事件类型:event.type,得到的值可能是click等
(2)获取事件源:所谓事件源就是发生事件的元素,event.target
(3)获取触发事件的DOM元素:event.target.nodeName,得到的是具体的元素的名称,如 LI、A 等

2、将element作为参数传入函数,如jQuery中的 each 函数,其中的 element 代表当前的元素,也可以使用 this 选择器
$('ul li').each(function(index, element){
    $(element).bind('click', function(event){
        // ......
    });
});
3、event.target、event.currentTarget 和 this 的区别:由于JS中的事件是会冒泡的,所以 this 是可以变化的,但 event.target 是不会变化的,它永远指向触发事件的DOM元素本身,而 event.currentTarget 指向绑定事件的DOM元素
4、tagName 和 nodeName 的区别:首先DOM里有5个比较重要的节点类型(元素、属性、文本、注释、文档,对应的节点类型值nodeType分别是1、2、3、8、9),tagName 和 nodeName 语义上是一样的,但是:

(1)tagName只能用于元素节点
(2)nodeName可以用于任何节点,比如元素节点、属性节点、文本节点等
(3)从DOM层次来看,nodeName 是 node 接口上的 property,而 tagName 是 element 接口上的 property,所有的节点(元素节点,属性节点,文本节点等12种)都继承了node接口,而只有元素节点才继承了element节点,因此 nodeName 比 tagName 具有更大的使用范围。

5、例子:

(1)CSS代码:

ul li{ width:100px; float:left; height:30px; line-height:30px; text-align:center; background:#9cf; margin-left:1px; list-style: none;}
ul li a{ /*display:block;*/ color:#fff; text-decoration: none;}

(2)JS代码:

$(function(){
    $('ul li').each(function(index, element){
        $(element).bind('click', function(event){
            //事件对象
            console.log("event:" +event);     //[object Object]
                 
            //返回哪个DOM元素触发了事件
            console.log("element:" +element);     //[object HTMLLIElement]
            console.log("this:" +this);     //[object HTMLLIElement]
            console.log("event.currentTarget:" + event.currentTarget);     //[object HTMLLIElement]
            console.log("event.target:" + event.target);     //注意这里,如果点击的是a链接,则输出javascript:;,如果点击的是li则输出[object HTMLLIElement]
                         
            //事件类型
            console.log("event.type:" +event.type);     //click
            //节点名称(从下边三句代码的输出结果可以看出this和event.currentTarget的作用是相似的)
            //获取具体的触发事件的DOM元素的节点名称
            console.log("event.target.nodeName:" +event.target.nodeName);    //上文说道event.target是不会变化的,永远指向触发事件的元素,所以当你点击的是a标签时输出的是"A",当你点击的是li标签时输出的是"LI"
            console.log("event.currentTarget.nodeName:" +event.currentTarget.nodeName);     //由于JS中事件会冒泡,所以无论你点击的是a标签或是li,输出的值都是"LI"
            console.log("this.nodeName:" +this.nodeName);     //由于JS中事件会冒泡,所以无论你点击的是a标签或是li,输出的值都是"LI"
            //节点类型
            console.log("event.target.nodeType:" +event.target.nodeType);     //由于这里点击的a或li都是元素节点,因此会输出"1"
                         
            //触发事件的节点ID
            console.log("event.target.id:" +event.target.id);
             
            //触发事件的节点className
            console.log("event.target.className:" +event.target.className);
             
            //触发事件的元素的内容
            console.log("event.target.innerHTML:" +event.target.innerHTML);
            var d = document.getElementById("btn").getAttributeNode("name");  
            console.log(d.nodeType);
            console.log(d.nodeName);  
            console.log(d.nodeValue);
        });
    });
});

(3)HTML代码:

<ul>
    <li><a href="javascript:;" class="btn" id="btn" name="菜单一">菜单一</a></li>
    <li><a href="javascript:;" class="btn">菜单二</a></li>
    <li><a href="javascript:;" class="btn">菜单三</a></li>
    <li><a href="javascript:;" class="btn">菜单四</a></li>
    <li><a href="javascript:;" class="btn">菜单五</a></li>
    <li><a href="javascript:;" class="btn">菜单六</a></li>
</ul>
点击a元素的结果.png
点击li元素的结果.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 229,237评论 6 537
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 98,957评论 3 423
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 177,248评论 0 382
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 63,356评论 1 316
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 72,081评论 6 410
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 55,485评论 1 324
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 43,534评论 3 444
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 42,720评论 0 289
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 49,263评论 1 335
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 41,025评论 3 356
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 43,204评论 1 371
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 38,787评论 5 362
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 44,461评论 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 34,874评论 0 28
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 36,105评论 1 289
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 51,945评论 3 395
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 48,205评论 2 375

推荐阅读更多精彩内容

  • 第3章 基本概念 3.1 语法 3.2 关键字和保留字 3.3 变量 3.4 数据类型 5种简单数据类型:Unde...
    RickCole阅读 5,146评论 0 21
  • 今天面试回来,稍微整理下今天被问到的题目,呀,回答的是乱七八糟,最后百度整理下,以供以后学习。 1,vue 中事件...
    AlisaMfz阅读 480评论 0 0
  • js中的event对象包含很多有用的信息 target:触发事件的元素。 currentTarget:事件绑定的元...
    空谷悠阅读 2,212评论 0 2
  • 1.JQuery 基础 改变web开发人员创造搞交互性界面的方式。设计者无需花费时间纠缠JS复杂的高级特性。 1....
    LaBaby_阅读 1,193评论 0 1
  • 1.JQuery 基础 改变web开发人员创造搞交互性界面的方式。设计者无需花费时间纠缠JS复杂的高级特性。 1....
    LaBaby_阅读 1,362评论 0 2