正如@cweitat所指出的那样,这始于HTML和浏览器的早期(您还记得马赛克浏览器吗?)。
当时页面数据与浏览器之间的交互仅限于HTML语法和语义。没有可用的javascript修改。
尽管如此,支持将文件(本地到浏览器)上传到服务器(提供页面的服务器)的需求已经得到了很好的接受。方法是提供按钮逻辑的版本以此来实现。按钮一直是除链接以外允许来自浏览器端的活动的HTML元素类型。
当时,在页面上显示的元素并没有考虑过“小部件”,因此可能没有人考虑为选择和上传文件的小部件提供足够的HTML元素设置来影响所有视觉和交互方面的细节。
随着DOM被规范化作为“页面”的表示和javascript成为程序化修改各种方面的机制,不足为奇的是,“用户”也试图获得越来越多的控制权以控制这些按钮的样式和视觉呈现方式。
另一方面,现在影响页面表示的可能性正在迅速增长(几乎爆炸),从而降低了“扩展”当前HTML元素语法的压力。(我看过很多网页,它们避免使用大多数标准HTML元素,而是使用一些javascript中的div元素。)
因此,浏览器控制
,因为他们必须提供适当的元素表示方式。由于没有规定该元素应遵循的内部表示方法,但有一些替代方法来实现该功能而不使用这种类型的元素,因此浏览器供应商不太可能麻烦展示页面开发者可以深入挖掘的内部状态(从而允许更多的控制)。
与其他按钮不同,文件输入按钮的视觉表示是一组不同的视觉组件。一个是按钮本身。另一个是显示所选文件的字段。此外(至少在逻辑上),显示可用文件、一些过滤逻辑和更多按钮的弹出窗口也是其功能的一部分。(即使后面的部分通常来自于窗口或操作系统环境,但这只是一个实现细节。)
现在仅仅通过HTML元素并不能以足够的细节指定样式。例如,指定背景颜色:这应该适用于按钮元素还是反馈区域(已选文件)或甚至文件选择弹出窗口?浏览器开发者可以决定向“用户”展示一些用于结构化组件的内部信息。然而,在以前,这并不足够“有趣”,今天您可以使用其他机制。