记忆:input[number] 的 step 相对 min 递增(原生提示 JS 拦不到)+ 通配守卫
This commit is contained in:
@@ -93,3 +93,24 @@
|
|||||||
`MEMORY.md` 压到 **8919**(原 9285):合并「归属口径/防复发」与「跨备份/附属数据」两节
|
`MEMORY.md` 压到 **8919**(原 9285):合并「归属口径/防复发」与「跨备份/附属数据」两节
|
||||||
(同属归属)、若干长条目的**理由**下沉 details(规矩一字未删)、收紧自己新加的那条。
|
(同属归属)、若干长条目的**理由**下沉 details(规矩一字未删)、收紧自己新加的那条。
|
||||||
12 节 → 11 节。
|
12 节 → 11 节。
|
||||||
|
|
||||||
|
## 修 bug:半径输入框被浏览器原生校验误判
|
||||||
|
|
||||||
|
用户反馈「输入半径总是提示『请输入一个有效的值,最接近的两个有效值为 XX 和 XX』」。
|
||||||
|
|
||||||
|
**根因**:`<input type="number">` 的 **`step` 是相对 `min` 递增**的,不是「`step` 的整数倍」。
|
||||||
|
`min=0.05` + `step=0.5` ⇒ 合法值只有 `0.05 / 0.55 / 1.05 …`,于是 3、3.5、7.25 全被判非法。
|
||||||
|
关键是**这是浏览器原生提示**:JS 与后端都拦不到,我们自己的校验根本没机会说话。
|
||||||
|
|
||||||
|
实测对照(同一元素只换 step):
|
||||||
|
`step=0.5` → 0.05✓ 1✗ 3✗ 3.5✗ 7.25✗ 13.37✗;`step=0.05` → 13.37 仍✗;`step=any` → 全✓。
|
||||||
|
采用 `step="any"`,保留 `min/max`(真实边界 + spinner 范围),把校验交给 JS/后端。
|
||||||
|
|
||||||
|
**加了一条通配守卫**(`TestNumberInputStepNeverMismatchesMin`):扫**所有**模板的数字框,
|
||||||
|
凡「有 `min` 且有数值 `step`」就要求 `min` 是 `step` 的整数倍(或 `step="any"`);
|
||||||
|
JS 动态建的输入框模板扫不到,另用 `TestTopicAreaRadiusInputAllowsAnyStep` 钉住。
|
||||||
|
变异验证过(step 改回 0.5 ⇒ 守卫立刻红)。全站其它数字框(`radius_m` min=50/step=50)
|
||||||
|
本来就合法,未动。
|
||||||
|
|
||||||
|
**顺带**:把 `admin/topics.html` 的工作区行尾归一到 LF。`git add` 之后**零改动** ⇒
|
||||||
|
再次确认 blob 本来就是 LF,CRLF 只是检出产物(那条 CRLF 警告是 stat 缓存假象)。
|
||||||
|
|||||||
@@ -1228,6 +1228,15 @@ HTML,一行里必然带 `</script>`,一拒就把正常用法挡死了(我
|
|||||||
|
|
||||||
小坑:半径输入框得套一层**定宽容器**(`.area-km-box`)——站点全局 input 规则是
|
小坑:半径输入框得套一层**定宽容器**(`.area-km-box`)——站点全局 input 规则是
|
||||||
`width:100%` 且带 10 个 `:not()`(特异性 (0,11,1)),直接给 input 写宽度压不过。
|
`width:100%` 且带 10 个 `:not()`(特异性 (0,11,1)),直接给 input 写宽度压不过。
|
||||||
|
|
||||||
|
⚠️ **`<input type="number">` 的 `step` 是相对 `min` 递增的**,不是「`step` 的整数倍」:
|
||||||
|
`min=0.05` + `step=0.5` 的合法值只有 0.05/0.55/1.05…,用户填 3 或 3.5 会被 Chrome 判非法、
|
||||||
|
提交时弹「请输入有效值。两个最接近的有效值分别为 2.55 和 3.05」。**这是浏览器原生提示,
|
||||||
|
JS 与后端都拦不到**(我们的校验根本没机会说话)——只能在源头避免。
|
||||||
|
⇒ 要么 `step="any"`(交给 JS/后端校验),要么让 `min` 是 `step` 的整数倍。
|
||||||
|
`min`/`max` 可以留着(真实边界 + spinner 范围)。守卫 `TestNumberInputStepNeverMismatchesMin`
|
||||||
|
扫**所有**模板的数字框(不是只盯出问题那个),JS 动态建的另有
|
||||||
|
`TestTopicAreaRadiusInputAllowsAnyStep`。
|
||||||
`topic-areas.js` 只把**纯函数**暴露给 node 单测,另加最小测试钩子 `api._map`
|
`topic-areas.js` 只把**纯函数**暴露给 node 单测,另加最小测试钩子 `api._map`
|
||||||
供无头验证(同 `window.rondMap._state` 惯例)—— 不留把手就只能真拿鼠标点地图。
|
供无头验证(同 `window.rondMap._state` 惯例)—— 不留把手就只能真拿鼠标点地图。
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user