我有一个文件上传表单。提交后,表单会将数据发布到iframe,然后使用jQuery和PECL UploadProgress来获取文件的上传进度。当脚本请求上传进度且响应为空时,文件已完成上传,然后脚本会读取iframe以获取该文件的信息。
脚本以一个间隔运行,当响应为空时,该间隔将被清除。
我对脚本的问题在于,如果在对文件进行请求之前上传文件,则会发生错误,因为浏览器将尝试获取尚未设置的属性的值(响应将是空白的。)
如何在脚本尝试获取尚未设置的属性值之前检查文件是否已完成上传?
有没有办法向iframe添加某种类型的监听器,所以当它完成加载时,我可以立即取消间隔并显示结果?
我想在请求之前检查iframe的内容,如果有数据,请取消请求并显示数据,但它似乎不起作用。
我在IE中遇到错误:
Line: 37
Error: Unable to get value of the property 'filename': object is null or undefined
如果这看起来有点愚蠢,请提前道歉,我还没有睡觉,还没有找到解决这个问题的办法。
function beginUpload()
{
// Hide the upload form
$("#uploadContainer").hide(function(){
$(".fileProgress").show();
});
var interval = setInterval(function(){
$.getJSON("upload.php?uploadProgressKey=" + uploadProgressKey, function(returnData){
if($("#uploadFrame").contents().find("html body").html() !== "")
{
clearInterval(interval);
$("#content").html($("#uploadFrame").contents().find("html body").html());
}
if(returnData == null)
{
// Upload complete as there is not data to report about upload
// Stop the interval of checking the data
clearInterval(interval);
// Load result to content div
$("#content").html($("#uploadFrame").contents().find("html body").html());
}
setUploadInformation(returnData.filename, returnData.bytes_uploaded, returnData.bytes_total, returnData.speed_average);
setUploadBar(returnData.bytes_uploaded, returnData.bytes_total);
});
}, 800);
}
答案 0 :(得分:2)
不知道这是否会起作用:
function beginUpload() {
// Hide the upload form
$("#uploadContainer").hide(function(){
$(".fileProgress").show();
});
var checkProgress = function () {
$.getJSON("upload.php?uploadProgressKey=" + uploadProgressKey, function(returnData){
if($("#uploadFrame").contents().find("html body").html() !== "") {
clearInterval(interval);
$("#content").html($("#uploadFrame").contents().find("html body").html());
}
if(returnData == null) {
// Upload complete as there is not data to report about upload
// Stop the interval of checking the data
clearInterval(interval);
// Load result to content div
$("#content").html($("#uploadFrame").contents().find("html body").html());
}
setUploadInformation(returnData.filename, returnData.bytes_uploaded, returnData.bytes_total, returnData.speed_average);
setUploadBar(returnData.bytes_uploaded, returnData.bytes_total);
});
}
var interval = setInterval(checkProgress, 800);
checkProgress();
}
您的间隔在800ms后首先开始。我创建了函数checkProgress
并在初始化间隔后立即调用它。这样你就可以立刻开始检查。
如果第一次AJAX通话(getJSON
)在上传后完成,我认为你可以遇到同样的错误吗?