Javascript
function initialize_progress(element)
{
//initializations!
$(element).hide();
$(element).find('.progress-bar').prop('style','width: 0');
}
function getProgress(process_id){
var re=new RegExp(process_id+"=[^;]+", "i") //construct RE to search for target name/value pair
if (document.cookie.match(re)) //if cookie found
return document.cookie.match(re)[0].split("=")[1] //return its value
return null
}
function updateProgress(process_id, element){
var percentage, message, name, failed;
$(element).show();
var myIntervalID = setInterval(function()
{
percentage = getProgress(process_id+"_percentage");
name = getProgress(process_id+"_process_name");
message = getProgress(process_id+"_message");
failed = getProgress(process_id+"_process_failed");
if(percentage) $(element).find('.progress-bar').css('width',percentage+'%').html(percentage+"% "+message);
},2000);
}
//initialize progress bar
//initialize_progress(".progress");
$(".upload-button").click(function()
{
//set listener
updateProgress('upload_the_pix', ".progress")
var request = $.get( "http://example.com/?progress", function(data) {
alert(data);
})
.done(function() {
alert( "second success" )
}).fail(function() {
alert( "error" );
}).always(function() {
alert( "finished" );
});
});
HTML
<div class="progress">
<div class="progress-bar progress-bar-success progress-bar-striped active" role="progressbar" aria-valuenow="40" aria-valuemin="0" aria-valuemax="100" style="width: 0%">
</div>
</div>
服务器端进程 - 使用 PHP
class ProcessProgress
{
protected static $process_id; //current process_id
protected static $process_name; //current process name
protected static $debug_mode = false;
protected static $process_killed = false;
/**
* Make settings for process setup
* @param $settings
* Example:
* $settings=array(
* 'process_id' => 'upload_photos' //must be provided
'process_name' =>'Database Wipe', //tile of this process
);
*/
public static function settings($settings)
{
# process id must be set
#make array keys properties
if( is_array($settings) ){
foreach($settings as $key => $value){
self::$$key = $value;
}
}
if(self::$debug_mode && !self::$process_id) exit('process_id must me provided in settings array');
if(isset($_COOKIE[self::$process_id."_percentage"])){
unset($_COOKIE[self::$process_id."_percentage"]);
unset($_COOKIE[self::$process_id."_message"]);
unset($_COOKIE[self::$process_id."_process_name"]);
unset($_COOKIE[self::$process_id."_process_complete"]);
unset($_COOKIE[self::$process_id."_process_failed"]);
unset($_COOKIE[self::$process_id."_process_killed"]);
}
}
/**
* Kill this process
*/
public static function kill()
{
self::$process_killed = true;
}
/**
* @param $percentage
* @param $message
* @param bool $complete
* @param bool $failed
* @return bool
*/
public function setProgress($percentage, $message, $complete=false, $failed=false){
$process_data = array(
'percentage'=>$percentage,
'message' => $message,
'process_id' => self::$process_id,
'process_name' => self::$process_name,
'process_complete' => $complete,
'process_failed' => $failed,
'process_killed' => self::$process_killed,
);
setcookie(self::$process_id."_percentage", $percentage, time() + (86400 * 30)); // 86400 = 1 day
setcookie(self::$process_id."_message", $message, time() + (86400 * 30)); // 86400 = 1 day
setcookie(self::$process_id."_process_name", self::$process_name, time() + (86400 * 30)); // 86400 = 1 day
setcookie(self::$process_id."_process_complete", $complete, time() + (86400 * 30)); // 86400 = 1 day
setcookie(self::$process_id."_process_failed", $failed, time() + (86400 * 30)); // 86400 = 1 day
setcookie(self::$process_id."_process_killed", self::$process_killed, time() + (86400 * 30)); // 86400 = 1 day
//verify
if(isset($_COOKIE[self::$process_id])) return true;
#delay 1 second
//sleep(1);
}
}
点击按钮时在服务器端的使用
http://example.com/?progress
if(isset($_GET['progress'])){
ProcessProgress::settings(array(
'process_id' => 'upload_the_pix',
'process_name' => 'Picture Upload',
));
ProcessProgress::setProgress(0, 'Initializing');
for($count=0; $count < 10001; $count++){
switch($count){
case 1000:
ProcessProgress::setProgress(10, 'Coping files');
break;
case 2000:
ProcessProgress::setProgress(20, 'Setting up email');
break;
case 3000:
ProcessProgress::setProgress(30, 'Looking up things');
break;
case 4000:
ProcessProgress::setProgress(40, 'Milking your cow');
break;
case 5000:
ProcessProgress::setProgress(50, 'Syncing contacts');
break;
case 6000:
ProcessProgress::setProgress(60, 'Updating Facebook profile');
break;
case 7000:
ProcessProgress::setProgress(70, 'Calling your girl friend');
break;
case 8000:
ProcessProgress::setProgress(80, 'Making things up');
break;
case 9000:
ProcessProgress::setProgress(90, 'Feeding your dogs');
break;
case 10000:
ProcessProgress::setProgress(100, 'Done. Congrats');
break;
}
}
}