如何使用javascript打开文件/浏览对话框?

时间:2011-06-24 04:38:38

标签: javascript jquery

使用javascript点击<a href>链接时,有没有办法打开浏览文件对话框?它应该像普通的文件浏览按钮一样工作,并给出响应中选择的文件的名称/列表。

9 个答案:

答案 0 :(得分:54)

这是一个非jQuery解决方案。请注意,您不能只使用.click(),因为某些浏览器不支持它。

<script type="text/javascript">
function performClick(elemId) {
   var elem = document.getElementById(elemId);
   if(elem && document.createEvent) {
      var evt = document.createEvent("MouseEvents");
      evt.initEvent("click", true, false);
      elem.dispatchEvent(evt);
   }
}
</script>
<a href="#" onclick="performClick('theFile');">Open file dialog</a>
<input type="file" id="theFile" />

答案 1 :(得分:20)

使用此功能。

<script>
  function openFileOption()
{
  document.getElementById("file1").click();
}
</script>
     <input type="file" id="file1" style="display:none">
     <a href="#" onclick="openFileOption();return;">open File Dialog</a>

答案 2 :(得分:11)

不幸的是,使用JavaScript API浏览文件并不是一个好方法。幸运的是,在JavaScript中创建文件输入很容易,将事件处理程序绑定到其change事件,并模拟用户点击它。我们可以在不修改页面本身的情况下执行此操作:

$('<input type="file" multiple>').on('change', function () {
  console.log(this.files);
}).click();
第二行的

this.files是一个包含文件名,时间戳,大小和类型的数组。

答案 3 :(得分:10)

创建输入元素。

缺少这些答案是如何在页面上没有输入元素的情况下获取文件对话框。

显示输入文件对话框的功能。

function openFileDialog (accept, callback) {  // this function must be called from  a user
                                              // activation event (ie an onclick event)

    // Create an input element
    var inputElement = document.createElement("input");

    // Set its type to file
    inputElement.type = "file";

    // Set accept to the file types you want the user to select. 
    // Include both the file extension and the mime type
    inputElement.accept = accept;

    // set onchange event to call callback when user has selected file
    inputElement.addEventListener("change", callback)

    // dispatch a click event to open the file dialog
    inputElement.dispatchEvent(new MouseEvent("click")); 
}
  

注意该功能必须是用户激活的一部分,例如点击事件。尝试在没有用户激活的情况下打开文件对话框将失败。

     

注意 input.accept未在Edge

中使用

实施例。

当用户点击锚元素时调用上面的函数。

// wait for window to load
window.addEventListener("load", windowLoad);

// open a dialog function
function openFileDialog (accept, multy = false, callback) { 
    var inputElement = document.createElement("input");
    inputElement.type = "file";
    inputElement.accept = accept; // Note Edge does not support this attribute
    if (multy) {
        inputElement.multiple = multy;
    }
    if (typeof callback === "function") {
         inputElement.addEventListener("change", callback);
    }
    inputElement.dispatchEvent(new MouseEvent("click")); 
}

// onload event
function windowLoad () {
    // add user click event to userbutton
    userButton.addEventListener("click", openDialogClick);
}

// userButton click event
function openDialogClick () {
    // open file dialog for text files
    openFileDialog(".txt,text/plain", true, fileDialogChanged);
}

// file dialog onchange event handler
function fileDialogChanged (event) {
    [...this.files].forEach(file => {
        var div = document.createElement("div");
        div.className = "fileList common";
        div.textContent = file.name;
        userSelectedFiles.appendChild(div);
    });
}
.common {
    font-family: sans-serif;
    padding: 2px;
    margin : 2px;
    border-radius: 4px;
 }
.fileList {
    background: #229;
    color: white;
}
#userButton {
    background: #999;
    color: #000;
    width: 8em;
    text-align: center;
    cursor: pointer;
}

#userButton:hover {
   background : #4A4;
   color : white;
}
<a id = "userButton" class = "common" title = "Click to open file selection dialog">Open file dialog</a>
<div id = "userSelectedFiles" class = "common"></div>

警告以上代码段是用ES6编写的。

答案 4 :(得分:9)

这是一种在没有任何Javascript的情况下执行该操作的方法,它也可与任何浏览器兼容。


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


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

此外,如果您愿意,可以使用指向for的{​​{1}}中的label来使用&#34;正确方式&#34; 像这样的输入:

id

答案 5 :(得分:2)

您无法直接使用input.click(),但您可以在其他元素点击事件中调用此内容。

var a = document.querySelector('a');
var inpupt = document.querySelector('a');
a.addEventListener('click', function (e) {
    input.click();
});

这告诉你Using hidden file input elements using the click() method

答案 6 :(得分:0)

我知道这是一个旧帖子,但另一个简单的选择是根据兼容性使用INPUT TYPE =“FILE”标签,大多数主要浏览器都支持此功能。

答案 7 :(得分:0)

我通过这个&#34;隐藏&#34; div ...

<div STYLE="position:absolute;display:none;"><INPUT type='file' id='file1' name='files[]'></div>

答案 8 :(得分:0)

点击标记,点击文件按钮怎么样?

有更多的浏览器支持,但我使用 ES6 ,所以如果你真的想让它在老版本和任何浏览器中运行,请尝试使用babel进行转换,或者只是使用<强> ES5

const aTag = document.getElementById("open-file-uploader");
const fileInput = document.getElementById("input-button");
aTag.addEventListener("click", () => fileInput.click());
#input-button {
  position: abosulte;
  width: 1px;
  height: 1px;
  clip: rect(1px 1px 1px 1px);
  clip: rect(1px, 1px, 1px, 1px);
}
<a href="#" id="open-file-uploader">Open file uploader</a>
<input type="file" id="input-button" />