以编程方式触发“选择文件”对话框

IT技术 javascript jquery html
2021-02-03 20:03:20

我有一个隐藏的文件输入元素。是否可以从按钮的单击事件触发其选择文件对话框?

6个回答

如果您希望拥有自己的按钮来上传文件而不是使用<input type="file" />,您可以执行以下操作:

<input id="myInput" type="file" style="visibility:hidden" />
<input type="button" value="Show Dialog" onclick="$('#myInput').click();" />

请注意,我使用了visibility: hidden, 而不是display: none. 您不能在未显示的文件输入上调用 click 事件。

对于基本情况很简单,但与许多浏览器不兼容。请注意,将此解决方案与在 opacity:0 处的按钮上覆盖文件输入元素相结合是一个更好的主意,正如 Xeon06 的回答中所述。
2021-03-19 20:03:20
更新:在现代浏览器中,您可以单击甚至不在 DOM 中的输入。惊人的!
2021-03-21 20:03:20
我刚刚尝试click()了一个display:none输入并且它起作用了
2021-04-01 20:03:20
是的,在 2015 年,click()在一个元素与display: none作品上!;) 在过去的四年里,事情发生了怎样的变化。
2021-04-05 20:03:20
您可以使用hidden属性代替style="visibility:hidden"<input id="myInput" type="file" hidden>w3schools.com/tags/att_global_hidden.asp
2021-04-10 20:03:20

这里的大多数答案都缺乏有用的信息:

是的,您可以使用 jQuery/JavaScript 以编程方式单击输入元素,但前提是您在属于用户启动的事件的事件处理程序中执行此操作!

因此,例如,如果脚本以编程方式单击 ajax 回调中的按钮,则不会发生任何事情,但是如果将同一行代码放入用户引发的事件处理程序中,它将起作用。

PSdebugger;如果在以编程方式单击之前,关键字会破坏浏览窗口...至少在 chrome 33 中...

您可以单击动态生成的内容。在 jquery 中,即$(staticElementParent).on("click", "dynamicChild", function(){})
2021-03-16 20:03:20
从 Chrome 62 开始,debugger;关键字不再干扰程序化点击
2021-03-22 20:03:20
正如@LouisBataillard 正确提到的:不仅原始事件处理程序需要由用户启动;它必须特别是一个点击事件。这是他提供的一个小提琴来证明这一点:链接
2021-03-26 20:03:20
谢谢!!!!我一直在 javascript 控制台中测试所有这些答案,我快疯了!
2021-03-28 20:03:20
我一直在努力以编程方式提示文件输入窗口半小时。NOBODY ELSE 表示,如果事件不是由用户发起的,那是不可能的……你应该得到很多 +1。
2021-04-01 20:03:20

只是为了记录,有一个不需要 javascript 的替代解决方案。这有点像黑客,利用点击标签将焦点设置在相关输入上的事实。

你需要一个<label>具有适当for属性(指向输入),可选样式像按钮(使用引导程序,使用btn btn-default)。当用户单击标签时,将打开对话框,例如:

<!-- optionnal, to add a bit of style -->
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/css/bootstrap.min.css" rel="stylesheet"/>

<!-- minimal setup -->
<label for="exampleInput" class="btn btn-default">
  Click me
</label>
<input type="file" id="exampleInput" style="display: none" />

这在没有任何 JS 的情况下工作,使用本机浏览器行为。配合 onDrop 事件,实现功能丰富的文件上传效果很好!
2021-03-29 20:03:20
这种行为在所有现代浏览器中都可靠吗?
2021-03-31 20:03:20
我不得不摆弄 CSS 但后来它起作用了 - 即具有“显示:无”的文件输入可见性在所有浏览器中都不好。(但可以使用 0 等不透明度)
2021-04-01 20:03:20
我喜欢这个,不想在我的 Angular 项目中包含完整的 jQuery,效果很好:)
2021-04-10 20:03:20

我不确定浏览器如何处理对type="file"元素的点击(安全问题和所有),但这应该有效:

$('input[type="file"]').click();

我已经在 Chrome、Firefox 和 Opera 中测试了这个 JSFiddle,它们都显示了文件浏览对话框。

如果输入不在 DOM 中,您知道如何使用 Selenium 进行测试吗?
2021-03-13 20:03:20
这似乎仅在“调用”事件本身是单击事件时才有效。例如,似乎不可能基于hover事件打开文件对话框jsfiddle.net/UQfaZ/1
2021-03-16 20:03:20

我将 包裹input[type=file]在标签标签中,然后label根据您的喜好设置样式,并隐藏input.

<label class="btn btn-default fileLabel" data-toggle="tooltip" data-placement="top" title="Upload">
    <input type="file">
    <span><i class="fa fa-upload"></i></span>
</label>

<style>
    .fileLabel input[type="file"] {
        position: fixed;
        top: -1000px;
    }
</style>

纯 CSS 解决方案。

只需设置<input type="file" hidden>即可消除应用 CSS 样式的需要。
2021-03-17 20:03:20