资讯专栏INFORMATION COLUMN

JavaScript疑难杂症系列-事件

quietin / 1177人阅读

摘要:支持三个参数分别表示事件名称,是否可以冒泡,是否阻止事件的默认操作触发参数表示事件对象,是方法返回的创建的对象监听方法自定义事件常用模拟模拟方法操作或者自定义事件我的自定义事件。

事件这块知识点虽然是老生长谈的,但对于我来说多多整理,多多感悟,温故知新,每次看看这块都有不同的收获.(在这里我不会长篇大论,只会挑重点;具体的小伙伴们自行查找)
什么是事件
在编程时系统内发生的动作或者发生的事情.
系统通过它来告诉编程者,在编程者愿意的情况下,编程者一某种方式对它做出回应.
添加事件方式 元素属性
var btn = document.querySelector("button");

btn.onclick = function() {
  var rndCol = "rgb(" + random(255) + "," + random(255) + "," + random(255) + ")";
  document.body.style.backgroundColor = rndCol;
}

或者

var btn = document.querySelector("button");

function bgChange() {
  var rndCol = "rgb(" + random(255) + "," + random(255) + "," + random(255) + ")";
  document.body.style.backgroundColor = rndCol;
}

btn.onclick = bgChange
行内事件


function bgChange() {
  var rndCol = "rgb(" + random(255) + "," + random(255) + "," + random(255) + ")";
  document.body.style.backgroundColor = rndCol;
}

或者

注册事件监听
addEventListener()和removeEventListener();

btn.addEventListener("click", function() {
  var rndCol = "rgb(" + random(255) + "," + random(255) + "," + random(255) + ")";
  document.body.style.backgroundColor = rndCol;
});

或者

btn.removeEventListener("click", bgChange);
优缺点

元素属性

优:
     1. 兼容性好
     2. 行为的分离
     3.便于操作当事对象,因为function是作为on***的属性出现的,可直接用this引用当事对象
缺: 
     1. 给同一个监听器注册多个处理器,后面的会覆盖前面
     btn.onclick=function(){alert("a")};
     btn.onclick=function(){alert("b")};

行内事件

优:
     1. 兼容性好,是最早的事件处理方法
     2. 方便快捷
缺: 
     1. 代码杂糅
     2. 难以管理和效率低下,一个按钮看起来还好,但是如果有一百个按钮呢?得在文件中加上100个属性
     3. 文档很难解析

注册事件监听

优:
     1. 它允许为事件添加多个多带带的处理程序。这对于DHTML库或Mozilla扩展尤其有用,即使使用其他库/扩展也需要很好的工作
     2. 它可以让你更好地控制阶段,当听者被激活(捕获与冒泡)
     3. 它适用于任何DOM元素,而不仅仅是HTML元素
     4. 行为的分离 
缺:
    兼容性(不过网上有很多成熟的hack);
事件对象

具体请看event详解-https://developer.mozilla.org

在触发DOM上的某个事件时,会在事件处理程序函数中会产生一个事件对象event,这个对象中包含着所有与事件有关的信息。包括导致事件的元素、事件的类型以及其他与特定事件相关的信息.

var btn = document.getElementById("myBtn");
btn.onclick = function(event) {
    alert(event.type); //"click"
}
btn.addEventListener("click", function(event) {
    alert(event.type); //"click"
}, false);
event.currentTarget与event.target
事件对象event的target属性始终是事件刚刚发生的元素的引用

例如,你可能有一组16块方格,当它们被点击时就会消失。用e.target总是能准确选择当前操作的东西(方格)并执行操作让它消失,而不是必须以更困难的方式选择它.

var divs = document.querySelectorAll("div");

for (var i = 0; i < divs.length; i++) {
  divs[i].onclick = function(e) {
    e.target.style.backgroundColor = bgChange();
  }
}
阻止默认行为(event.preventDefault())

有时,你会遇到一些情况,你希望事件不执行它的默认行为例如自定义注册表单

var form = document.querySelector("form");
var fname = document.getElementById("fname");
var lname = document.getElementById("lname");
var submit = document.getElementById("submit");
var para = document.querySelector("p");
form.onsubmit = function(e) {
  if (fname.value === "" || lname.value === "") {
    e.preventDefault();
    para.textContent = "You need to fill in both names!";
  }
}
事件冒泡及捕获(event.stopPropagation())
描述事件触发时序问题的术语。
事件捕获指的是从document到触发事件的那个节点,即自上而下的去触发事件。
事件冒泡是自下而上的去触发事件。
绑定事件方法的第三个参数,就是控制事件触发顺序是否为事件捕获。true,事件捕获;false,事件冒泡。默认false,即事件冒泡

事件委托
冒泡还允许我们利用事件委托——这个概念依赖于这样一个事实,如果你想要在大量子元素中单击任何一个都可以运行一段代码,您可以将事件监听器设置在其父节点上,并将事件监听器气泡的影响设置为每个子节点,而不是每个子节点多带带设置事件监听器

如:鼠标放到li上对应的li背景变灰

  • item1
  • item2
  • item3
  • item4
  • item5
  • item6

利用事件冒泡实现

$("ul").on("mouseover",function(e){
     $(e.target).css("background-color","#ffffd").siblings().css("background-color","white");
})

给所有li都绑上事件

$("li").on("mouseover",function(){
      $(this).css("background-color","#ffffd").siblings().css("background-color","white");
})
代码简洁程度上,两者是相若仿佛的。
前者少了一个遍历所有li节点的操作,所以在性能上肯定是更优的
如果在绑定事件完成后,页面又动态的加载了一些元素
第二种方案,由于绑定事件的时候item7还不存在,所以为了效果,我们还要给它再绑定一次事件.
自定义事件(DOM的事件模拟又称“伪DOM自定义事件”)

js原生自定义事件分三个阶段(创造、初始化、触发)

摘自 https://developer.mozilla.org...

(1). 创造

var event = document.createEvent(type);
type:是一个字符串,表示要创建的事件类型。事件类型可能包括是一个字符串,表示要创建的事件类型。
事件类型可能包括"UIEvents", "MouseEvents", "MutationEvents", 或者 "HTMLEvents"

(2) 初始化

event.initEvent("build", true, true);
于初始化通过DocumentEvent接口创建的Event的值。支持三个参数:initEvent(eventName, canBubble,preventDefault)
分别表示事件名称,是否可以冒泡,是否阻止事件的默认操作

(3). 触发

elem.dispatchEvent(event);
参数event表示事件对象,是createEvent()方法返回的创建的Event对象

监听方法

elem.addEventListener("build", function (e) {
// e.target matches elem
}, false);

jq自定义dom事件

(1). trigger()

常用模拟
  模拟方法操作
   $("#btn").trigger("click");
     或者    
   $("#btn").click();
自定义事件
   $("#btn").on("myClick", function () {
       $("#test").append("

我的自定义事件。

"); }); $("btn").trigger("myClick");
传递数据
  trigger(tpye[,datea]);
  第一个参数是要触发的事件类型,
  第二个单数是要传递给事件处理函数的附加数据,以数组形式传递。
  通常可以通过传递一个参数给回调函数来区别这次事件是代码触发的还是用户触发的
   $("#btn").bind("clickCustomize", function (event, message1, message2) { //获取数据
        $("#test").append("p" + message1 + message2 + "

"); }); $("#btn").trigger("clickCustomize",["我的自定义","事件"]); //传递两个数据 $(“#btn”).trigger(“clickCustomize”,["我的自定义","事件"]); //传递两个数据

(2). triggerHandler();(阻止默认事件)

triggerHandler("lickCustomize");

DOM自定义事件优势与劣势:

(1)、优势:

1、自定义事件完全由我们控制触发时机,这就意味着实现了一种 JavaScript 的解耦。我们可以把多个关联但逻辑复杂的操作利用自定义事件的机制灵活地控制好
2、既然绑定也可以解绑,如果不需要了,直接移除绑定事件

(2)、劣势

1、兼容性差,要自己hack(jq除外)

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/51831.html

相关文章

  • JavaScript疑难杂症系列-事件循环

    摘要:而之后事件循环一直会去遍历任务队列,一旦有任务放入就会放入主线程中执行。任务队列所谓任务是返回的一个个通知,让主线程在读取任务队列的时候得知这个异步任务已经完成,下一步该执行这个任务的回调函数了。 javascript单线程 浏览器端,复杂的UI环境会限制多线程语言的开发。例如,一个线程在操作一个DOM元素时,另一个线程需要去删除DOM元素,这个之间就需要进行状态的同步,何况前端可能不...

    Keagan 评论0 收藏0
  • JavaScript疑难杂症系列-事件

    摘要:支持三个参数分别表示事件名称,是否可以冒泡,是否阻止事件的默认操作触发参数表示事件对象,是方法返回的创建的对象监听方法自定义事件常用模拟模拟方法操作或者自定义事件我的自定义事件。 事件这块知识点虽然是老生长谈的,但对于我来说多多整理,多多感悟,温故知新,每次看看这块都有不同的收获.(在这里我不会长篇大论,只会挑重点;具体的小伙伴们自行查找) 什么是事件 在编程时系统内发生的动作或者发生...

    CocoaChina 评论0 收藏0
  • JavaScript疑难杂症系列-事件

    摘要:支持三个参数分别表示事件名称,是否可以冒泡,是否阻止事件的默认操作触发参数表示事件对象,是方法返回的创建的对象监听方法自定义事件常用模拟模拟方法操作或者自定义事件我的自定义事件。 事件这块知识点虽然是老生长谈的,但对于我来说多多整理,多多感悟,温故知新,每次看看这块都有不同的收获.(在这里我不会长篇大论,只会挑重点;具体的小伙伴们自行查找) 什么是事件 在编程时系统内发生的动作或者发生...

    Anleb 评论0 收藏0
  • JavaScript疑难杂症系列-事件

    摘要:支持三个参数分别表示事件名称,是否可以冒泡,是否阻止事件的默认操作触发参数表示事件对象,是方法返回的创建的对象监听方法自定义事件常用模拟模拟方法操作或者自定义事件我的自定义事件。 事件这块知识点虽然是老生长谈的,但对于我来说多多整理,多多感悟,温故知新,每次看看这块都有不同的收获.(在这里我不会长篇大论,只会挑重点;具体的小伙伴们自行查找) 什么是事件 在编程时系统内发生的动作或者发生...

    Heier 评论0 收藏0
  • JavaScript疑难杂症系列-相等性判断

    摘要:同一类的复合类型值两个复合类型对象数组函数的数据比较时,不是比较它们的值是否相等,而是比较它们是否指向同一个对象。宽松相等双等号将执行类型转换原始类型的值原始类型的数据会转换成数值类型再进行比较。 事件这块知识点虽然是老生长谈的,但对于我来说多多整理,多多感悟,温故知新,每次看看这块都有不同的收获.(在这里我不会长篇大论,只会挑重点;具体的小伙伴们自行查找)参考:https://dev...

    Flink_China 评论0 收藏0

发表评论

0条评论

quietin

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<