今日学习-表单的默认特性,浏览器默认提交行为,对象属性名的注意点
欢迎来到我的博客!
使用 Markdown 格式编写。
今天学到了什么
- 表单的默认特性
- 对象属性名的注意点
- 浏览器默认提交行为
表单的默认特性
这是一个非常好的问题!你能这样写并成功获取数据,是因为利用了 DOM 表单元素(HTMLFormElement)的一个特性。
简单来说:this 指向表单,而表单会自动把带有 name 属性的输入框挂载为自己的属性。
详细解释如下:
-
this指向谁? 在info.addEventListener('submit', function (e) { ... })中,你使用了普通函数(而不是箭头函数)作为回调。在这种情况下,函数内部的this指向触发事件的元素,也就是你的<form class="info">元素本身。 -
表单的神奇特性 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 代码(把数据加到数组、更新表格显示)。
- 体验:页面纹丝不动,只是表格里悄悄多了一行数据,感觉非常流畅。
最简单的验证方法
如果你想亲眼看看区别,可以做一个小实验:
- 把
e.preventDefault()这行代码前面加//注释掉:// e.preventDefault() - 去页面上随便填点数据,点击“添加”按钮。
- 你会发现:网页地址栏会闪一下,或者页面会刷新一下。
这就是为什么要加这行代码的原因:我们要的是现代 App 那样流畅的“无刷新”体验,而不是老网页那样点一下刷新一下。
赞助支持
如果这篇文章对你有帮助,欢迎赞助支持!
部分内容可能已过时