显然,Safari在提交事件期间不会重新绘制DOM。我的代码在提交处理程序中包含一个ajax函数。我无法将表单或提交按钮的操作更改为<button>
。在ajax函数内部,我正在计算进度条的宽度并相应地调整div。这适用于Chrome和FF。不在Safari中。当我停止浏览器时,进度条会显示。
我想知道如何强制Safari在我的ajax函数中重绘DOM。它看起来像这样:
$('#webfileuploadform').bind('submit',function(){
var $progress = $('<div id="upload-progress" class="upload-progress"></div>').appendTo($('#webfileuploadform')).append('<div class="progress-container"><div class="progress-info">uploading 0%</div><div class="progress-bar"></div></div>');
function update_progress_bar(){
$.ajax({
dataType:"json",
async: false,
url: progress_url,
success: function(data){
$progress.show(); // This shows the progress bar. I imagine
// this is where I would want to re-paint the DOM
if(data.status == "uploading"){
var total_progress = parseInt(data.uploaded) / parseInt(data.length);
var width = $progress.find('.progress-container').width();
var progress_width = Math.round(width * total_progress);
var progress_px = progress_width + 'px';
$progress.find('.progress-bar').animate({'width':progress_px});
$progress.find('.progress-info').text('uploading ' + parseInt(total_progress*100) + '%');
} else if (data.status == "not-found") {
$progress.find('.progress-bar').animate({'width':'100%'});
$progress.find('.progress-info').text('uploading 100%');
stop = 'Flag for end-of-file';
} else {
//console.log('Ajax Error');
}
},
error: function(textStatus){
console.log("ERROR: " + textStatus);
}
});
// Check flag to see if user stopped the page to cancel the ajax requests
if(typeof stop == 'undefined'){
// Iterates the ajax requests
setTimeout(function(){update_progress_bar()}, freq);
} else {
setTimeout(function(){
$progress.animate({opacity:0.5},1000);
},freq);
$progress.find('.progress-info').text('Refresh the page to continue.');
}
}
// Initiate the ajax requests
setTimeout(function(){update_progress_bar()}, freq);
});
答案 0 :(得分:0)
我建议使用forceDOMReflowJS。在您的情况下,您的代码将如下所示。此外,您的代码并没有完全正常工作,因为我认为它是有意的,所以我也修复了你的代码。
$('#webfileuploadform').bind('submit',function(){
var $progress = $('<div id="upload-progress" class="upload-progress"></div>');
// I believe you forgot to separate your attachments section of the code from
// the variable declaration
$progress.appendTo($('#webfileuploadform')).append('<div class="progress-container"><div class="progress-info">uploading 0%</div><div class="progress-bar"></div></div>');
function update_progress_bar(){
$.ajax({
dataType:"json",
async: false,
url: progress_url,
success: function(data){
$progress.show();
////////////////////////////////////////////////////////////////////////////////
// Perform the reflow (even though I don't really see how it would change things)
forceReflowJS( $progress[0] );
////////////////////////////////////////////////////////////////////////////////
if(data.status == "uploading"){
var total_progress = parseInt(data.uploaded) / parseInt(data.length);
var width = $progress.find('.progress-container').width();
var progress_width = Math.round(width * total_progress);
var progress_px = progress_width + 'px';
$progress.find('.progress-bar').animate({'width':progress_px});
$progress.find('.progress-info').text('uploading ' + parseInt(total_progress*100) + '%');
} else if (data.status == "not-found") {
$progress.find('.progress-bar').animate({'width':'100%'});
$progress.find('.progress-info').text('uploading 100%');
stop = 'Flag for end-of-file';
} else {
//console.log('Ajax Error');
}
},
error: function(textStatus){
console.log("ERROR: " + textStatus);
}
});
// Check flag to see if user stopped the page to cancel the ajax requests
if(typeof stop == 'undefined'){
// Iterates the ajax requests
setTimeout(function(){update_progress_bar()}, freq);
} else {
setTimeout(function(){
$progress.animate({opacity:0.5},1000);
},freq);
$progress.find('.progress-info').text('Refresh the page to continue.');
}
}
// Initiate the ajax requests
setTimeout(function(){update_progress_bar()}, freq);
});