
什么是 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/
版权所有:好嘢
转载请保留出处,谢谢合作!
本文标题:preventDefault体验-原来SPA单页应用就是靠这个小函数
本文链接:https://haoyelaiga.com/preventdefault%e4%bd%93%e9%aa%8cspa%e5%8d%95%e9%a1%b5%e5%ba%94%e7%94%a8/
版权所有:好嘢
转载请保留出处,谢谢合作!

不错