V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
wangdaimishu
V2EX  ›  问与答

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

  •  
  •   wangdaimishu · 2014-08-18 18:56:14 +08:00 · 5236 次点击
    这是一个创建于 3750 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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这个参数对服务器生效了?
    7 条回复    2014-08-19 15:15:15 +08:00
    akira
        1
    akira  
       2014-08-18 22:42:18 +08:00
    php不是跑在服务器端的么?
    sodatea
        2
    sodatea  
       2014-08-19 01:20:47 +08:00
    显然的啊……如果请求的仍然是整个页面的话 PJAX 还有什么优势……
    loading
        3
    loading  
       2014-08-19 07:44:57 +08:00 via Android
    如果你包起来,在pjax发起时,数据传输会少那么一点,只传你包起来那段。

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

    http://www.ueffort.com/pjax-ji-shu/
    pjax在浏览器就能做到,只是和服务器配合一下(X-PJAX),能达到最小传输量,如果你请求页面还有其他查询而pjax请求时不需要(例如部分cms没缓存的导航栏),会减少很多sql
    wangdaimishu
        5
    wangdaimishu  
    OP
       2014-08-19 08:39:41 +08:00
    @akira
    @sodatea
    @loading
    @loading
    我疑惑的是为什么Yii2的pjax 能准确知道我要更新哪一小块,后来我仔细阅读了一下 Pjax.php 这个组件的实现,发现是他在执行完以后立马就把内容发送出去了,不会像其他页面会整个渲染完一起发送到客户端去。
    akira
        6
    akira  
       2014-08-19 15:12:55 +08:00
    @wangdaimishu 你需要先补充下ajax的相关知识点。。
    wangdaimishu
        7
    wangdaimishu  
    OP
       2014-08-19 15:15:15 +08:00
    @akira ajax 的东西我当然知道怎么回事,我疑惑的是为什么他能在服务端判断出我要的内容片段,不过现在明白怎么回事了,是 Yii2 框架本身处理了一下。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2832 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 13:29 · PVG 21:29 · LAX 05:29 · JFK 08:29
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.