- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这两个示例都可以在 Chrome 和 Opera 中运行,但在 Firefox 56.0 中失败。
我想设置表单文件输入的files
FileList。[ Codepen ]
<form>
<input type="file" id="input1" multiple>
<br>
<input type="file" id="input2" multiple>
</form>
var input1 = document.getElementById("input1");
var input2 = document.getElementById("input2");
input1.onchange = function () {
console.log(input1.files);
input2.files = input1.files;
};
在 Chrome 和 Opera 上,在第一个输入中选择文件也会更改第二个输入。在 Firefox 中,即使控制台输出中的文件列表看起来是正确的,第二个输入也不会改变。
总体目标是创建一个拖放上传界面。
Prototype here .
最佳答案
能够将 FileList 设置为 input.files
属性已以编程方式添加为 an PR to the specs三个月前,即使 webkit 允许这样做多年。火狐 has landed a patch在其下一个稳定版本 57 和 Edge is probably still working on it 中(我没有帐户来查看进度)。看来它现在也登陆了 Edge。
此功能的主要用例是允许 DataTransfer.files
例如,从拖放事件或粘贴事件添加到 <input>
field 。因此,只允许使用 FileList(并且 null
来清除输入)。
因此,在您的问题正文中暴露的情况下,我真的不认为在两个 <input>
之间使用此功能有什么意义。字段。
如果您想在内存中保留选定的 FileList,您可以随时将其转换为文件数组。
如果您希望能够将填充的输入移动到 <form>
稍后,您可以直接使用 inputElement 和 DOM 方法来完成此操作。
如果您需要解决此新功能所利用的限制,您始终可以使用 DataTransfer 的文件填充 FormData,并通过 xhr 发送此 FormData,而不是使用默认的 HTML 表单方法。
<小时/>由于我第一次错过了真正的用例,因此在 codepen 中,这里有一个可能的实现来解决您面临的拖放问题,即使在不支持此新功能的旧浏览器上也是如此。
这使用了 dropZone 中的隐藏输入,它将直接捕获删除的文件。
// called when the input hidden in the dropZone changes
function handleDroppedChange(evt) {
this.removeEventListener('drop', handleDroppedChange); // only once
// create a new hidden input
var clone = this.cloneNode();
clone.addEventListener('change', handleDroppedChange);
clone.addEventListener('change', handleBasicChange);
this.parentNode.insertBefore(clone, this);
// replace the visible one with the current hidden one
var form = document.querySelector('form');
var previous = form.querySelector('input[type=file]');
form.insertBefore(this, previous);
form.removeChild(previous);
this.id = previous.id; // for the <label>
}
// add first listeners
var hiddenTarget = dropzone.querySelector('input[type="file"]');
hiddenTarget.addEventListener('change', handleDroppedChange);
hiddenTarget.addEventListener('change', handleBasicChange);
file_input.addEventListener('change', handleBasicChange);
// handle drop over enter leave as usual on the parent
dropzone.ondragover = dropzone.ondragenter = function(evt) {
evt.preventDefault();
dropzone.className = "drag";
};
dropzone.ondragleave = function(evt) {
evt.preventDefault();
dropzone.className = "";
};
dropzone.ondrop = function(evt) {
dropzone.className = "";
console.log("drop");
};
// will trigger for any kind of changes (dropped or manual)
function handleBasicChange(evt) {
var file_names = Array.prototype.map.call(this.files, function(f){return f.name;});
label.innerHTML = "Changed " + file_names.join('<br>');
// start upload process
};
#dropzone {
display: inline-block;
padding: 25px;
border: 8px dashed #b11;
position: relative;
}
#dropzone.drag {
border-color: #f74;
}
#dropzone>input{
opacity: 0;
position: absolute;
height: 100%;
width: 100%;
left: 0;
top: 0;
/* below rules avoid clicks on hidden input */
pointer-events: none;
}
#dropzone.drag>input{
pointer-events: all;
}
<form>
<input type="file" id="file_input" multiple>
</form><br><br>
<div id="dropzone">
<label id="label" for="file_input">Drop here.</label>
<!-- we use an hidden file input to catch the dropped files -->
<input type="file" multiple>
</div>
关于javascript - 在 Firefox 中设置 FileInput 的 FileList,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47746379/
这是一个简单的图像文件列表。 Object.keys(pet).forEach((key) => { if (key === "images") { formData.ap
我有一个类型为 "file" 的 input,我想更改它的 files 列表。示例: document.getElementById("fileinput").files = [10]; 问
我有: 每次用户选择一个文件时,我都会通过将 f.files 的每个元素推送到一个数组来构建所有选定文件的列表: var Files = []; function c() { for (var
我正在使用 FormData 上传我的 grails 项目中的多个文件。这些文件需要通过 Ajax 上传。我使用以下代码进行ajax上传。但在 Controller 中,我得到的参数为 [object
我有一个文件列表对象,其中包含 1000 多个图像文件。我希望对象按文件名(字母数字)排序。换句话说,我想做一个自然排序。文件名如下: d_1_ct.png d_2_ct.png d_3_ct.png
是否可以拆分 FileList实例(来自放置事件,event.dataTransfer.fileList),并将其中的每个文件分配给一个个体 元素? 例如,将放置事件中的所有文件(1 个或多个...)
使用 javascript 中的 fileReader 预览选定的文件 if i remove from previewed image. it must delete from selected f
有代码https://jsfiddle.net/bfzmm1hc/1一切看起来都很好,但我想从集合中删除一些文件。 我已经找到了这些: How to remove one specific selec
我有一个函数可以处理我页面上的拖放文件: function createDropHandlers() { var target = document; if (target === null)
我有一个 FileList 对象,其中包含以前上传的文档。我正在尝试使用另一个函数通过使用另一个 FileList 对象将更多文件添加到此集合中,因此我需要将辅助 FileList 对象“附加”到主要
我试图围绕一个特定的 for 循环声明来思考,但到目前为止我没有成功。代码片段允许您读取文件输入并通过 for 循环遍历所有对象: function handleFileSelect(evt)
我想使用 Typescript 使用 for in 循环遍历 FileList。我从一个常规的旧 for 循环开始,这非常有效: let files:FileList = e.target.files
我正在尝试创建一个拖放区域,它将通过 webkitGetAsEntry 获取 dataTransfer 项目,并检查该条目是目录还是文件。 然后我希望能够将文件制作成文件列表并将其复制到文件输入(将在
我正在尝试使用新的文件 API 对输入文件进行排序。它返回的列表似乎是不可变的: var x = ""; var files = e.target.files; // FileList object
文档:https://developer.mozilla.org/en-US/docs/Web/API/FileList 为什么 FileList 是对象而不是数组?它拥有的唯一属性是 .length
我正在使用 HTML5 构建一个拖放式上传 Web 应用程序,我将文件拖放到一个 div 上,当然还获取了 dataTransfer 对象,这为我提供了 FileList . 现在我想删除一些文件,但
我正在使用一个名为 react-dropzone 和 React-Redux 的 Node 包模块来允许用户将文件拖到窗口上并显示文件信息。 react-dropzone 组件为我提供了标准 even
我对前端开发非常陌生,我认为向当前上传页面添加拖放功能会很酷。然而,在开始使用 ng-flow (帮助拖放的指令)连接所有内容之后,我似乎无法建立有关如何将文件添加到文件列表的连接。如果您认为我什至不
我在 res/raw 文件夹中有一个 xml 文件,我想在我的应用程序中使用它。为什么我在真实设备上调试时 fileList() 看不到它? 最佳答案 ContextWrapper的fileList(
我正在研究谷歌驱动器集成。我已经使用谷歌控制台获取了 api 访问 key ,也完成了 oauth2 身份验证。我已经使用了谷歌日历集成并且它工作正常但是当我集成想要检索文件列表的驱动器时,它的返回为
我是一名优秀的程序员,十分优秀!