我有一个文件上传表单。提交后,表单将数据发送到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);
}
不知道这是否会起作用:
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
)后完成上传?