2011-07-25 18 views
1

我目前有一個需要一段時間才能加載的網頁。頁面的php一邊做了大量的數據處理和計算,這是(不幸的)不可避免的。我想在php正在處理時在頁面上顯示一些內容。不幸的是,頁面的大部分取決於php的計算。在收到所有數據之前呈現網頁

目前的解決方案,我有如下:

的HTML/PHP(開始):

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> 
<html> 
<head> 
<title id="title">Loading</title> 

<link href="style.css" rel="stylesheet" type="text/css"/> 
<script type="text/javascript" src="preLoading.js"></script> 
</head> 
<body onload="onLoad()"> 
<?php 
flush(); 
?> 
<?php 
// computation. 
?> 

的JavaScript:

document.write('<span id="loading">Please wait... Loading and processing data.</span>'); 

function onLoad() { 
    if (document.getElementById) { 
     var loading = document.getElementById("loading"); 
     loading.style.display="none"; 
    } 
} 

它運作良好,在這個意義上,雖然頁面正在渲染,頁面呈現時顯示一些等待消息。但它不起作用,因爲在渲染任何東西之前,頁面仍然等待所有要接收的數據。我怎樣才能完成後者?

需要注意的一件事:doctype前的空白行包含1024個空格,因爲我在某些地方(包括StackOverflow)讀取了瀏覽器在嘗試渲染任何內容之前等待讀取特定數量的字符。

任何想法,將不勝感激。瀏覽器充滿了神祕的技巧和黑客,使我神祕。

回答

1

試試這個:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> 
<html> 
<head> 
<title id="title">Loading</title> 

<link href="style.css" rel="stylesheet" type="text/css"/> 
<script type ="text/javascript" src="jquery.js"> </script> 

<script type="text/javascript"> 

$(document).ready(function(){ 
$.get('data.php', 
function(output) { 
$('#dataDiv').html(output).fadeIn(250); 
}); 
}); 

</script> 
</head> 
<body> 
<div id="dataDiv"> Please wait while loading... </div> 
<?php 
// computations placed in data.php file 
?> 

請注意,這需要使用jQuery的,你到你的PHP計算移動到「data.php」文件。

+0

謝謝,這就是我最終做的(略有改動)。 – duane

1

嘗試使用

flush(); ob_flush(); 

如在PHP手冊說明。這使得輸出儘可能靠近瀏覽器。

有關將緩衝區推入瀏覽器的更多信息,請參閱php手冊中的flush();

+0

當輸出緩衝關閉時,'ob_flush()'不起作用,並且在問題中沒有跡象表明它會開啓。 – phihag

+0

好的提示!謝謝。 – duane

0

您需要關閉輸出緩衝並隱式刷新輸出,因爲您的PHP進程執行其任務。

您可能想結算Output Buffering。另請注意,刷新緩衝區取決於瀏覽器以及它在顯示輸出之前的期望值。

A related question您可能會覺得有用。

+0

我沒有刷新PHP的輸出。看代碼。 – duane

+0

刷新是不夠的 - 您必須檢查PHP.ini文件中的輸出緩衝是打開還是關閉。在php手冊中看到這個註釋:http://www.php.net/manual/en/function.flush.php#99988 – Abs

4

更好的選擇是隻發送頁面的框架,然後通過AJAX調用獲取計算量大的數據。這樣,您可以放置​​一個佔位符頁面並在可用時填入內容。

這樣做的好處是,你不依賴於刷新緩衝區 - 不保證該數據實際上將被髮送到客戶端,只有在軟件堆棧中的下一個更高的層應該得到的所有內容正確現在。

缺點是,現在至少有兩個HTTP請求來生成頁面 - 一個用於獲取頁面的框架,至少有一個或多個用於AJAX請求獲取「填充空白「數據。

0
  1. 開始時嘗試將加載器消息放在body標籤後面。這種瀏覽器應該儘快顯示。
  2. 檢查默認情況下未啓用壓縮的配置(例如gzip)。
  3. 請勿使用表格。它們在完全加載之前不會呈現。
相關問題