dirname属性生成的字段名为“name.dir”,值为ltr或rtl,由用户首次输入的强方向Unicode字符决定,空值或弱方向字符时fallback为ltr,且不受dir属性或输入法影响。

dirname 属性提交的字段名和值怎么来的
dirname 不生成新字段,它只是让浏览器在表单提交时,自动附加一个以 name 值为前缀、后跟 .dir 的额外字段。比如 <input name="query" dirname="query.dir">,用户输入“مرحبا”,最终 POST 数据里会出现 query.dir=rtl;输“hello”,就是 query.dir=ltr。
这个行为完全由浏览器实现,无需 JS 干预,但字段名必须显式用 dirname 属性声明 —— 仅靠 dir="rtl" 或 CSS direction: rtl 不会触发该字段提交。
- 字段名必须是
name值 +.dir,不能自定义(如dirname="lang_dir"无效) - 值只有
ltr或rtl两种,没有auto或空值 - 如果输入为空,或只含弱方向字符(中文、空格、标点),
query.dir字段仍会提交,值为ltr(fallback 行为)
为什么阿拉伯语开头输空格后还是 ltr
dirname 的方向判定不看输入法、不读 dir 属性、也不管光标位置,它只扫描用户聚焦后**第一次敲下的强方向 Unicode 字符**。空格、换行、中文、英文标点(, . !)都属于“中性”或“弱方向”字符,不参与判定 —— 所以 " مرحبا"(开头空格+阿拉伯文)仍被识别为 ltr。
- 强方向字符范围:拉丁字母
a–z、数字0–9、ASCII 标点(如!,?)→ltr - 阿拉伯字母(
\u0600–\u06FF)、希伯来字母(\u0590–\u05FF)→rtl - 中文、日文、韩文、全角标点、零宽字符(
\u200e,\u200f)→ 不触发判定,fallback 到ltr
dir="auto" 对 dirname 完全没用
dir="auto" 只影响元素渲染时的文本排列和光标行为,它不参与 dirname 的方向推断逻辑。即使你写 <input dir="auto" dirname="q.dir">,提交的 q.dir 值依然只取决于第一个强方向字符,和 dir 属性无关。
- 想让 placeholder 或初始渲染适配 RTL?用
dir="auto"没问题,但它对提交数据无影响 - 服务端收到
q.dir=ltr时,不能反推用户用了什么输入法或系统语言 - 若需更可靠的方向信号,得配合 JS 监听
input事件 +getDirectionality()或手动检测首字符
服务端解析 dirname 字段要注意什么
提交来的 xxx.dir 字段是字符串,不是布尔值,也不是枚举类型。PHP/Python/Node.js 等后端框架通常会原样接收,但容易忽略两点:
- 字段可能缺失:用户没输任何内容,且表单未设
required,部分浏览器(如旧版 Safari)可能干脆不发xxx.dir字段 - 值不可信:用户可篡改 POST 数据,
xxx.dir=rtl不代表内容真是阿拉伯语,仅反映首个强方向字符 - 混合内容场景下,
xxx.dir只代表开头方向,中间插入 LTR 片段(如 URL)不会改变该值 —— 别拿它当全文方向依据
真正难的不是读这个字段,而是意识到它只解决“第一个字往哪边写”这一个问题,而不是“这段文字该怎么渲染”或“该怎么存储语义”。

















