如何正确获取input type =“file”的内容?

时间:2017-09-25 21:14:09

标签: javascript html5 file-io

我想要实现的是有一个按钮,允许用户上传文本文件,以便将其内容复制到<textarea>元素中。

我使用JSFiddle得到了一个工作原型(FileReader API),但我觉得我的解决方案很差/效率很低。

以下是我正在做的总结版本:

当用户点击“打开文件”按钮时,我会创建一个隐藏的input元素(type="file"),并为其附加onchange事件处理程序。

当调用此处理程序时(即用户选择了一个文件),它会创建一个FileReader实例并为其onloadend事件附加一个新的处理程序。

FileReader处理程序在被调用时(即完成readAsText时),然后将textarea.value设置为FileReader实例的result属性。< / p>

由于我以前从未有过这种输入的经验,我的问题是:

这是'正确'/推荐方法吗?在性能,浏览器支持等方面,还有一种“更好”的方法吗?

这是一个包含JSFiddle代码的代码片段:

document.getElementById("open-btn").onclick = function open_file() {
    let dialog = document.createElement("input");
    dialog.setAttribute("type", "file");
    dialog.style.display = "none";

    dialog.onchange = function() {
        if(this.files.length !== 1)
            return console.warn("Must select 1 file");

        let reader = new FileReader();
        reader.onloadend = function() {
            let current_file = document.querySelector(".selected");
            let editor = document.getElementById("editor");

            if(current_file == null)
                return console.warn("No selected elements");

            if("length" in current_file && current_file.length != 1)
                return console.warn("Multiple selected elements");

            if(editor == null)
                return console.warn("No editor found");

            editor.value = this.result;
        }
        reader.readAsText(this.files[0]);
        document.body.removeChild(this);
    }
    
    document.body.appendChild(dialog);
    dialog.click();
}
* {
    margin: 0;
    border: 0;
    padding: 0;
    outline: 0;
    box-sizing: border-box;
    vertical-align: middle;
    list-style: none;
}
textarea {
    padding: 10px;
    min-width: 200px;
    min-height: 200px;
    font-size: 16px;
    line-height: 1.5;
    word-break: break-all;
    border: 1px solid #aeaeae;
    background-color: #fff;
    resize: none;
    overflow-wrap: normal;
    overflow-x: auto;
    white-space: pre;
}
button {
    cursor: pointer;
    user-select: none;
    border-radius: 1px;
    font-family: "Roboto", sans-serif;
    font-size: 16px;
    padding: 10px 20px;
    background-color: #b0ccff;
    box-shadow: 0 3px 0 cornflowerblue;
    transition: all .1s ease;
    margin: 5px;
}
button:active {
    transform: translateY(3px);
    box-shadow: 0 0px 0 cornflowerblue;
}
<textarea id="editor" class="selected"></textarea>
<button id="open-btn" onclick="open_file();"> Open File </button>

0 个答案:

没有答案