2011-08-22 51 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