2011-08-22 49 views
0

基本上,我希望服務器能夠發送一些數據返回給客戶端,除了這些數據只有在整個HTML blob已經生成後纔可用。具體而言,我想提出一個時間來渲染(TTR)指示每一頁上:在HTML之外的HTTP響應中返回數據?

enter image description here

目前的時間正在從第一部分開始渲染到一點的點測出了該最後一個組件被渲染。但是,這忽略了中間件(我使用Django)在呈現主HTML Blob之前/之後所需的其他所有東西所需的時間。

如果我從最終的後處理點來衡量它,我不能只將TTR字符串附加到HTML blob上,因爲最終的/ html標記已經完成。我可以做一些聰明的正則表達式字符串替換東西插入裏面的blob,但感覺很髒。

我可以只追加關閉/體/ html標籤,直到這個東西做,但那種感覺同樣骯髒的:我不得不特意從休息分離出來的主要頁面的「結算」標籤的頁面,所以我可以把TTR指標放在那些標籤之前。

反正是有,我可以有一個完全的HTML頁面,只是釘在一些標籤將包含此信息的最終/體/ html標籤,那我可以使用Javascript到我的TTR格,而有它仍然是有效的HTML?或者是否有任何方法可以將元數據與HTML blob一起傳回,我的Javascript可以讀取這些元數據,並將其放入我的TTR div中?或者還有其他更好的方法來完成這個工作,我完全錯過了嗎?

回答

0

爲什麼不在生成時將容器放入HTML中,並使用您知道的字符串來填充文檔中的其他位置。那麼你可以簡單地str_replace()它在'後期處理'。

你可以,如果你的感覺很勇敢,試着做類似於sprintf()的事情,但我懷疑這會偶爾導致奇怪的輸出,因爲sprintf的轉換規範非常簡單,並且你可能會以它們結束故意出現在文件的某個地方。另外(至少在我的PHP 5.2.17/Win32上)sprintf()比單一替換項的str_replace()慢。

如果生成你作爲一個字符串頁面,不發送任何輸出到瀏覽器,直到最後一刻,或者你是輸出緩衝,你可以設置一個Cookie,可以從JavaScript訪問,讓瀏覽器做document.getElementById('an_element').innerHTML = cookieValue; onload,但我會說,依靠Javascript爲此會給你帶來另一層事情,一路走來/一般出錯。

如果無法通過你已經完成渲染HTML,因爲你已經派出一些內容的時間設置頭,你也有同樣的問題,因爲與靜態放置在頁面上的數據 - 你可以後添加<script></body></html>要麼...

+0

嗯,我沒有想到使用餅乾。他們看起來(一見鍾情)與我一直在尋找的一樣,除非我不會持續使用它們,而是在每一頁都發送一個新的。使用它們有什麼缺點嗎?將它們作爲鍵/值字符串的字典似乎是將這些數據從主HTML對象中分離出來的完美方式,我可以稍後將它們在正確的位置上加載到頁面上。這也可以解決我的其他一些問題。還有一些其他的HTML生成後變量,我想傳遞給javascript –

+0

Cookie的主要缺點是用戶可以禁用它們。除此之外,他們是一個相當可靠和標準化的 - 這是在同一個JS應該在每個瀏覽器中工作的罕見事物之一。在每個請求中發送一個新的cookie值應該沒有問題 - 這就是大多數Cookie驗證例程的工作原理。爲了讓自己有足夠的空間來輕鬆修正瀏覽器的愚蠢,請將cookie設置爲在會話結束時過期(將'0'傳遞給'set_cookie()''的'$ expire'參數),以便用戶可以關閉瀏覽器並重新 - 打開清除它們。 – DaveRandom

+0

劃傷'set_cookie()'引用,忘記了我們正在處理Python ......並且所有其他PHP引用都在回答中,哈哈! – DaveRandom