JavaScript事件解析

事件是在编程时系统内发生的动作或者发生的事情.系统通过它来告诉编程者,在编程者愿意的情况下,编程者一某种方式对它做出回应.本文主要和大家分享JavaScript事件解析,希望能帮助到大家。

添加事件方式

元素属性

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,这个对象中包含着所有与事件有关的信息。包括导致事件的元素、事件的类型以及其他与特定事件相关的信息.

立即学习“Java免费学习笔记(深入)”;

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 ps = document.querySelectorAll('p');

for (var i = 0; i < ps.length; i++) {
ps[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,即事件冒泡

登录后复制

JavaScript事件解析

事件委托

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

登录后复制

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


  • item1

  • item2

  • item3

  • item4

  • item5

  • item6


登录后复制

利用事件冒泡实现

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

登录后复制

给所有li都绑上事件

$("li").on("mouseover",function(){
$(this).css("background-color","#ddd").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除外)

登录后复制

相关推荐:

JavaScript事件处理程序详解

Javascript事件与鼠标坐标的属性

JavaScript事件学习之事件流、处理程序和对象总结

以上就是JavaScript事件解析的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2786497.html

(0)
上一篇 2025年3月8日 17:45:59
下一篇 2025年3月8日 17:46:04

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • JS实现图片轮播的实例

    本文主要为大家带来一篇使用js实现图片轮播的实例(前后首尾相接),代码参考了一位已经写好了图片轮播功能的(再次表示感谢),但是没有首尾相接的功能,本人在此基础上增加了首尾相接功能。 效果如下: nbsp;html PUBLIC “-//W3…

    2025年3月8日
    200
  • JavaScript数组进化与性能分析实例

    在使用 javascript 前,我对 c、c++、c# 这些已经颇为熟悉。与许多 c/c++ 开发者一样,javascript 给我的第一印象并不好。本文主要和大家介绍了javascript 数组的进化与性能分析,本文讲得更多的是内存、优…

    2025年3月8日
    200
  • js高效率服务器时间同步实例

    本文主要和大家分享一个js倒计时的功能代码,首先说一下,为什么要服务器时间同步, 因为服务器时间和本地电脑时间存在一定的时间差。有些对时效性要求非常高的应用,例如时时彩开奖,是不能容忍这种时间差存在的。 方案1:每次倒计时去服务端请求时间 …

    编程技术 2025年3月8日
    200
  • js中Date()日期函数浏览器兼容问题如何解决

    一般直接new date() 是不会出现兼容性问题的,而 new date(datetimeformatstring) 常常会出现浏览器兼容性问题,为什么,datetimeformatstring中的某些格式浏览器不兼容。本文主要和大家介绍…

    编程技术 2025年3月8日
    200
  • JS鼠标3次点击事件的实现代码

    这几天看了一下javascript高级程序设计中的dom事件相关内容,同时看到网上有关鼠标多次点击事件,鼠标事件是简单、常用的事件之一,于是便针对点击事件进行一些小的扩展和实现,增强对dom事件的进一步理解。其中的实现和思路是自己总结的,有…

    编程技术 2025年3月8日
    200
  • js实现1,2,3,5数字按照概率生成代码分享

    本文主要和大家介绍了js实现1,2,3,5数字按照概率生成,需要的朋友可以参考下,希望能帮助到大家。 js按照配置的概率生成,概率规则如下:1————50% 2——&#…

    编程技术 2025年3月8日
    200
  • JavaScript面向对象实例详解

    构造函数和原型对象 构造函数也是函数,用new创建对象时调用的函数,与普通函数的一个区别是,其首字母应该大写。但如果将构造函数当作普通函数调用(缺少new关键字),则应该注意this指向的问题。本文主要和大家介绍了JavaScript面向对…

    2025年3月8日
    200
  • JS数据类型转换总结

    在js中数据类型转换有两种强制类型转换和隐式类型转换。本文主要和大家分享js数据类型转换总结,希望能帮助到大家。 隐式类型转换原则 都是数字,直接运算 都是字符串,使用字符对应的ASCII值运算 有一个是boolean值,将boolean值…

    2025年3月8日
    200
  • JavaScript面试基础知识题分享

    根据StackOverflow调查, 自2014年一来,JavaScript是最流行的编程语言。当然,这也在情理之中,毕竟1/3的开发工作都需要一些JavaScript知识。因此,如果你希望在成为一个开发者,你应该学会这门语言。 这篇博客的…

    2025年3月8日
    200
  • JavaScript相等性判断分享

    JavaScript提供三种不同的值比较操作 严格相等 “===” 宽松相等 “==” Object,is(es6d的新特性) 本文主要和大家分享JavaScript相等性判断,希望能帮助到大…

    2025年3月8日
    200

发表回复

登录后才能评论