0

0

如何阻止表单提交导致的页面跳转与路由变化

聖光之護

聖光之護

发布时间:2026-02-09 12:30:00

|

906人浏览过

|

来源于php中文网

原创

如何阻止表单提交导致的页面跳转与路由变化

在单页应用中,表单默认提交会触发完整页面刷新或导航,即使已返回 `false`,仍需显式调用 `event.preventdefault()` 才能彻底阻止浏览器默认行为。

你遇到的“点击提交按钮后路由意外改变”问题,根本原因在于:仅靠 return false 并不能可靠阻止表单的默认提交行为——尤其是在使用 onsubmit 属性绑定事件时,return false 的作用受限于事件绑定方式和执行上下文,且不具备语义明确性。

正确的做法是:在事件处理函数中显式调用 event.preventDefault(),它直接告诉浏览器:“不要执行表单的默认提交动作(如跳转、刷新)”,这是标准、可靠且推荐的解决方案。

以下是修复后的 send_mail 函数:

function send_mail(event) {
  event.preventDefault(); // ✅ 关键:阻止默认表单提交行为

  const recipients = document.querySelector('#compose-recipients').value;
  const subject = document.querySelector('#compose-subject').value;
  const body = document.querySelector('#compose-body').value;

  fetch('/emails', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
      'X-CSRFToken': getCookie('csrftoken') // ⚠️ Django 项目中务必携带 CSRF Token
    },
    body: JSON.stringify({
      recipients,
      subject,
      body
    })
  })
  .then(response => {
    if (!response.ok) throw new Error(`HTTP error! status: ${response.status}`);
    return response.json();
  })
  .then(result => {
    console.log('Email sent:', result);
    load_mailbox('sent'); // 切换至 Sent 视图
  })
  .catch(error => {
    console.error('Failed to send email:', error);
    alert('Failed to send email. Please check the console for details.');
  });
}

同时,建议将事件监听改为更现代、更可控的方式(替代 onsubmit = ...):

Getimg.ai
Getimg.ai

getimg.ai是一套神奇的ai工具。生成大规模的原始图像

下载
// 替换原来的 document.querySelector('#compose-form').onsubmit = send_mail;
document.addEventListener('DOMContentLoaded', function() {
  // ... 其他初始化代码(inbox/sent/ compose 等)

  // 使用 addEventListener 绑定 submit 事件(推荐)
  document.querySelector('#compose-form').addEventListener('submit', send_mail);
});

为什么 event.preventDefault() 是必需的?

  • 元素的原生行为是:收集字段值 → 构造请求 → 导航到 action 指定 URL(若无 action,则提交到当前 URL),这必然导致页面跳转或重载。
  • return false 在内联 onsubmit="..." 中可同时阻止默认行为和事件冒泡,但在 element.onsubmit = handler 赋值方式下,它仅影响该属性赋值的返回值,并不保证阻止默认行为(尤其在现代浏览器中行为不一致)。
  • event.preventDefault() 是 W3C 标准 API,语义清晰、跨浏览器兼容、行为确定,是唯一推荐的阻止默认动作方式。

⚠️ 额外注意事项:

  • 后端使用 Django,务必在 fetch 请求头中添加 CSRF Token(如示例所示),否则 POST 请求会被拒绝;
  • 建议为 fetch 添加错误处理(如网络失败、403/500 响应),提升用户体验;
  • 避免在 send_mail 中直接操作 DOM 后再调用 load_mailbox('sent') 前清空表单——应在 then 回调中统一处理,确保异步成功后再切换视图。

遵循以上修改,表单将完全由 JavaScript 控制,路由保持稳定,真正实现单页应用的无缝交互体验。

相关文章

路由优化大师
路由优化大师

路由优化大师是一款及简单的路由器设置管理软件,其主要功能是一键设置优化路由、屏广告、防蹭网、路由器全面检测及高级设置等,有需要的小伙伴快来保存下载体验吧!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
Python Web 框架 Django 深度开发
Python Web 框架 Django 深度开发

本专题系统讲解 Python Django 框架的核心功能与进阶开发技巧,包括 Django 项目结构、数据库模型与迁移、视图与模板渲染、表单与认证管理、RESTful API 开发、Django 中间件与缓存优化、部署与性能调优。通过实战案例,帮助学习者掌握 使用 Django 快速构建功能全面的 Web 应用与全栈开发能力。

35

2026.02.04

登录token无效
登录token无效

登录token无效解决方法:1、检查token的有效期限,如果token已经过期,需要重新获取一个新的token;2、检查token的签名,如果签名不正确,需要重新获取一个新的token;3、检查密钥的正确性,如果密钥不正确,需要重新获取一个新的token;4、使用HTTPS协议传输token,建议使用HTTPS协议进行传输 ;5、使用双因素认证,双因素认证可以提高账户的安全性。

6351

2023.09.14

登录token无效怎么办
登录token无效怎么办

登录token无效的解决办法有检查Token是否过期、检查Token是否正确、检查Token是否被篡改、检查Token是否与用户匹配、清除缓存或Cookie、检查网络连接和服务器状态、重新登录或请求新的Token、联系技术支持或开发人员等。本专题为大家提供token相关的文章、下载、课程内容,供大家免费下载体验。

830

2023.09.14

token怎么获取
token怎么获取

获取token值的方法:1、小程序调用“wx.login()”获取 临时登录凭证code,并回传到开发者服务器;2、开发者服务器以code换取,用户唯一标识openid和会话密钥“session_key”。想了解更详细的内容,可以阅读本专题下面的文章。

1077

2023.12.21

token什么意思
token什么意思

token是一种用于表示用户权限、记录交易信息、支付虚拟货币的数字货币。可以用来在特定的网络上进行交易,用来购买或出售特定的虚拟货币,也可以用来支付特定的服务费用。想了解更多token什么意思的相关内容可以访问本专题下面的文章。

1491

2024.03.01

DOM是什么意思
DOM是什么意思

dom的英文全称是documentobjectmodel,表示文件对象模型,是w3c组织推荐的处理可扩展置标语言的标准编程接口;dom是html文档的内存中对象表示,它提供了使用javascript与网页交互的方式。想了解更多的相关内容,可以阅读本专题下面的文章。

3579

2024.08.14

Golang处理数据库错误教程合集
Golang处理数据库错误教程合集

本专题整合了Golang数据库错误处理方法、技巧、管理策略相关内容,阅读专题下面的文章了解更多详细内容。

98

2026.02.06

java多线程方法汇总
java多线程方法汇总

本专题整合了java多线程面试题、实现函数、执行并发相关内容,阅读专题下面的文章了解更多详细内容。

45

2026.02.06

1688阿里巴巴货源平台入口与批发采购指南
1688阿里巴巴货源平台入口与批发采购指南

本专题整理了1688阿里巴巴批发进货平台的最新入口地址与在线采购指南,帮助用户快速找到官方网站入口,了解如何进行批发采购、货源选择以及厂家直销等功能,提升采购效率与平台使用体验。

644

2026.02.06

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
React 教程
React 教程

共58课时 | 4.8万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 2.8万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 3.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号