在 JavaScript 中打开文件对话框

IT技术 javascript file dialog
2021-01-28 13:34:24

我需要一个解决方案来在单击 .html 文件时以 HTML 显示打开文件对话框divdiv单击时必须打开打开文件对话框

我不想将输入文件框显示为 HTML 页面的一部分。它必须显示在单独的对话框中,而不是网页的一部分。

6个回答

    $("#logo").css('opacity','0');
    
    $("#select_logo").click(function(e){
       e.preventDefault();
       $("#logo").trigger('click');
    });
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<a href="#" id="select_logo">Select Logo</a> <input type="file" id="logo">

对于 IE,添加以下内容:

$("#logo").css('filter','alpha(opacity = 0');
为什么在 #select_logo 点击处理程序中返回 false?
2021-03-30 13:34:24
虽然我还没有对其进行足够的测试,但“可见性:隐藏;” 似乎更兼容。此外,尽管 opacity: 0 单击“invisible”元素会触发单击事件,而visibility: hidden 不会。
2021-04-01 13:34:24
你应该把它转换成普通的 Javascript,在这么小的项目上使用 JQuery 是不合逻辑的 ^_^
2021-04-01 13:34:24
MDN 表明这就document.getElementById("logo").click()足够了。他们还展示了另一种方式“拖放”。developer.mozilla.org/en-US/docs/Web/API/File/...
2021-04-03 13:34:24
它不会产生 404 错误,它只会尝试导航到当前页面,并在末尾添加 #。这将使页面跳转到顶部。所以很高兴在那里,只是出于不同的原因:)
2021-04-12 13:34:24

我不知道为什么没有人指出这一点,但这是一种无需任何 Javascript 的方法,并且它也与任何浏览器兼容。


编辑:在 Safari 中,input使用display: none. 更好的方法是使用position: fixed; top: -100em.

编辑 2:另一种方法是使用opacity: 0. 问题是它可能会弄乱布局。我在示例中添加了一些 CSS 来说明问题。


label {
    display: inline-block;
    background: #ddd;
    border: 1px outset #ccc;
    border-radius: .3em;
    padding: .3em 1em;
    margin: .5em;
}

label:active {
  border-style: inset;
}
<label>
  Using <code>position: fixed</code>
  <input type="file" style="position: fixed; top: -100%">
</label>

<label>
  Using <code>opacity: 0</code>
  <input type="file" style="opacity: 0">
</label>

如果您愿意,可以通过指向输入的 中使用“正确的方式”如下所示:forlabelid

<label for="inputId">file dialog</label>
<input id="inputId" type="file" style="position: fixed; top: -100em">
伟大的!即使带有背景图像或使标签收到触发的点击,它也能像魅力一样工作。谢谢!
2021-03-15 13:34:24
顺便说一句,有人指出了这个解决方案的一个问题,在 Safari 中,隐藏的输入display: none被禁用。解决方法是使用不同的方法来隐藏输入。我会更新答案以反映这一点。
2021-03-15 13:34:24
@JPdelaTorre 如果您使用 opacity: 0 来隐藏输入会更好。
2021-03-19 13:34:24
这就像魅力一样,但是,这里有一些建议: 1.<input>标签应该有name属性;2. 如果for指定了属性,<input>文件标签将需要一个id.
2021-03-23 13:34:24
Simplicity is the ultimate sophistication
2021-03-23 13:34:24

这是一个不错的

精细上传演示

<input type='file' />本身就是一个控件。但是在它上面放置了一个 div 并应用了 css 样式来获得这种感觉。文件控件的不透明度设置为 0,以便在单击 div 时显示对话框窗口。

@Ajax3.14 无需使用 FileReader 或解析扩展。许多浏览器支持文件输入的 accept 属性。这允许您限制文件浏览器对话框中显示的文件类型。Fine Uploader 通过验证选项的 acceptFiles 属性提供对此功能的访问。有关更多详细信息,请参阅选项文档验证部分请注意,IE9 或更早版本不支持 accept 属性。
2021-03-15 13:34:24
@Ajax3.14 新浏览器具有 FileReader 对象,旧浏览器您必须使用该值并查找文件扩展名。
2021-03-28 13:34:24
@KatLimRuiz 不,您链接的答案不是一个好的解决方案。如果您最终也以编程方式提交关联的表单,这将导致 IE 抛出错误。
2021-03-28 13:34:24
这怎么好?这是一个很好的做法吗?不应该是这样的:stackoverflow.com/a/18659941/915865
2021-03-30 13:34:24
有没有办法通过 javascript 控制显示的文件...说我想打开文件对话框,只想显示带有 .pdf 的文件扩展名..
2021-04-12 13:34:24

实际上,您不需要所有具有不透明度、可见性、<input>样式等的东西。只需看看:

<a href="#">Just click me.</a>
<script type="text/javascript">
    $("a").click(function() {
        // creating input on-the-fly
        var input = $(document.createElement("input"));
        input.attr("type", "file");
        // add onchange handler if you wish to get the file :)
        input.trigger("click"); // opening dialog
        return false; // avoiding navigation
    });
</script>

jsFiddle 上的演示在 Chrome 30.0 和 Firefox 24.0 中测试。但是,在 Opera 12.16 中不起作用。

@Charleston 不幸的是,它在某些浏览器中不起作用。他们应该让它工作:)
2021-03-30 13:34:24
到 2020 年,这个解决方案似乎是最好的。在 Edge、Safari、Opera、Firefox 和 Chrome 中的 BrowserStack 上对其进行了测试。适用于所有这些。
2021-03-31 13:34:24
这是一个危险的解决方案,可能会导致意外问题。例如,如果文件输入也以编程方式打开,某些浏览器(如 IE)可能会阻止编程形式提交。解决这个问题的最好方法是使用 CSS,而不是 JavaScript。
2021-04-10 13:34:24
这应该是正确答案。对于纯 Javascript 实现,不需要修改任何 HTML 代码。
2021-04-12 13:34:24
愚蠢的问题,但是之后您将如何获得所选文件?
2021-04-12 13:34:24

最简单的方法:

#file-input {
  display: none;
}
<label for="file-input">
  <div>Click this div and select a file</div>
</label>
<input type="file" id="file-input"/>

重要的是,使用 ofdisplay: none确保隐藏文件输入不会占用任何地方(使用 会发生什么opacity: 0)。

如此简单有效,我觉得这是最好的解决方案!
2021-03-24 13:34:24