preventDefault体验-原来SPA单页应用就是靠这个小函数

image-20260201142607479

什么是 preventDefault()

preventDefault() 是事件对象的一个方法,用于阻止事件的默认行为。当用户与网页交互时(如点击链接、提交表单等),浏览器会自动执行某些默认动作,调用此方法可以完全取消这些默认动作。

基本语法

event.preventDefault();

在现代网页应用中,preventDefault() 是必不可少的:

这就是现代单页应用 (SPA) 的核心实现原理! 🚀

1️⃣ 从被动到主动

  • 没有它:只能接受浏览器的默认行为
  • 有了它:可以主动控制用户交互

2️⃣ 构建现代应用的基础

  • 单页应用 (SPA) 的路由切换
  • 异步表单提交(不刷新页面)
  • 自定义快捷键
  • 实现拖拽功能
  • 自定义菜单系统

3️⃣ 改善用户体验

  • 页面不刷新,保留用户输入和应用状态
  • 更快的交互速度
  • 更平滑的动画和过渡

常见应用场景

📋 场景汇总表

事件类型 原生默认行为 阻止后的做法 常见应用
submit 提交表单并刷新 异步提交数据 登录、注册、表单验证
click (链接) 跳转页面 前端路由导航 Vue Router、React Router
click (复选框) 改变勾选状态 条件判断后再改变 权限验证、条款同意
contextmenu 显示浏览器菜单 显示自定义菜单 Figma、在线设计工具
keydown 浏览器快捷键 自定义快捷键 Ctrl+S 保存、Ctrl+B 加粗
dragover 不允许 drop 允许 drop 事件 文件拖拽上传
drop 打开/下载文件 上传到服务器 网盘、云存储应用
wheel 页面滚动 自定义滚动行为 图片缩放、幻灯片翻页

JavaScript 原生实现

示例 1: 表单提交

// HTML
<form id="myForm">
  <input type="email" placeholder="邮箱">
  <button type="submit">提交</button>
</form>

// JavaScript
document.getElementById('myForm').addEventListener('submit', function(e) {
  e.preventDefault(); // 🎯 阻止默认提交行为
  
  // 验证表单
  const email = this.querySelector('input').value;
  if (!email.includes('@')) {
    alert('邮箱格式不正确');
    return;
  }
  
  // 异步提交
  fetch('/api/submit', {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({ email })
  })
  .then(res => res.json())
  .then(data => {
    console.log('✅ 提交成功');
    // 页面不刷新,用户体验更好
  });
});

示例 2: 链接拦截

// HTML
<a href="https://example.com" id="myLink">点击我</a>

// JavaScript - 前端路由方案
document.getElementById('myLink').addEventListener('click', function(e) {
  e.preventDefault(); // 🎯 阻止链接跳转
  
  // 使用前端路由(如 Vue Router)
  router.push('/target-page');
  
  // 或者手动更新 URL
  window.history.pushState({}, '', '/target-page');
});

示例 3: 键盘快捷键

document.addEventListener('keydown', function(e) {
  // Ctrl+S 或 Cmd+S 保存
  if ((e.ctrlKey || e.metaKey) && e.key === 's') {
    e.preventDefault(); // 🎯 阻止浏览器保存页面
    
    console.log('💾 执行自定义保存...');
    saveDocument(); // 调用保存函数
  }
  
  // Ctrl+K 打开命令面板(VS Code 风格)
  if ((e.ctrlKey || e.metaKey) && e.key === 'k') {
    e.preventDefault();
    openCommandPalette();
  }
});

示例 4: 文件拖拽上传

const dropZone = document.getElementById('dropZone');

// 阻止默认行为
dropZone.addEventListener('dragover', function(e) {
  e.preventDefault(); // 🎯 必须阻止才能触发 drop
  this.style.background = '#e7f5ff';
});

dropZone.addEventListener('dragleave', function(e) {
  this.style.background = 'white';
});

// 处理文件上传
dropZone.addEventListener('drop', function(e) {
  e.preventDefault(); // 🎯 阻止浏览器打开文件
  
  const files = e.dataTransfer.files;
  
  // 上传到服务器
  Array.from(files).forEach(file => {
    const formData = new FormData();
    formData.append('file', file);
    
    fetch('/api/upload', {
      method: 'POST',
      body: formData
    });
  });
});

示例 5: 右键菜单

document.addEventListener('contextmenu', function(e) {
  e.preventDefault(); // 🎯 阻止浏览器菜单
  
  // 显示自定义菜单
  const menu = document.getElementById('customMenu');
  menu.style.left = e.clientX + 'px';
  menu.style.top = e.clientY + 'px';
  menu.style.display = 'block';
});

// 点击其他地方隐藏菜单
document.addEventListener('click', function(e) {
  if (e.target.id !== 'customMenu') {
    document.getElementById('customMenu').style.display = 'none';
  }
});
版权声明:
本文标题:preventDefault体验-原来SPA单页应用就是靠这个小函数
本文链接:https://haoyelaiga.com/preventdefault%e4%bd%93%e9%aa%8cspa%e5%8d%95%e9%a1%b5%e5%ba%94%e7%94%a8/
版权所有:好嘢
转载请保留出处,谢谢合作!

1人评论了“preventDefault体验-原来SPA单页应用就是靠这个小函数”

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部