谁能说说 pjax 到底需不需要服务器配合使用?

2014-08-18 18:56:14 +08:00
 wangdaimishu
pjax 第一次用是在 Yii2 里,默认提供了Pjax.php这个组件,用法很简单,在需要局部刷新的地方写上:

<?php \yii\widgets\Pjax::begin(['id' => 'content']);?>
被包在里面的内容
<?php \yii\widgets\Pjax::end();?>

这样就行了,功能实现非常傻瓜化,效果也很好。

本来按照我的估计,pjax 的工作原理无非就是请求整个页面,然后用正则表达式将指定 id 里的内容匹配出来,然后替换掉原页面里的内容,达到局部刷新的效果。

但是当我用 firebug 之类的工具点开他请求链接的内容时就纳闷了,请求的 url 里返回来的内容就是我要刷新的那一小块,其他不相关的内容都没有。

以此推断,正则查找的过程没有在客户端,而是在服务器端完成的?

但是服务器怎么知道我具体要请求的是哪一小块内容?

通过 firebug 查看,发现请求的 Header 里多了两个东西:

X-PJAX:true
X-PJAX-Container:#w0

#w0 就是我要局部刷新的那一小块页面上的内容。

是不是X-PJAX-Container这个参数对服务器生效了?
5234 次点击
所在节点    问与答
7 条回复
akira
2014-08-18 22:42:18 +08:00
php不是跑在服务器端的么?
sodatea
2014-08-19 01:20:47 +08:00
显然的啊……如果请求的仍然是整个页面的话 PJAX 还有什么优势……
loading
2014-08-19 07:44:57 +08:00
如果你包起来,在pjax发起时,数据传输会少那么一点,只传你包起来那段。

pjax主要是提升用户体验,没有加载新页面是的白屏,。
对于ajax页面,因为有pushstate,可以用浏览器历史,浏览器的前进后退操作不会丢,url很完美,而不是普通ajax的 #!
loading
2014-08-19 07:50:37 +08:00
随意找了个:

http://www.ueffort.com/pjax-ji-shu/
pjax在浏览器就能做到,只是和服务器配合一下(X-PJAX),能达到最小传输量,如果你请求页面还有其他查询而pjax请求时不需要(例如部分cms没缓存的导航栏),会减少很多sql
wangdaimishu
2014-08-19 08:39:41 +08:00
@akira
@sodatea
@loading
@loading
我疑惑的是为什么Yii2的pjax 能准确知道我要更新哪一小块,后来我仔细阅读了一下 Pjax.php 这个组件的实现,发现是他在执行完以后立马就把内容发送出去了,不会像其他页面会整个渲染完一起发送到客户端去。
akira
2014-08-19 15:12:55 +08:00
@wangdaimishu 你需要先补充下ajax的相关知识点。。
wangdaimishu
2014-08-19 15:15:15 +08:00
@akira ajax 的东西我当然知道怎么回事,我疑惑的是为什么他能在服务端判断出我要的内容片段,不过现在明白怎么回事了,是 Yii2 框架本身处理了一下。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/128586

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX