INPUT
元素 (type="file"
) 并模拟点击。var createAndCallFileSelect = function () {
var input = document.createElement ("input");
input.setAttribute ("type", "file");
input.addEventListener ("change", function () {
console.log (this.files);
}, false);
input.click();
}
它大部分时间都很好用,但有时会在选择文件(或与INPUT上的multiple属性一起使用时选择多个文件)时无法触发onChange事件。我知道如果您重新选择相同的文件,onChange不会触发,但显然这里并非如此。它只有第一次使用此函数时才不触发事件,而且有时只有第一次。如果从对话框中选择了某些内容,则每次单击都可以正常触发onChange事件。我已经尝试在这里和周围搜索这个问题,但似乎所有onChange问题和解决方案都与重新选择相同的文件相关。我发现这在最新版的Opera和Firefox浏览器上发生,从未在其他浏览器上测试过。此外,我尝试等待整个页面加载完成,但结果仍然是相同的——有时不会在第一次调用时触发onChange事件。有人能告诉我为什么会这样吗?我已经有了解决方法,问题不在于此,我只需要解释为什么在创建并以这种方式调用INPUT时会发生这种情况。更新:级联延迟。
var function createAndCallFileSelect = function () {
var input = document.createElement ("input");
setTimeout (function () { // set type with 1s delay
input.setAttribute ("type", "file");
setTimeout (function () { // attach event with 1s delay
input.addEventListener ("change", function () {
console.log (this.files);
}, false);
setTimeout (function () { // simulate click with 1s delay
input.click();
}, 1000);
}, 1000);
}, 1000);
}
这也不起作用。我试图延迟每行代码的执行时间,以确保一切按正确顺序执行。在调用3秒后,它会打开文件选择对话框,但有时在选择文件后它不会触发 onChange
事件。