现代浏览器禁止对<input type="file">键盘输入路径,因其安全沙箱机制默认不提供该入口,JS赋值无效,readonly/disabled属性亦不生效,仅能通过accept、change校验、multiple等属性在用户主动选择后进行约束。

<input type="file"> 本身就不允许键盘输入路径——这是浏览器强制的安全机制,不是你能“禁止”的问题,而是它压根不提供这个入口。
为什么不能键盘输路径?
所有现代浏览器(Chrome、Firefox、Safari、Edge)都明确禁用对 <input type="file"> 的 value 属性赋值,也不响应键盘输入。你哪怕用 JS 写 el.value = "/tmp/test.pdf",执行后 el.value 依然是空字符串或 "C:\fakepath\..."(仅 IE/Edge 旧版有 fakepath,且不可控)。这不是 bug,是 W3C 规范和安全沙箱的硬性要求。
常见误操作:试图用 readonly 或 disabled 拦截
这两个属性对 <input type="file"> 完全无效:
-
readonly:只对文本类input(如type="text")生效,type="file"忽略该属性 -
disabled:虽能禁用点击,但会同时阻止文件选择 + 表单提交时完全不包含该字段,且无法恢复交互(除非 JS 移除属性),不是“禁输入”而是“禁一切”
真正可控的边界在哪?
你能干预的只有用户触发选择框之后的行为,而非绕过选择框本身:
立即学习“前端免费学习笔记(深入)”;
- 用
accept限制类型(如accept=".pdf,.docx"),但用户仍可手动切换文件类型筛选器或取消筛选 - 监听
change事件,在选中后校验files[0].type和files[0].size,不合规就清空input.files并提示 - 用
multiple控制是否允许多选,但无法禁止“选中”动作本身 - 视觉上隐藏原生控件,用
label包裹或透明层覆盖实现自定义按钮——这只是样式替换,底层仍是标准<input type="file">
记住:任何想绕过用户主动点击、自动填充路径、或用 JS 模拟选择的操作,都会被浏览器拦截。所谓“禁止键盘输路径”,其实是默认就做不到;你要做的,只是接受这个事实,并在选中后做校验与引导。



















