Javascript 从iframe上载文件时,Firefox中出现意外的NS\u错误

Javascript 从iframe上载文件时,Firefox中出现意外的NS\u错误,javascript,html,firefox,iframe,Javascript,Html,Firefox,Iframe,我试图允许用户上传文件,而不会在上传文件时导致页面更改。为此,我使用一个iframe,向其中添加一个表单和一个文件输入,然后在(隐藏的)iframe中提交表单。这在Chrome上运行良好,但在Firefox上不起作用 下面是导致此问题的代码 #漂亮的按钮{背景:蓝色;} #隐藏上载程序{显示:无;} addEventListener('DOMContentLoaded',function(){ var btn=document.getElementById('pretty-button');

我试图允许用户上传文件,而不会在上传文件时导致页面更改。为此,我使用一个iframe,向其中添加一个表单和一个文件输入,然后在(隐藏的)iframe中提交表单。这在Chrome上运行良好,但在Firefox上不起作用

下面是导致此问题的代码


#漂亮的按钮{背景:蓝色;}
#隐藏上载程序{显示:无;}
addEventListener('DOMContentLoaded',function(){
var btn=document.getElementById('pretty-button');
var filename_output=document.getElementById('filename');
var upload_iframe=document.getElementById('hidden-uploader');
btn.addEventListener('click',function(){
document.body.appendChild(上传iframe);
_document=upload_iframe.contentDocument;
var form=_document.createElement('form');
form.setAttribute('method','post');
setAttribute('enctype','multipart/formdata');
form.setAttribute('action','');
var file_input=_document.createElement('input');
file_input.setAttribute('type','file');
文件_input.setAttribute('name','document');
表单.appendChild(文件输入);
_文件.正文.附件(表格);
文件输入。单击();
文件\u input.addEventListener('change',function(){
log('file selected');
表单提交();
upload_iframe.addEventListener('load',function()){
log(“上传的文件”);
});
});
});
});
选择一个文件
在firefox上,当选择文件时,此操作失败,第33行出现
NS\u意外错误:
,即
form.submit()


你知道这里会发生什么吗?

我想我已经找到了问题所在,问题就在眼前

document.body.appendChild(upload_iframe);
这会导致iframe重新加载自身,这意味着iframe重新附加到文档正文之前的contentDocument与iframe重新附加到文档正文之后的contentDocument不同。文件对话框打开时会重新加载

这可以通过进行以下更改来验证:


#漂亮的按钮{背景:蓝色;}
#隐藏上载程序{显示:无;}
addEventListener('DOMContentLoaded',function(){
var btn=document.getElementById('pretty-button');
var filename_output=document.getElementById('filename');
var upload_iframe=document.getElementById('hidden-uploader');
btn.addEventListener('click',function(){
document.body.appendChild(上传iframe);
_document=upload_iframe.contentDocument;
var form=_document.createElement('form');
form.setAttribute('method','post');
setAttribute('enctype','multipart/formdata');
form.setAttribute('action','');
var file_input=_document.createElement('input');
file_input.setAttribute('type','file');
文件_input.setAttribute('name','document');
表单.appendChild(文件输入);
_文件.正文.附件(表格);
文件输入。单击();
//到目前为止,iframe尚未重新加载。
文件\u input.addEventListener('change',function(){
/*因为iframe的加载时间比它的加载时间短
*需要用户选择一个文件,即iframe
*现在已重新加载,并且_文档引用
*iframe的contentDocument不再是
*附在页面上。
*/
log('file selected');
var\u newDocument=upload\u iframe.contentDocument;
log(\u document==\u newDocument);//在Firefox中为false,在Chrome中为true
表单提交();
upload_iframe.addEventListener('load',function()){
log(“上传的文件”);
});
});
});
});
选择一个文件
通过删除有问题的行,上述内容在Firefox中开始工作