我想要实现的是有一个按钮,允许用户上传文本文件,以便将其内容复制到<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>