我目前正在开发一个AJAX文件上传脚本,它在Firefox中就像魅力一样,但在IE中不起作用。
这是我正在使用的基本HTML:
<form >
<input type="file" name="FileFields" id="FileFields"/>
<button type="button" onclick="uploadFile();" id="uploadButton">Upload</button>
<ul id="files"/>
... other form elements ...
</form>
<div id="fileUploadDiv"/>
这是uploadFile函数:
function uploadFile()
{
//we don't want more then 5 files uploaded
if($('#files li').size() >= 5)
{
return;
}
//disable the upload button
$('#uploadButton').attr('disabled','disabled');
//show loading animation
$('#files').append(
$('<li>')
.attr('id','loading')
.append(
$('<img>').attr('src','/images/loading.gif')
)
.addClass('loading')
);
//add all neccessary elements (the form and the iframe)
$('#fileUploadDiv').append(
$('<form action="/uploadFile" method="post" id="fileUploadForm">')
.attr('enctype','multipart/form-data')
.attr('encoding', 'multipart/form-data')
.attr('target', 'upload_frame')
.append(
$('#FileFields').clone()
.css('visibility','hidden')
)
.append(
$('<iframe>').attr('name','upload_frame')
.load(function(){finishedPostingFile();})
.attr('id','upload_frame')
.attr('src','')
.css({
'width':'0px',
'height':'0px',
'border':'0px none #fff'
})
)
);
//start uploading the file
$('#fileUploadForm').submit();
}
一旦iframe完成发布/加载,和finishedPostingFile()将成为回调函数。
现在,这就像Firefox中的魅力,但在IE中不起作用。我已经发现IE需要attr('encoding',...)
而不是attr('enctype',...)
,而且我也尝试了它,而不是通过将这些元素写成普通的HTML来动态创建表单和iframe,这并没有真正有所作为。
答案 0 :(得分:4)
为什么不使用它,http://valums.com/ajax-upload/?
或者至少查看他们的代码,看看创建一个可以跨浏览器工作的表单的正确方法。
答案 1 :(得分:3)
我在第10行做了这个改变:
并且有效
if(window.ActiveXObject) {
var io;
try
{
//Your JavaScript code will be here, routine JavaScript statements area.
io = document.createElement('<iframe id="' + frameId + '" name="' + frameId + '" />');
}
catch(err)
{
//JavaScript Errors handling code will be here
io=document.createElement("iframe");
io.setAttribute("id",frameId);
io.setAttribute("name",frameId);
}
答案 2 :(得分:0)
这是Firefox / IE7 / IE8的一个工作示例,我目前正在为进度条使用jqueryUI对话框。
只需将“DocumentUploadForm”替换为表单的ID
即可$(document).ready(function() {
$("#DocumentUploadForm").submit(function(data) {
data.preventDefault;
var submittingForm = $("#DocumentUploadForm");
var frameName = ("Upload");
var uploadFrame = $("<iframe name=\"" + frameName + "\" />");
uploadFrame.css("display", "none");
$(".document_upload_progress").dialog({
autoOpen: true,
bgiframe: true,
resizable: false,
height: 150,
width: 350,
modal: true,
overlay: {
backgroundColor: '#000',
opacity: 0.5
},
open: function() {
$(this).parents(".ui-dialog:first").find(".ui-dialog-titlebar-close").remove();
},
close: function() {
$(".document_upload_progress").dialog("destroy");
}
});
uploadFrame.load(function(data) {
//submit complete
setTimeout(function() { uploadFrame.remove(); }, 100);
$('#document_upload_dialog').dialog('close');
});
$("body:first").append(uploadFrame);
//setup complete
submittingForm.attr("target", frameName);
});
});
HTH
答案 3 :(得分:0)
我猜你的框架永远不会被附加到IE中的DOM。 至少如果您发布的HTML已完成。因为它不包含id = fileUploadDiv
的任何div您可以通过添加非零宽度和高度的iframe来确认这一点,并将src设置为正确的URL。
答案 4 :(得分:0)
答案 5 :(得分:0)
我正在做一个非常类似的事情,我遇到的问题是IE8没有将文件上传到我的服务器;得到了一个IniSizeError。
我的解决方案是添加这一行:
form.encoding = "multipart/form-data";
创建时到我的表单。 还需要Enctype属性。