Javascript基础-事件类型集合

130 阅读11分钟

✊不积跬步,无以至千里;不积小流,无以成江海。

click、dblclick、mousedown、mouseup、contextmenu

JavaScript中的click、dblclick、mousedown、mouseup和contextmenu都是鼠标事件。它们分别对应于鼠标单击、双击、按下、释放和打开上下文菜单。

click事件在用户单击元素时触发。单击是指用户按下鼠标按钮,然后将其释放,而没有移动鼠标指针。

dblclick事件在用户双击元素时触发。双击是指用户在短时间内连续单击元素两次。

mousedown事件在用户按下鼠标按钮时触发,而不管鼠标指针的位置。

mouseup事件在用户释放鼠标按钮时触发,而不管鼠标指针的位置。

contextmenu事件在用户尝试打开元素的上下文菜单时触发。上下文菜单通常是通过右键单击元素来打开的。

以下是一个简单的示例,说明如何使用这些事件:

const element = document.querySelector('#element');

element.addEventListener('click', () => {
  // 处理单击事件
});

element.addEventListener('dblclick', () => {
  // 处理双击事件
});

element.addEventListener('mousedown', () => {
  // 处理鼠标按下事件
});

element.addEventListener('mouseup', () => {
  // 处理鼠标释放事件
});

element.addEventListener('contextmenu', () => {
  // 处理上下文菜单事件
});

mouseenter和mouseleave

mouseenter和mouseleave是JavaScript中的鼠标事件,分别对应于鼠标指针进入和离开元素。

mouseenter事件在鼠标指针进入元素时触发。进入是指鼠标指针移动到元素的边界内,而不管鼠标按钮是否被按下。

mouseleave事件在鼠标指针离开元素时触发。离开是指鼠标指针移动到元素的边界外,而不管鼠标按钮是否被按下。

这两个事件通常用于实现交互式效果,例如在鼠标指针进入元素时显示边框,或者在鼠标指针离开元素时隐藏菜单。

以下是一个简单的示例,说明如何使用mouseenter和mouseleave事件:

const element = document.querySelector('#element');

element.addEventListener('mouseenter', () => {
  // 处理鼠标指针进入元素事件
});

element.addEventListener('mouseleave', () => {
  // 处理鼠标指针离开元素事件
});

可以根据需要使用这两个事件来处理用户与元素的交互。例如,希望使用mouseenter事件来在鼠标指针进入元素时显示边框,或者使用mouseleave事件来在鼠标指针离开元素时隐藏菜单。

请注意,mouseenter和mouseleave事件类似于mouseover和mouseout事件,但存在一些细微的差别。mouseover和mouseout事件在鼠标指针进入或离开元素及其子元素时触发,而mouseenter和mouseleave事件仅在鼠标指针进入或离开元素本身时触发。

keyup、keydown

keyup和keydown是JavaScript中的键盘事件,分别对应于键盘按键被释放和按下的事件。

keyup事件在用户释放键盘按键时触发。释放是指用户抬起手指离开按键。

keydown事件在用户按下键盘按键时触发。按下是指用户将手指按在按键上。

这两个事件通常用于实现键盘快捷键,例如在用户按下Ctrl+S键时保存文档,或在用户按下Ctrl+F键时打开搜索框。

以下是一个简单的示例,说明如何使用keyup和keydown事件:

document.addEventListener('keyup', (event) => {
  // 处理键盘按键被释放事件
  if (event.keyCode === 83 && event.ctrlKey) {
    // 保存文档
  }
});

document.addEventListener('keydown', (event) => {
  // 处理键盘按键被按下事件
  if (event.keyCode === 70 && event.ctrlKey) {
    // 打开搜索框
  }
});

请注意,keyup和keydown事件类似于keypress事件,但存在一些细微的差别。keypress事件在用户按下键盘按键并输入字符时触发,而keyup和keydown事件仅在用户按下或释放键盘按键时触发。

实战:实现一个安全键盘

一个安全键盘是一种虚拟键盘,它可以用来输入密码或其他敏感信息。安全键盘通常会打乱按键的位置,并使用遮罩来隐藏用户输入的字符。这可以防止键盘记录器等恶意软件窃取用户的密码或其他敏感信息。

以下是一个用JavaScript实现安全键盘的实战:

// 创建一个安全键盘
const keyboard = document.createElement('div');
keyboard.classList.add('keyboard');

// 创建按键
const keys = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '-', '=', 'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p', '[', ']', 'a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l', ';', '\'', 'z', 'x', 'c', 'v', 'b', 'n', 'm', ',', '.', '/'];
for (const key of keys) {
  const button = document.createElement('button');
  button.innerHTML = key;
  //将 `key` 类添加到 `button` 元素的类列表中。类列表用于存储元素的类
  button.classList.add('key'); 
  //将 `button` 元素添加到 `keyboard` 元素的子元素列表中。子元素列表用于存储元素的子元素。
  keyboard.appendChild(button); 
}

// 打乱按键的位置
const random = new Random();
for (let i = 0; i < keys.length; i++) {
  //将 `keys` 数组中的第 `i` 个元素赋值给 `key` 变量。
  const key = keys[i];
  
  //将随机生成一个介于 0 和 `keys` 数组长度之间的整数,并将其赋值给 `index` 变量。
  const index = random.nextInt(keys.length);
  
  //将 `keys` 数组中的第 `index` 个元素赋值给 `temp` 变量。
  const temp = keys[index];
  
  //将 `key` 变量的值赋给 `keys` 数组中的第 `index` 个元素。
  keys[index] = key;
  
  //将 `temp` 变量的值赋给 `keys` 数组中的第 `i` 个元素。
  keys[i] = temp;
}

// 为按键绑定事件
for (const button of keyboard.querySelectorAll('.key')) {
  button.addEventListener('click', () => {
    // 获取按键的文本
    const text = button.textContent;

    // 将按键的文本添加到遮罩
    //将 `.mask` 类的元素搜索到,并将其赋值给 `mask` 变量。
    const mask = document.querySelector('.mask');
    
    //将 `text` 字符串添加到 `mask` 元素的 `textContent` 属性中。`textContent` 属性用于设置或返回元素的文本内容。
    //`mask` 元素是用于隐藏用户输入的遮罩。`text` 字符串是用户输入的每个字符。
    mask.textContent += text;
  });
}

// 添加到页面
document.body.appendChild(keyboard);

// 创建遮罩
const mask = document.createElement('input');
mask.type = 'text';
mask.style.display = 'none';
document.body.appendChild(mask);

这个安全键盘使用了以下技术来提高安全性:

  • 将按键的位置打乱,以防止键盘记录器窃取按键输入。
  • 使用遮罩来隐藏用户输入的字符,以防止他人看到。

以下是一个使用这个安全键盘的实例:

<input type="password" id="password" placeholder="请输入密码">
<div class="keyboard"></div>

当用户输入密码时,密码将显示在遮罩中。用户可以使用安全键盘输入密码,而无需担心密码被窃取。

当然,这个安全键盘只是一个简单的示例。您可以根据需要进行改进,例如:

  • 添加更多按键,以支持输入其他字符。
  • 添加键盘音效,以便用户可以听到自己输入的字符。
  • 添加密码强度检测,以帮助用户选择强密码。

button.innerHTML = key;

innerHTML 属性用于设置或返回元素的内容。 在本例中,key 字符串是 keys 数组中的每个字符串。因此,循环将为每个按钮设置一个不同的文本。

以下是 innerHTML 属性的语法: element.innerHTML = string; 其中 element 是元素对象,string 是字符串。

在本例中,elementbutton 元素。stringkeys 数组中的每个字符串。

change、input事件

在 JavaScript 中,changeinput 事件都是用于处理输入框值发生变化的事件。

change 事件在输入框失去焦点时触发。input 事件在输入框的值发生变化时立即触发。

区别

change 事件和 input 事件的主要区别在于触发时机。change 事件在输入框失去焦点时触发,而 input 事件在输入框的值发生变化时立即触发。

以下是 change 事件和 input 事件的对比表:

截屏2023-10-31 15.20.48.png

示例

以下是一个使用 change 事件的示例:

const input = document.querySelector('input');

input.addEventListener('change', () => {
  // 输入框的值发生变化时执行此操作
});

以下是一个使用 input 事件的示例:

const input = document.querySelector('input');

input.addEventListener('input', () => {
  // 输入框的值发生变化时立即执行此操作
});

应用场景

change 事件和 input 事件可以用于以下场景:

  • 验证输入值
  • 保存输入值
  • 发送输入值

例如,可以使用 change 事件来验证用户输入的密码是否符合要求。也可以使用 input 事件来实时保存用户输入的值,以便用户可以随时查看。

submit事件

在 JavaScript 中,submit 事件是表单提交时触发的事件。它通常用于在将表单发送到服务器之前对表单进行校验,或者中止提交,并使用 JavaScript 来处理表单。

触发条件

submit 事件会在以下情况下触发:

  • 用户点击<input type="submit"> <input type="image"> 元素。
  • 用户在 <input type="text"> <input type="textarea"> 元素中按下 Enter 键。

使用方法

可以使用以下方法来绑定 submit 事件处理函数:

// 绑定到表单
form.addEventListener("submit", function(event) {
  // 处理表单
});

// 绑定到提交按钮
submitButton.addEventListener("submit", function(event) {
  // 处理表单
});

处理函数

submit 事件处理函数通常用于以下目的:

  • 对表单进行校验。
  • 中止提交。
  • 使用 JavaScript 来处理表单。

示例

以下示例演示了如何使用 submit 事件进行表单校验:

// 表单
<form action="submit.php">
  <input type="text" name="username" placeholder="用户名">
  <input type="password" name="password" placeholder="密码">
  <input type="submit" value="提交">
</form>

// JavaScript
function validateForm(event) {
  // 获取表单数据
  const username = document.querySelector("input[name='username']").value;
  const password = document.querySelector("input[name='password']").value;

  // 校验表单
  if (username === "") {
    alert("请输入用户名");
    event.preventDefault();
    return;
  }

  if (password === "") {
    alert("请输入密码");
    event.preventDefault();
    return;
  }

  // 提交表单
  event.target.submit();
}

// 绑定事件
form.addEventListener("submit", validateForm);

在该示例中,我们使用 validateForm() 函数来对表单进行校验。如果表单数据不正确,则会显示警告消息,并阻止表单提交。如果表单数据正确,则会提交表单。

cut&copy&paste

在 JavaScript 中,可以使用以下方法来实现剪切、复制和粘贴功能:

剪切(cut)

  • 使用 document.execCommand() 方法
// 剪切文本
document.execCommand("copy", false, "Hello, world!");
  • 使用 Clipboard API
// 剪切文本
const text = "Hello, world!";
const clipboard = new Clipboard(document.querySelector(".clip-target"));
clipboard.writeText(text);

复制(copy)

  • 使用 document.execCommand() 方法
// 复制文本
document.execCommand("copy", false, document.querySelector(".clip-target").textContent);
  • 使用 Clipboard API
// 复制文本
const text = document.querySelector(".clip-target").textContent;
const clipboard = new Clipboard(document.querySelector(".clip-target"));
clipboard.writeText(text);

粘贴(paste)

  • 使用 document.execCommand() 方法
// 粘贴文本
document.execCommand("paste", false, null);
  • 使用 Clipboard API
// 粘贴文本
const clipboard = new Clipboard(document.querySelector(".clip-target"));
clipboard.readText().then((text) => {
  // 处理粘贴的文本
});

示例

以下示例演示了如何使用 JavaScript 来实现剪切、复制和粘贴功能:

//HTML
<div class="clip-target">
  <p>Hello, world!</p>
</div>

//Javascript
// 剪切
function cutText() {
  // 使用 document.execCommand() 方法
  document.execCommand("copy", false, "Hello, world!");

  // 使用 Clipboard API
  // const text = "Hello, world!";
  // const clipboard = new Clipboard(document.querySelector(".clip-target"));
  // clipboard.writeText(text);
}

// 复制
function copyText() {
  // 使用 document.execCommand() 方法
  document.execCommand("copy", false, document.querySelector(".clip-target").textContent);

  // 使用 Clipboard API
  // const text = document.querySelector(".clip-target").textContent;
  // const clipboard = new Clipboard(document.querySelector(".clip-target"));
  // clipboard.writeText(text);
}

// 粘贴
function pasteText() {
  // 使用 document.execCommand() 方法
  document.execCommand("paste", false, null);

  // 使用 Clipboard API
  // const clipboard = new Clipboard(document.querySelector(".clip-target"));
  // clipboard.readText().then((text) => {
  //   // 处理粘贴的文本
  // });
}

// 绑定事件
document.querySelector(".clip-target").addEventListener("click", cutText);
document.querySelector(".clip-target").addEventListener("dblclick", copyText);
document.querySelector(".clip-target").addEventListener("contextmenu", pasteText);

在该示例中,我们为

元素绑定了三个事件:

  • 单击事件:用于剪切文本。
  • 双击事件:用于复制文本。
  • 右键菜单事件:用于粘贴文本。

注意事项

  • 使用 document.execCommand() 方法剪切或复制文本时,需要注意的是,如果文本区域没有被选中,则会剪切或复制整个文本区域的内容。

  • 使用 Clipboard API 剪切或复制文本时,可以通过 clipboard.writeText() 方法指定要剪切或复制的内容。

  • 使用 Clipboard API 粘贴文本时,可以通过 clipboard.readText() 方法获取剪贴板中的内容。

DOMContentLoaded、load

JavaScript 中的 DOMContentLoaded 事件和 load 事件都是用于检测页面加载状态的事件。但是,这两个事件之间有一些细微的差别。

DOMContentLoaded 事件

DOMContentLoaded 事件会在以下情况下触发:

  • HTML 文档已被完全加载和解析,但外部资源(如图片、样式表和子框架)可能尚未加载完成。
  • 所有延迟脚本(<script defer> 和 <script type="module">)都已下载并执行完成。

load 事件

load 事件会在以下情况下触发:

  • 整个页面(包括所有外部资源)都已完全加载完成。

区别

DOMContentLoaded 事件和 load 事件之间的主要区别是,DOMContentLoaded 事件不会等待外部资源加载完成,而 load 事件会等待所有外部资源加载完成。

用法

DOMContentLoaded 事件通常用于在外部资源加载完成之前执行一些 JavaScript 代码,例如,初始化 DOM 元素或绑定事件。load 事件通常用于在所有外部资源加载完成之后执行一些 JavaScript 代码,例如,显示页面内容或执行复杂的逻辑。

示例

以下示例演示了如何使用 DOMContentLoaded 事件和 load 事件:

<html>
<head>
  <title>DOMContentLoaded vs Load</title>
  <script>
    // DOMContentLoaded 事件
    document.addEventListener("DOMContentLoaded", function() {
      // 初始化 DOM 元素
      const element = document.querySelector("#my-element");
      element.innerHTML = "Hello, world!";

      // 绑定事件
      element.addEventListener("click", function() {
        alert("You clicked the element!");
      });
    });

    // load 事件
    window.addEventListener("load", function() {
      // 显示页面内容
      document.querySelector("body").style.display = "block";

      // 执行复杂的逻辑
      // ...
    });
  </script>
</head>
<body>
  <h1 id="my-element"></h1>
</body>
</html>

在该示例中,我们使用 DOMContentLoaded 事件来初始化 DOM 元素和绑定事件。我们使用 load 事件来显示页面内容和执行复杂的逻辑。

注意事项

  • DOMContentLoaded 事件和 load 事件都是全局事件,因此可以在任何地方监听它们。
  • DOMContentLoaded 事件会在 load 事件之前触发。
  • 如果页面没有外部资源,则 DOMContentLoaded 事件和 load 事件会同时触发。