1176 字
6 分钟

今日学习-表单的默认特性,浏览器默认提交行为,对象属性名的注意点

欢迎来到我的博客!#

使用 Markdown 格式编写。

今天学到了什么#

  • 表单的默认特性
  • 对象属性名的注意点
  • 浏览器默认提交行为

表单的默认特性#

这是一个非常好的问题!你能这样写并成功获取数据,是因为利用了 DOM 表单元素(HTMLFormElement)的一个特性

简单来说:this 指向表单,而表单会自动把带有 name 属性的输入框挂载为自己的属性。

详细解释如下:

  1. this 指向谁?info.addEventListener('submit', function (e) { ... }) 中,你使用了普通函数(而不是箭头函数)作为回调。在这种情况下,函数内部的 this 指向触发事件的元素,也就是你的 <form class="info"> 元素本身。

  2. 表单的神奇特性 HTML 标准规定,<form> 元素会自动通过 name 属性来收集它内部的表单控件。 因为你在 HTML 中写了:

    <input type="text" class="uname" name="uname" />

    不管是浏览器还是 DOM 都会自动在 form 对象上创建一个名为 uname 的属性,直接指向这个 input 元素。

    所以:

    • this = 你的 <form> 标签
    • this.uname = 你的 <input name="uname"> 标签
    • this.uname.value = 该输入框里的值

总结: 这种写法是完全合法的,而且如果不使用 document.querySelector 单独获取每个 input,这种写法反而更简洁、更方便!前提是你的 input 标签必须有 name 属性。

对象属性名的注意点#

如果你的属性名(键名)不是固定的,而是存储在一个变量里的,那你必须把它用 [] 中括号 包起来。

这叫 “计算属性名” (Computed Property Names)

举个例子对比#

假设我们要存分数,但是这个分数是属于“数学”还是“英语”不确定,存在变里 subject 里。

1. 错误的写法(不加括号)#

let subject = 'math'; // 变量里存着 'math'
let score = 99;
let obj = {
subject: score // ❌ 错误
};
console.log(obj);
// 输出: { subject: 99 }
// 变成了属性名就在叫 "subject",而不是我们想要的 "math"

2. 正确的写法(加中括号)#

let subject = 'math';
let score = 99;
let obj = {
[subject]: score // ✅ 正确!告诉 JS:去把 subject 变量里的值取出来当名字
};
console.log(obj);
// 输出: { math: 99 }
// 成功!属性名变成了变量里存的 'math'

回到你的代码#

在你的代码里:

uname: uname
  • 冒号左边没有加 [],所以 JS 就认为你非常确定这个属性名就叫字符串 "uname",不管你外面有没有一个叫 uname 的变量,它都叫 "uname"
  • 如果你写成 [uname]: uname,那属性名就会变成你输入框里填写的名字(比如 { "迪丽热巴": "迪丽热巴" }),这通常不是我们想要的结构。

浏览器默认提交行为#

没关系,我们可以用一个非常直观的对比来理解。

你可以把“表单提交的默认行为”想象成寄信

1. 浏览器的“老习惯”(默认行为)#

在早期的网页中,<form> 表单的设计初衷就是为了把数据发给服务器。

  • 动作:当你点击“添加”按钮。
  • 默认行为:浏览器觉得你要把信寄出去,它会跑去邮局(刷新页面),把信寄走,然后重新加载整个世界。
  • 后果:你的页面会白屏闪烁一下,重新加载。虽然你的数据可能存下了,但用户体验感觉像是在不断的“重启”网页。

2. 我们想要的效果(阻止默认行为)#

在这个案例里,我们是在做“单页应用”的效果,数据是记在本地(LocalStorage)的,不需要真的寄信给服务器。

  • 动作:当你点击“添加”按钮。
  • 代码 e.preventDefault():这就像是你按住了浏览器的肩膀说:“别动!别跑去邮局(别刷新)!
  • 结果:浏览器保持在当前画面不动,控制权完全交给你的 JavaScript 代码(把数据加到数组、更新表格显示)。
  • 体验:页面纹丝不动,只是表格里悄悄多了一行数据,感觉非常流畅。

最简单的验证方法#

如果你想亲眼看看区别,可以做一个小实验:

  1. e.preventDefault() 这行代码前面加 // 注释掉:
    // e.preventDefault()
  2. 去页面上随便填点数据,点击“添加”按钮。
  3. 你会发现:网页地址栏会闪一下,或者页面会刷新一下

这就是为什么要加这行代码的原因:我们要的是现代 App 那样流畅的“无刷新”体验,而不是老网页那样点一下刷新一下。

赞助支持

如果这篇文章对你有帮助,欢迎赞助支持!

赞助
今日学习-表单的默认特性,浏览器默认提交行为,对象属性名的注意点
https://firefly.cuteleaf.cn/posts/study-everyday/2026-02-14今日学习-表单的默认特性浏览器默认提交行为对象属性名的注意点/
作者
LJC
发布于
2026-02-14
许可协议
CC BY-NC-SA 4.0
最后更新于 2026-02-14,距今已过 34 天

部分内容可能已过时

目录