dirname属性只在表单提交时生效,且必须配name;它仅向提交数据中添加xxx.dir字段,方向由首个强方向unicode字符(如阿拉伯字母→rtl、拉丁字母→ltr)决定,不控制显示或交互,safari和firefox存在兼容性问题。

dirname 属性只在表单提交时生效,且必须配 name
dirname 不是实时监听器,也不是 CSS 控制开关,它只干一件事:表单提交瞬间,多塞一个 xxx.dir 字段。前提是 name 存在,且 dirname 的值严格等于 "xxx.dir"(xxx 必须和 name 完全一致)。漏掉 name,或写成 dirname="query.direction"、dirname="dir",浏览器直接忽略,Network 面板里根本看不到该字段。
方向值由首个强方向字符决定,不是输入法或 dir 属性
用户切到阿拉伯语输入法、或者写了 dir="rtl",都不影响 dirname 的判定结果。它只看用户聚焦后敲下的**第一个强方向 Unicode 字符**:
- 拉丁字母、数字、ASCII 标点 → 推断为
ltr - 阿拉伯字母(
\u0600–\u06FF)、希伯来字母(\u0590–\u05FF)→ 推断为rtl - 中文、日文、韩文属于“弱方向”,不触发
rtl,仍按ltr处理 - 开头是空格、换行、零宽字符或中性标点(如
,、。),方向大概率误判为ltr
dir="auto" 对 dirname 完全无效——它只作用于渲染,不参与方向推断。
服务端接收必须用方括号语法,且要容错缺失
提交后字段名是 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')
更关键的是:dirname 在 Firefox 中完全不支持;iOS Safari(截至 iOS 17.5)仍不支持;旧版 iOS Safari(15.4 之前)有 bug,软键盘弹出后总返回 ltr。这意味着你不能假设 query.dir 一定存在,后端必须做 fallback —— 比如检查首字符 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">,但逻辑上完全解耦。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











