dirname 属性仅在表单提交时自动添加 query.dir 字段(值为 ltr/rtl),需同时存在 name="query" 且 dirname="query.dir" 才生效;其方向由首个强方向 Unicode 字符决定,不影响显示对齐;Firefox 和部分 iOS Safari 不支持,后端须 fallback;与 dir 属性完全解耦。

dirname 属性不会改变输入框的显示方向,也不能靠它让阿拉伯文自动右对齐——它只在表单提交时多塞一个 xxx.dir 字段,值为 ltr 或 rtl,且这个值你完全不能手动控制。
dirname 必须和 name 同时存在才生效
单独写 dirname="query.dir" 没有任何效果。浏览器只在同时满足以下两个条件时,才会在提交数据中加入方向字段:
-
name属性必须存在,且值为query -
dirname的值必须严格等于"query.dir"(不能多空格、不能写成"query.direction"或"dir")
漏掉 name,或拼写不一致,Network 面板里根本看不到 query.dir 字段,后端也收不到。
方向值由首个强方向 Unicode 字符决定
不是输入法、不是 dir 属性、也不是 dir="auto",浏览器只看用户聚焦后敲下的第一个字符的 Unicode 双向类别(Bidi Class):
- 拉丁字母、数字、ASCII 标点 → 推断为
ltr - 阿拉伯字母(
\u0600–\u06FF)、希伯来字母(\u0590–\u05FF)→ 推断为rtl - 中文、日文、韩文属于“弱方向”,不触发
rtl,默认仍为ltr - 开头是空格、换行、零宽字符或中性标点(如,、。),大概率误判为
ltr
用户先输一个空格再输阿拉伯文,dirname 仍可能提交 ltr;切到阿拉伯语输入法但第一个字符是数字,结果还是 ltr。
服务端接收必须用方括号语法,且不能假设字段一定存在
提交后字段名是 query.dir,但 JS 对象里不能写 req.body.query.dir(点号非法)。正确访问方式取决于框架:
- Node.js/Express:
req.body["query.dir"],或确保urlencoded({ extended: true })已启用(默认已开) - PHP:
$_POST['query.dir']可直接读取 - Python/Flask:
request.form.get('query.dir')
更关键的是:Firefox 完全不支持 dirname;iOS Safari(截至 iOS 17.5)仍不支持;旧版 iOS Safari(15.4 之前)有 bug,软键盘弹出后总返回 ltr。这意味着后端必须做 fallback:比如检查 query 字符串首字符的 Unicode 范围,或结合 Accept-Language 请求头判断。
dirname 和 dir 属性完全解耦,不能互相替代
dir 控制渲染与交互:dir="rtl" 让光标从右开始、文本右对齐、Tab 焦点流反向;dirname 只管提交数据,对显示、光标、换行毫无影响。
常见错误是以为加了 dirname="msg.dir" 就能让阿拉伯文自动右对齐,结果页面仍是左对齐、光标乱跳。真正需要视觉/行为适配 RTL,必须显式写 dir="auto" 或 dir="rtl";真正需要告诉后端这次输入大概率是 RTL 内容,才加 dirname。两者常一起出现:<input name="msg" dir="auto" dirname="msg.dir">,但逻辑上完全独立。

















