javascript - 另一个未捕获的 RangeError:最大调用堆栈大小难题
问题描述
我已经查看了有关此主题的先前问答,但我也许只是没有看到错误...
基本上,我有一个表单,底部有一个带有这个事件处理程序的按钮......
(整个设置是一个运行在 Chrome 上的 JS/JQuery/Bootstrap 接口到链接到 MySQL 的 node.js/express.js 服务器,但这些因素在这里似乎不相关。)
//create
$('#createform').on('click', '.create', function (e) {
e.preventDefault();
var userid = $("#user_id1").val();
var job_title = $("#job_title").val();
var description = $("#description").val();
var requirement = $("#requirement").val();
var location = $("#location").val();
var company_id = $("#company_id1").val()
var oontact_id = $("#contact_id").val()
var resume_id = $("#resume_id").val()
var status = $("#status").val()
var notes = $("#notes").val();
var rating = $("#rating").val()
console.log("create job button pushed [", userid, "] [", job_title, "] [", company_id, "] [", status, "] ");
$.ajax({
url: "/api/job",
type: "POST",
data: {
user_id1: userid,
job_title: job_title,
description: description,
requirement: requirement,
location: location,
company_id: company_id,
contact_id: contact_id,
resume_id: resume_id,
status: status,
notes: notes,
rating: rating
},
dataType: "json",
success: function (data) {
console.log(data);
//location.reload(); // force reload to see new entry
},
error: function (error) {
console.log("Error ")
console.log(error);
}
});
});
控制台中的表单没有错误。点击“创建”按钮(调用这部分代码)后,我得到控制台日志“按下创建作业按钮......”和正确的输入,确认变量已填充。然后浏览器冻结,没有调用传递给服务器。
浏览器错误堆栈显示
“Uncaught RangeError Maximum call stack size exceeded at Dt (jquery 3.5.0.min.js:2)” 无限重复
Chrome 自己的分析器证实了这一点(正在检查/性能)
我已经多次检查这部分代码。昨天,一个非常相似的代码(不同的表,不同的字段)运行良好,没有发生任何事故,但我制作这个代码/这个表的尝试失败了。我以为是location.reload,但它从来没有那么远。失败是在 jQuery 中,老实说,我看不出我在哪里搞砸了。
我检查了典型的,比如传递 val()...(我传递了从 val() 读取的变量,从不直接传递)。
我尝试过使用或不使用preventDefault,但它不存在。
在那个 Ajax 调用中有一些东西,但是什么?
解决方案
我发现了问题。真的很晦涩难懂。
事实证明,当我将几个东西命名为相同时,jQuery 感到困惑。这是我的输入字段之一:
<div class="form-group">
<input type="text" name="job_title"
id="job_title" class="form-control"
placeholder="job title" required="required">
</div>
正如您在上面注意到的,我有一个名为相同的变量。
var job_title = $("#job_title").val();
并馈入ajax数据位。
data: {
user_id1: userid,
job_title: job_title,
...
不知何故,当代码看起来像这样时,jQuery 在尝试取消引用名称、ID、字段和其余部分时感到非常困惑。这就是导致堆栈耗尽的原因。
不知何故,当只有 3-4 个字段时,这不是问题。但是当您在一个表单上有 10 多个字段时,它必须对每个字段进行多次迭代,并且堆栈空间已经耗尽。
这已通过 1) 从表单字段中删除“名称”属性(不需要已设置“id”的它们)和 2)消除变量冲突来解决。只要 ajax 获得正确的键名和值名,它就不会真正关心那里的数据。
您的特定解决方案会有所不同,但这至少是我解决此问题的方式。
推荐阅读
- sql - 重新运行已编辑的 T-SQL 脚本时,必须强制 MS SQL Server (2012) 返回其“原始”状态
- r - 如何用 R 中的预处理值制作一个 3x3 矩阵?
- javascript - 单击时切换按钮的颜色(并在不取消选择页面上所有按钮的情况下恢复其他按钮的颜色)
- asp.net - 错误 415 不支持的媒体类型
- github - 用于 github 组织的不和谐 webhook
- python - 使用 Ppython 启动已安装的程序
- node.js - 在 Heroku 上运行几个 node.js 脚本
- c++ - 如何在 C++(Arduino/C++)中将字符串转换为 uint8_t?
- javascript - 向 D3js 圆环图添加边框半径属性
- sas - 创建一个宏以根据 SAS 中的日期将月度数据子集为较小的数据集