在JavaScript中打开文件对话框

ArK*_*ArK 93 javascript dialog file

我需要一个解决方案来在HTML中显示打开文件对话框,同时单击a div.div单击时,必须打开打开文件对话框.

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

Som*_*atd 74

    $("#logo").css('opacity','0');
    
    $("#select_logo").click(function(e){
       e.preventDefault();
       $("#logo").trigger('click');
    });
Run Code Online (Sandbox Code Playgroud)
<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">
Run Code Online (Sandbox Code Playgroud)

对于IE添加这个:

$("#logo").css('filter','alpha(opacity = 0');
Run Code Online (Sandbox Code Playgroud)

  • 它不会产生404错误,只会尝试导航到当前页面,最后添加#.这将使页面跳到顶部.所以在那里很好,只是出于不同的原因:) (4认同)
  • 为什么在#select_logo点击处理程序中返回false? (3认同)
  • 虽然我没有对它进行足够的测试,但"可见性:隐藏;" 似乎更兼容.此外,尽管不透明度为0,但如果单击"不可见"元素,则会触发单击事件,而不会显示可见性:隐藏. (2认同)
  • @TacettinÖzbölük:欢迎你的朋友! (2认同)
  • MDN 表明 `document.getElementById("logo").click()` 就足够了。他们还展示了另一种方式“拖放”。https://developer.mozilla.org/en-US/docs/Web/API/File/Using_files_from_web_applications (2认同)
  • 你应该将其转换为普通的 Javascript,JQuery 在这么小的项目上使用是不合逻辑的 ^_^ (2认同)

JP *_*rre 51

我不知道为什么没有人指出这一点,但这是一种没有任何Javascript的方式,它也兼容任何浏览器.


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


<label>
  Open file dialog
  <input type="file" style="position: fixed; top: -100em">
</label>
Run Code Online (Sandbox Code Playgroud)

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

<label for="inputId">file dialog</label>
<input id="inputId" type="file" style="position: fixed; top: -100em">
Run Code Online (Sandbox Code Playgroud)

  • "简约是最终的复杂性" (5认同)
  • 这就像魅力一样,但是,这里有一些建议:1.``<input>`标签应该有`name`属性; 2.如果指定了`for`属性,`<input>`file标签将需要`id`. (4认同)
  • 大!它就像一个魅力,即使有背景图像或使标签接收点击javascript触发.谢谢! (2认同)
  • 顺便说一句,有人指出这个解决方案有一个问题,在Safari中,使用`display:none`隐藏的输入被禁用.解决方法是使用不同的方法来隐藏输入.我会更新答案以反映这一点. (2认同)

rah*_*hul 47

这是一个很好的

Fine Uploader演示

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

  • @ Ajax3.14无需使用FileReader或解析扩展.许多浏览器都支持文件输入的accept属性.这允许您限制文件浏览器对话框中显示的文件类型.Fine Uploader通过验证选项的acceptFiles属性提供对此功能的访问.有关详细信息,请参阅选项文档的[验证部分](http://docs.fineuploader.com/branch/master/integrating/options/fineuploaderbasic.html#validation-option-properties).请注意,IE9或更早版本不支持accept属性. (2认同)

Tig*_*uev 36

实际上,你不需要所有那些具有不透明度,可见度,<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>
Run Code Online (Sandbox Code Playgroud)

演示jsFiddle.在Chrome 30.0和Firefox 24.0中测试过.但是,在Opera 12.16中没有用.

  • 愚蠢的问题,但你怎么会得到所选的文件? (17认同)
  • 截至 2020 年,这个解决方案似乎是最好的。在 Edge、Safari、Opera、Firefox 和 Chrome 的 BrowserStack 上进行了测试。适用于所有这些。 (6认同)
  • 这应该是正确的答案.对于纯Javascript实现,不需要修改任何HTML代码. (3认同)
  • @Charleston不幸的是,它在某些浏览器中不起作用.他们应该让它工作:) (3认同)
  • 这是一个危险的解决方案,可能会导致意外问题.例如,如果文件输入也以编程方式打开,某些浏览器(例如IE)可能会阻止程序化表单提交.解决此问题的最佳方法是使用CSS,而不是JavaScript. (2认同)

Kar*_*lak 18

最简单的方法:

#file-input {
  display: none;
}
Run Code Online (Sandbox Code Playgroud)
<label for="file-input">
  <div>Click this div and select a file</div>
</label>
<input type="file" id="file-input"/>
Run Code Online (Sandbox Code Playgroud)

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


Chr*_*ris 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;
}
Run Code Online (Sandbox Code Playgroud)
<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>
Run Code Online (Sandbox Code Playgroud)

说明: 我将文件输入直接定位在要单击的元素上方,因此任何单击都会落在其上或其标签上(这会拉动上载对话框,就像您单击标签本身一样).我有一些问题,默认输入的按钮部分伸出标签的一侧,因此overflow: hidden在输入和display: inline-block标签上都是必要的.


Pra*_*tik 12

如果javascript在客户端计算机上关闭怎么办?对所有方案使用以下解决方案.你甚至不需要javascript/jQuery.:

HTML

<label for="fileInput"><img src="File_upload_Img"><label>
<input type="file" id="fileInput"></label>
Run Code Online (Sandbox Code Playgroud)

CSS

#fileInput{opacity:0}  
body{
    background:cadetblue;
}
Run Code Online (Sandbox Code Playgroud)

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

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

  • 为什么背景? (2认同)

小智 12

这是我在找不到好的解决方案后开发的解决方案

let input = document.createElement("input");
input.type = "file";
input.setAttribute("multiple", true);
input.setAttribute("accept", "image/*");
input.onchange = function (event) {
    //
    console.log(this.files);
};
input.click();
Run Code Online (Sandbox Code Playgroud)


小智 10

首先添加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>
Run Code Online (Sandbox Code Playgroud)

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

在您的正文表单标记中添加:

<input type="file" style="display:none" id="yourDesiredOrFavoriteNameForTheNewOpenFileDialogInstance"/>
Run Code Online (Sandbox Code Playgroud)

无论身在何处在你的HTML,只是喜欢你已经创建类型OpenFileDialog类作为一个新的实例全局变量,其名称为ID的元素,无论在你的代码或XAML,在你的脚本或代码,你不能输入他的名字,然后读取一个属性或调用一个函数,因为有一些全局函数可以做那些未在元素输入type ="file"中定义的函数.您只需要为这些函数提供隐藏输入类型="文件"的id,这是OpenFileDialog实例的名称作为字符串.

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

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

如果要删除打开的文件对话框,则可以创建并使用以下函数:

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;
}
Run Code Online (Sandbox Code Playgroud)

但在删除打开文件对话框之前,请通过制作和使用以下函数确保它存在:

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

如果你不想在html 中的bodyform标签中创建和添加打开的文件对话框,因为这是添加隐藏的输入type ="file",那么你可以使用上面的create function在脚本中完成:

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

确保靠近您的身体或表格标签,您添加了:

onload="yourBodyOrFormId_onload()"
Run Code Online (Sandbox Code Playgroud)

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

提示:您可以添加到您的项目或网站新的JScript文件,如果你没有还,而在这个文件中,你可以把所有的打开文件对话框的功能远离脚本标签和HTML或Web表单页面,使用它们位于此JScript文件的html或Web表单页面中,但在将html或Web表单页面链接到JScript文件之前不要忘记.您只需将JScript文件拖到head标签中的html页面即可.如果您的页面是Web表单而不是简单的html,并且您没有头标记,那么将它放在任何位置以便它可以工作.不要忘记在该JScript文件中定义全局变量,其值将是您的正文或表单ID为字符串.将JScript文件链接到html或Web表单页面后,可以加载表单主体的事件,将该变量的值设置为正文或表单ID.然后在JScript文件中,您不必再向文档提供一个页面的正文或形式的id,只需给它该变量的值.您可以调用该变量bodyIdformIdbodyOrFormId或您想要的任何其他名称.

祝你好运!


小智 8

  1. 将输入元素type="file"放在页面上的任何位置并使用style="display:none". 给输入元素一个id。例如id="myid"
<input type="file" style="display:none" id="myid"/>
Run Code Online (Sandbox Code Playgroud)
  1. 选择任何要用于打开文件对话框的 div、图像、按钮或任何元素,为其设置 onclick 属性,如下所示:
<a href="#" onclick="document.getElementById('myid').click()"/>
Run Code Online (Sandbox Code Playgroud)