JavaScript中的“打开文件”对话框


109

我需要一种解决方案,以在单击时以HTML显示打开文件对话框divdiv单击时,必须打开打开文件对话框。

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


4
警报不是文件对话框?-您能澄清您的要求吗?
LiamB 2010年

3
我认为他是说他想要标准的“打开文件”弹出窗口
Valentin Rocher 2010年

1
单击div时,我需要打开文件对话框。它必须像警报一样,它不属于网页的一部分
ArK 2010年

Answers:


52

这是一个不错的

精美的上载器演示

<input type='file' />本身就是一个控件。但是,将div放在该对象上,并应用CSS样式来获得该感觉。文件控件的不透明度设置为0,以便在单击div时似乎打开了对话框窗口。


1
有没有办法通过JavaScript来控制显示的文件...说我想打开文件对话框,只想文件扩展名为.pdf显示..
Ajax3.14

1
@ Ajax3.14新浏览器具有FileReader对象,旧浏览器必须使用该值并查找文件扩展名。
Vicary 2013年

2
@ Ajax3.14无需使用FileReader或解析扩展名。许多浏览器在文件输入上支持accept属性。这使您可以限制在文件浏览器对话框中显示的文件类型。Fine Uploader通过验证选项的acceptFiles属性提供对此功能的访问。有关更多详细信息,请参见选项文档的“ 验证”部分。请注意,IE9或更早版本不支持accept属性。
Ray Nicholus 2013年

1
怎么这么好?这是一个好习惯吗?不应该是这样的:stackoverflow.com/a/18659941/915865吗?
Kat Lim Ruiz 2013年

1
@KatLimRuiz不,您链接到的答案不是一个好的解决方案。如果最终还是以编程方式提交关联的表单,这将导致IE引发错误。
Ray Nicholus

77

    $("#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');

3
为什么在#select_logo点击处理程序中返回false?
Sethish 2012年

4
它不会产生404错误,它只会尝试导航到当前页面,并在末尾添加#。这会使页面跳到顶部。所以去那里很高兴,只是出于不同的原因:)
manavo

3
尽管我还没有对它进行足够的测试,但是“可见性:隐藏;” 似乎更兼容。此外,尽管不透明度:0,但如果单击“不可见”元素,则将触发单击事件,而可见性:隐藏则不会。
阿隆(Aron)2013年

MDN表示document.getElementById("logo").click()已足够。它们还显示了另一种“拖放”方式。developer.mozilla.org/en-US/docs/Web/API/File/…–
Eric

2
您应该将其转换为普通的Javascript,在如此小的项目上使用JQuery是不逻辑的^ _ ^
SirCode先生,19年

57

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


编辑:在Safari中,input当用隐藏时,将被禁用display: none。更好的方法是使用position: fixed; top: -100em


<label>
  Open file dialog
  <input type="file" style="position: fixed; top: -100em">
</label>

如果你愿意,你可以走了“正确的方式”使用forlabel指向id这样输入:

<label for="inputId">file dialog</label>
<input id="inputId" type="file" style="position: fixed; top: -100em">

4
这就像魅力一样,但是,这里有一些建议:1. <input>标签应具有name属性;2.如果for指定了属性,则<input>文件标签将需要一个id
猛禽2015年

5
Simplicity is the ultimate sophistication
ncubica

2
大!即使具有背景图片,也可以使标签像标签一样起作用,也可以使标签接收到触发的JavaScript单击。谢谢!
Leo Nomdedeu

2
顺便说一句,有人指出了此解决方案的一个陷阱,在Safari中,隐藏display: none有的输入被禁用。解决方法是使用另一种方法隐藏输入。我将更新答案以反映这一点。
JP de la Torre 2015年

1
@JPdelaTorre如果使用opacity:0而不是隐藏输入,那会更好。
阿德里安

39

实际上,您不需要具有不透明度,可见性,<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中不起作用。


3
这应该是正确的答案。对于纯Java脚本实现,不需要修改任何HTML代码。
张巴兹

21
愚蠢的问题,但是之后您将如何获得所选文件?
杰伊·威克

2
这是一个危险的解决方案,可能会导致意外问题。例如,如果文件输入也以编程方式打开,则某些浏览器(例如IE)可能会阻止以编程方式提交表单。解决此问题的最佳方法是使用CSS,而不是JavaScript。
Ray Nicholus '16

3
@Charleston不幸的是,它在某些浏览器中不起作用。他们应该使它工作:)
Tigran Saluev

3
截至2020年,此解决方案似乎是最好的。在Edge,Safari,Opera,Firefox和Chrome的BrowserStack上进行了测试。适用于所有这些。
V. Rubinetti

14

这是最适合我的方法(在IE8,FF,Chrome,Safari上进行了测试)。

#file-input {
  cursor: pointer;
  outline: none;
  position: absolute;
  top: 0;
  left: 0;
  width: 0;
  height: 0;
  overflow: hidden;
  filter: alpha(opacity=0); /* IE < 9 */
  opacity: 0;
}
.input-label {
  cursor: pointer;
  position: relative;
  display: inline-block;
}
<label for="file-input" class="input-label">
  Click Me <!-- Replace with whatever text or icon you wish to use -->
  <input type="file" id="file-input">
</label>

说明: 我将文件输入直接放置在要单击的元素上方,因此所有单击都将落在该元素或其标签上(这将弹出上载对话框,就像单击标签本身一样)。我在默认输入的按钮部分伸出标签侧面时遇到了一些问题,因此overflow: hidden在输入和display: inline-block标签上都是必需的。


1
最大化输入并将不透明度设置为零。效果很好!
Kinorsi

13

如果在客户端计算机上关闭了javascript怎么办?在所有情况下均使用以下解决方案。您甚至不需要javascript / jQuery。:

的HTML

<label for="fileInput"><img src="File_upload_Img"><label>
<input type="file" id="fileInput"></label>

的CSS

#fileInput{opacity:0}  
body{
    background:cadetblue;
}

说明:for="Your input Id"。默认情况下通过HTML触发点击事件。因此,默认情况下它会触发click事件,不需要jQuery / javascript。如果只是通过HTML完成,为什么要使用jQuery / jScript?而且你不能告诉客户是否禁用了JS。即使关闭了JS,您的功能也应该正常工作。

工作jsFiddle(您不需要JS,jquery)


3
为什么是背景?
所罗门·乌科

12

首先添加head标签:

<script>
   function showDialog(openFileDialog) {
       document.getElementById(openFileDialog).click();
   }
   function fileName(openFileDialog) {
       return document.getElementById(openFileDialog).value;
   }
   function hasFile(openFileDialog) {
       return document.getElementById(openFileDialog).value != "";
   }
   function fileNameWithoutFakePath(openFileDialog) {
       var fileName = document.getElementById(openFileDialog).value;
       return fileName.substr(fileName.lastIndexOf('\\') + 1);
   }
   function fakePathWithoutFileName(openFileDialog) {
       var fileName = document.getElementById(openFileDialog).value;
       return fileName.substr(0, fileName.lastIndexOf('\\'));
   }
</script>

如果您已经有了脚本标签,只需在上面添加这些功能。

在您的身体表单标签中添加:

<input type="file" style="display:none" id="yourDesiredOrFavoriteNameForTheNewOpenFileDialogInstance"/>

无论身在何处在你的HTML,就是您所创建类型OpenFileDialog类作为一个新的实例全局变量,其名称为ID的元素,无论在你的代码或XAML,在你的脚本或代码,您不能键入他的名字,然后再读取属性或调用函数,因为有些全局函数可以执行元素输入type =“ file”中未定义的那些函数。您只需为这些函数提供隐藏输入type =“ file”的ID,它是OpenFileDialog实例的名称(字符串)。

为了简化您在html中创建打开文件对话框实例的过程,可以创建一个函数来执行此操作:

function createAndAddNewOpenFileDialog(name) {
     document.getElementById("yourBodyOrFormId").innerHtml += "<input type='file' style='display:none' id='" + name + "'/>"
}

如果要删除打开文件对话框,则可以进行以下操作:

function removeOpenFileDialog(name) {
    var html = document.getElementById("yourBodyOrFormId").innerHtml;
    html = html.replace("<input type='file' style='display:none' id='" + name + "'/>", "");
    document.getElementById("yourBodyOrFormId").innerHtml = html;
}

但是在删除打开文件对话框之前,请通过执行以下功能来确保存在该对话框:

function doesOpenFileDialogExist(name) {
    return document.getElementById("yourBodyOrFormId").innerHtml.indexOf("<input type='file' style='display:none' id='" + name + "'/>") != -1
}

并且如果您不想在html 的bodyform标签中创建和添加打开文件对话框,因为这是添加隐藏的输入type =“ file” s,则可以使用上面的create函数在脚本中进行操作:

function yourBodyOrFormId_onload() {
    createAndAddNewOpenFileDialog("openFileDialog1");
    createAndAddNewOpenFileDialog("openFileDialog2");
    createAndAddNewOpenFileDialog("openFileDialog3");
    createAndAddNewOpenFileDialog("File Upload");
    createAndAddNewOpenFileDialog("Image Upload");
    createAndAddNewOpenFileDialog("bla");
    //etc and rest of your code
}

确保在您的身体或表单标签附近添加了:

onload="yourBodyOrFormId_onload()"

如果您已经这样做,则不必在上面执行此行。

提示:如果尚未添加新的JScript文件,则可以将其添加到您的项目或网站中,并且可以在该文件中将所有打开的文件对话框功能置于script标签和html或Web表单页面之外,并使用它们可以从此JScript文件添加到html或Web表单页面中,但是当然不要忘记将html或Web表单页面链接到JScript文件。您只需将JScript文件拖到头部的 html页面中即可标签。如果您的页面是Web表单而不是简单的html,并且没有head标签,则将其放置在任何地方以使其正常工作。不要忘了在该JScript文件中定义全局变量,其值将是您的正文或表单ID(作为字符串)。将JScript文件链接到html或Web表单页面后,可以对表单正文进行onload事件,将该变量的值设置为正文或表单ID。然后,在JScript文件中,您不必再给文档的页面的正文或表单的ID了,只需给它提供该变量的值即可。您可以调用该变量bodyIdformIdbodyOrFormId或所需的任何其他名称。

祝你好运!


1
最好不要直接修改innerHTML。
所罗门·乌科

9

最简单的方法:

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

重要的是,使用display: none确保不隐藏文件输入占用任何空间(使用会发生什么情况opacity: 0)。


3

AFAIK您仍然需要一个<input type="file">元素,然后您可以使用quirksmode中的一些内容来对其进行样式设置



By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.