JavaScript 的 addEventListener 方法允许你为指定的 HTML 元素添加事件监听器。以下是一些常见的事件类型,可以使用 addEventListener 来监听它们:

1,点击事件 (click)

点击事件 (click): 当用户点击元素时触发。

element.addEventListener('click', function(event) {
console.log('Element was clicked!' + '点击位置:(' + event.clientX + ', ' + event.clientY + ')');
});

2,鼠标移入事件 (mouseover)

鼠标移入事件 (mouseover): 当鼠标指针移入元素时触发。

element.addEventListener('mouseover', function(event) {
console.log('Mouse is over the element!');
});

3,鼠标移出事件 (mouseout)

鼠标移出事件 (mouseout): 当鼠标指针移出元素时触发。

element.addEventListener('mouseout', function(event) {
console.log('Mouse is out of the element!');
});

4,键盘按键事件 (keydown, keyup)

键盘按键事件 (keydown, keyup): 当用户按下或释放键盘上的键时触发。

document.addEventListener('keydown', function(event) {
console.log('Key was pressed:', event.key);
});
document.addEventListener('keyup', function(event) {
console.log('Key was Released:', event.key);
});

5,输入事件 (input)

输入事件 (input): 当 <input>, <textarea> 或 <select> 元素的值发生变化时触发。这个函数会在input元素的值发生变化时被调用。

inputElement.addEventListener('input', function(event) {
// event参数包含了事件的相关信息。
// 你可以通过event.target来获取触发事件的元素
// 在这个例子中,event.target就是inputElement
var changedElement = event.target; // 你可以获取改变后的值
var newValue = changedElement.value;
// 现在你可以根据新的值做一些处理
console.log('Input value changed to:', newValue); // 或者你也可以直接对宿主对象做一些处理,效果是一样的
console.log('Input value changed:', inputElement.value);
});

加载事件 (DOMContentLoaded、load )

在 JavaScript 中,DOMContentLoaded 事件和 load 事件都与页面加载有关,但它们在触发时机和用途上有一些重要的区别。

DOMContentLoaded 事件

DOMContentLoaded事件在DOM树构建完成后触发,即当整个HTML文档被解析完成并且DOM树构建完成之后触发。此时,页面的CSS、JavaScript、图片等资源可能还没有完全加载完成,但是DOM结构已经可以访问并操作了。

DOMContentLoaded 事件在文档被完全加载和解析完成后触发,不等待样式表、图像和子框架的完成加载。换句话说,当 HTML 文档被完全加载和解析,DOM 树构建完成时,就会触发 DOMContentLoaded 事件。此时,页面中的脚本可以安全地访问 DOM 元素,并进行相关的 DOM 操作。

由于 DOMContentLoaded 事件不等待其他资源(如图片、CSS 文件等)的加载,因此它通常比 load 事件触发得更快。

6.1,加载事件 (DOMContentLoaded)

加载事件 (load): 当元素(如 <img>)或整个页面完成加载时触发。

// 使用 DOMContentLoaded 事件
document.addEventListener('DOMContentLoaded', function(event) {
console.log('DOMContentLoaded 事件触发');
// 在这里执行与 DOM 相关的操作
});

load 事件

load 事件在整个页面及所有依赖资源如样式表和图片完成加载后触发。这意味着,当 load 事件触发时,页面上的所有内容(包括图像、脚本文件、CSS 文件等)都已经完全加载到浏览器中,并且可以被访问和操作。

由于 load 事件需要等待所有资源加载完成,因此它通常比 DOMContentLoaded 事件触发得更晚。

另外,load 事件监听的对象可以是窗口、文档、也可以是页面的CSS、JavaScript、图片等资源。这一点对于页面上静态资源很大,或数量很多的场景下很有用。

6.2,加载事件 (load)

加载事件 (load): 当元素(如 <img>)或整个页面完成加载时触发。

imageElement.addEventListener('load', function(event) {
console.log('Image loaded!');
}); // 使用 load 事件
window.addEventListener('load', function(event) {
console.log('load 事件触发');
// 在这里执行需要等待所有资源加载完成的操作
});

用途和选择

如果你需要在 DOM 元素可用时立即执行某些操作(例如,添加事件监听器、修改 DOM 结构等),那么使用 DOMContentLoaded 事件是一个好选择。因为它不等待其他资源的加载,可以更快地执行代码。

如果你需要确保页面上的所有资源(包括图像、CSS 文件等)都已经加载完成后再执行某些操作(例如,计算图像的尺寸、应用某些样式等),那么应该使用 load 事件。


7,滚动事件 (scroll)

滚动事件 (scroll): 当元素或页面滚动时触发。

var lastScrollTop = 0;
window.addEventListener('scroll', function(event) {
console.log('Page scrolled!');
// 根据滚动位置进行相应操作
var scrollPosition = window.scrollY;
if (element.offsetTop <= window.innerHeight + window.scrollY) {
// 元素已经进入视口,可以执行相应的操作
} if (window.innerHeight + window.scrollY >= document.body.offsetHeight) {
// 页面已经滚动到底部,可以执行加载更多内容的操作
} // 判断页面滚动的方向
var currentScrollTop = window.scrollY;
if (currentScrollTop > lastScrollTop) {
// 向下滚动
} else {
// 向上滚动
}
lastScrollTop = currentScrollTop <= 0 ? 0 : currentScrollTop; // 防止在顶部时出现负数 });

8,提交事件 (submit)

提交事件 (submit): 当表单尝试提交时触发。

formElement.addEventListener('submit', function(event) {
event.preventDefault(); // 阻止表单默认提交行为
console.log('Form submitted!');
});

9,拖拽事件 (dragstart, dragover, drop 等)

拖拽事件 (dragstart, dragover, drop 等): 与拖拽相关的系列事件。

拖拽事件类型

当元素被拖拽时,会触发一系列的事件。这些事件包括:

  • dragstart:当用户开始拖拽元素时触发。
  • drag:在拖拽过程中持续触发。
  • dragenter:拖拽的元素进入目标区域时触发。
  • dragover:当元素在目标区域上方移动时触发。
  • dragleave:当元素离开目标区域时触发。
  • drop:当拖拽的元素被放置在目标区域时触发。
  • dragend:拖拽操作结束时触发。

示例:

element.addEventListener('dragstart', function(event) {
console.log('Dragging started!', event.target);
});
element.addEventListener('drag', function(event) {
console.log('Dragging!', event.target);
});
element.addEventListener('dragend', function(event) {
console.log('Dragging has stopped!', event.target);
});

10,触摸事件 (touchstart, touchmove, touchend 等)

触摸事件 (touchstart, touchmove, touchend 等): 在触摸屏设备上触发的事件。

element.addEventListener('touchstart', function(event) {
console.log('Touch started!', event.touches);
});

11,右键点击事件 (contextmenu)

右键点击事件 (contextmenu): 当用户右击元素时触发(通常用于自定义右键菜单)。

element.addEventListener('contextmenu', function(event) {
event.preventDefault(); // 阻止默认右键菜单显示
console.log('Right-click on the element!');
});

12,用户选择文本事件 (selectstart)

用户选择文本事件 (selectstart): 当文本被选中时触发(通常用于自定义右键菜单)。

element.addEventListener('selectstart', function(event) {
event.preventDefault(); // 阻止默认事件
console.log('Select start on the element!');
});

这些只是众多可用事件类型中的一部分。你可以根据需求选择合适的事件来监听。



其他示例:根据鼠标在元素停留时长判断是否真人操作

在JavaScript中,要判断鼠标移到元素上的时间和移出元素的时间,你可以使用mouseenter和mouseleave事件。这两个事件分别会在鼠标指针进入和离开元素时触发。你可以在这些事件的回调函数中记录时间戳,并据此计算出鼠标在元素上停留的时长。

以下是一个简单的示例代码,展示了如何实现这一功能:

// 获取你想要监听鼠标事件的元素
var element = document.getElementById('inputElementId'); // 定义变量来存储时间戳
var enterTime = 0;
var leaveTime = 0;
var duration = 0; // 监听 mouseenter 事件
element.addEventListener('mouseenter', function(event) {
// 记录鼠标进入元素的时间戳
enterTime = Date.now();
console.log('鼠标进入元素时间:', enterTime);
}); // 监听 mouseleave 事件
element.addEventListener('mouseleave', function(event) {
// 记录鼠标离开元素的时间戳
leaveTime = Date.now();
console.log('鼠标离开元素时间:', leaveTime); // 计算鼠标在元素上停留的时长
duration = leaveTime - enterTime;
console.log('鼠标在元素上停留的时长(毫秒):', duration);
});

在这段代码中,inputElementId应该替换为你想要监听鼠标事件的元素的ID。当鼠标指针进入该元素时,会记录一个时间戳到enterTime变量中;当鼠标指针离开该元素时,会记录另一个时间戳到leaveTime变量中,并计算两个时间戳之间的差值,得到鼠标在元素上停留的时长(以毫秒为单位)。

请注意,这种方法只能测量鼠标在单个连续进入和离开动作期间在元素上的停留时间。如果鼠标在元素内部移动并在不同位置触发其他事件(如mousemove),则不会影响这里计算的停留时长。

其他示例:禁止网页的复制粘贴和右键操作

要禁止网页的复制、粘贴和右键操作,可以使用 JavaScript 来实现。下面是一些示例代码:

document.addEventListener('copy', function(e) {
e.preventDefault();
alert('Copying is not allowed on this website.');
return false;
}); document.addEventListener('cut', function(e) {
e.preventDefault();
alert('Cutting is not allowed on this website.');
return false;
}); document.addEventListener('paste', function(e) {
e.preventDefault();
alert('Pasting is not allowed on this website.');
return false;
}); document.addEventListener('contextmenu', function(e) {
e.preventDefault();
alert('Right-clicking is not allowed on this website.');
return false;
}); /* 右键、复制都失效 */
document.oncontextmenu = new Function("event.returnValue=false");
document.onselectstart = new Function("event.returnValue=false");

可以结合 CSS 一起来实现:

使用纯CSS,你可以实现禁止用户选择文本(从而间接地限制复制操作)和隐藏右键菜单。但是,请注意,这些方法并不能完全阻止用户获取页面内容,因为它们不会阻止程序化的复制操作或其他高级用户技巧。

禁止文本选择(限制复制)

你可以通过CSS的user-select属性来禁止用户选择页面上的文本。这会让文本无法通过常规的鼠标拖拽方式被选中,从而间接限制了复制操作。

body {
-webkit-user-select: none; /* Chrome、Safari、Opera, Android */
-moz-user-select: none; /* Firefox */
-ms-user-select: none; /* IE10+/Edge */
-o-user-select: none; /* Opera浏览器私有属性 */
user-select: none; /* 标准语法:禁止用户选择文本 */
-webkit-user-drag: none; /* 禁止用户拖拽 */
}

将这段代码添加到你的CSS样式表中,会禁止整个区域内的文本选择。如果你只想针对特定元素禁止选择,可以将body替换为相应的选择器。

隐藏右键菜单

隐藏右键菜单可以通过CSS的::context-menu伪元素来实现,但这并不是一个广泛支持的特性。更常见且兼容的方法是使用JavaScript来禁用contextmenu事件。不过,如果你坚持只使用CSS,并且不介意牺牲一些兼容性,可以尝试以下方法(主要在Firefox中有效):

* {
contextmenu: none;
} // 或者针对特定元素:
.no-contextmenu {
contextmenu: none;
}

然后,在HTML中为想要禁止右键菜单的元素添加no-contextmenu类:

<div class="no-contextmenu">右键点击这里不会有任何反应(在支持的浏览器中)</div>

由于这种方法兼容性有限,通常建议结合使用JavaScript来处理右键菜单的禁用。

虽然CSS可以提供一定程度的保护来防止用户复制文本或显示右键菜单,但这些方法并不是绝对安全的。熟练的用户或开发者仍然可以通过其他手段(如查看页面源代码、使用开发者工具、或编写脚本)来访问和复制页面内容。因此,这些CSS技巧更多是用于增强用户体验或防止无意的复制行为,而不是作为内容保护的严格措施。

JavaScript操作addEventListener监听触发事件的更多相关文章

  1. addEventlistener监听的事件完成一次后自动取消与jquery的one方法比较;animate动画制作,arguments.callee的用法

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. javascript事件监听与事件委托

      事件监听与事件委托 在js中,常用到element.addEventListener()来进行事件的监听.但是当页面中存在大量需要绑定事件的元素时,这种方式可能会带来性能影响.此时,我们可以用事件 ...

  3. 在Javascript中监听flash事件(转)

    在Javascript中监听flash事件,其实有两种做法: 1.在特定的环境下(例如专门制作的flash),大家约定一个全局函数,然后在flash的事件中用ExternalInterface.cal ...

  4. ThinkPHP 数据库操作(六) : 查询事件、事务操作、监听SQL

    查询事件 查询事件(V5.0.4+) 从 5.0.4+ 版本开始,增加了数据库的CURD操作事件支持,包括: 查询事件仅支持 find . select . insert . update 和 del ...

  5. nodejs事件的监听与事件的触发

    nodejs事件(Events) 一.事件机制的实现 Node.js中大部分的模块,都继承自Event模块(http://nodejs.org/docs/latest/api/events.html  ...

  6. JavaScript监听回车事件

    记录一下,兼容性也考虑到了,原文地址:JavaScript 监听回车事件 JS监听某个输入框 //回车事件绑定 $('#search_input').bind('keyup', function(ev ...

  7. Zookeeper命令行操作(常用命令;客户端连接;查看znode路径;创建节点;获取znode数据,查看节点内容,设置节点内容,删除节点;监听znode事件;telnet连接zookeeper)

    8.1.常用命令 启动ZK服务 bin/zkServer.sh start 查看ZK服务状态 bin/zkServer.sh status 停止ZK服务 bin/zkServer.sh stop 重启 ...

  8. JS 中的事件绑定、事件监听、事件委托

    事件绑定 要想让 JavaScript 对用户的操作作出响应,首先要对 DOM 元素绑定事件处理函数.所谓事件处理函数,就是处理用户操作的函数,不同的操作对应不同的名称. 在JavaScript中,有 ...

  9. JS 事件绑定、事件监听、事件委托详细介绍

    原:http://www.jb51.net/article/93752.htm 在JavaScript的学习中,我们经常会遇到JavaScript的事件机制,例如,事件绑定.事件监听.事件委托(事件代 ...

  10. JS 中的事件绑定、事件监听、事件委托是什么?

    在JavaScript的学习中,我们经常会遇到JavaScript的事件机制,例如,事件绑定.事件监听.事件委托(事件代理)等.这些名词是什么意思呢,有什么作用呢? 事件绑定 要想让 JavaScri ...

随机推荐

  1. 关于MNN工程框架编译出来的静态库和动态库的使用

    一.MNN.lib文件路径 如果你看过之前的博客内容,应该可以在编译的的工程当中 C:\Users\Administrator\Desktop\MNN\MNN-master\MNN-CPU-OPENC ...

  2. Nuxt.js 应用中的 vite:serverCreated 事件钩子

    title: Nuxt.js 应用中的 vite:serverCreated 事件钩子 date: 2024/11/18 updated: 2024/11/18 author: cmdragon ex ...

  3. delphi BDE Reader 不需要驱动

    用过Delphi开发的几乎都知道BDE,是读取paradox DB (*.db)数据库(表)读取的驱动. 要存取数据,必需安装 BDE驱动程序,才能正常读取,还需要配置,发布程序就更不方便,所以吐槽的 ...

  4. 在使用openbms的时候发现的Thinkphp action 大小写问题

    下载了 https://gitee.com/openbms/openbms 看了看源代码,调试了一下普通用户的demo 用户 发现无法上传图片,admin不会,查看了源代码 发现是这样的 admin用 ...

  5. linux bash shell 入门教程()

    Shell Script(bash)简介 众所皆知地,UNIX上以小工具著名,利用许多简单的小工具,来完成原本需要大量软体开发的工作,这一点特色,使得UNIX成为许多人心目中理想的系统平台. 在众多的 ...

  6. 深入源码之JDK Logging

    JDK从1.4开始提供Logging实现,据说当初JDK打算采用Log4J的,后来因为某些原因谈判没谈拢,然后就自己开发了一套,不知道是为了报复而故意不沿用Log4J的命名方式和抽象方式,还是开发这个 ...

  7. 避免代码冗余,使用接口和泛型重构Java代码

    本文由 ImportNew - ImportNew读者 翻译自 michaelbrameld.如需转载本文,请先参见文章末尾处的转载要求. [感谢 李云涛(@平等的黑)的热心翻译.如果其他朋友也有不错 ...

  8. Spring Boot 使用 slf4j 进行日志记录

    SLF4J,即简单日志门面(Simple Logging Facade forJava),不是具体的日志解决方案,它只服务于各种各样的日志系统.按照官方的说法,SLF4J 是一个用于日志系统的简单Fa ...

  9. ServiceMesh 5:异常重试和超时保护提升服务可用性

    ★ ServiceMesh系列 1 背景 在复杂的互联网场景中,不可避免的会出现请求失败或者超时的情况. 从程序的的响应结果来看,一般是Response返回5xx状态的错误:从用户的角度去看,一般是请 ...

  10. .NET 模拟&编辑平滑曲线

    本文介绍不依赖贝塞尔曲线,如何绘制一条平滑曲线,用于解决无贝塞尔控制点的情况下绘制曲线.但数据点不在贝塞尔曲线的场景. 在上一家公司我做过一个平滑曲线编辑工具,用于轮椅调整加减速曲线.基于几个用户可控 ...