Page 50 - JavaScript修炼之道
P. 50

38       第三部分  UI技巧


             任务 17  在载入内容时保持显示区域


                 有时,你可能希望保持用户的显示区域(也就是在浏览器窗口中可见的所有东西)固定不变,
             哪怕是用户单击链接以在其上载入更多内容的时候。比如,用户单击查看前面的评论,你不会希
             望在上面载入评论之后用户的滚动位置就被推到下面去了吧。

                 这时,你会发现遇到了一点小障碍。感觉上用户应该是期望他们的页面位置没有变化。但是
             在上面载入内容时,你又必定会把文档的其余内容,包括被单击的那个地方,向显示区域下方推,
             而且很可能推到了显示区域之外。

                 解决办法是,保持相对于显示区域的滚动位置。要做到这一点,我们需要获取显示区域的
            “滚动偏移”,即在当前显示部分上方载入内容前显示区域的滚动位置,然后在载入内容之后恢复
             这个偏移。计算偏移非常麻烦,到处纠缠着跨浏览器的问题,好在Prototype等JS库提供了位置相
             关的功能来解决这个问题。

                                                   ①
                 右页的代码改写自Sam Stephenson的Gist 。在载入更多内容前,我们先获取触发链接在整个
             文档中的位置(也就是它的cumulativeOffset()),然后从中减去显示区域的当前滚动位置,
             就得到这个触发链接在显示区域中的出现离区域顶端的距离。新内容载入后,用这个减法的逆
             过程就能计算出显示区域的新偏移值。

                 熟悉Prototype的读者也许会奇怪为什么我这里用的是Ajax.Request,而没有用到更具体的
             Ajax.Updater。这是因为用Ajax.Request可以尽可能地推迟获得原来的滚动位置的时间,即在

             Ajax请求完成之后再获得。这样即使遇到用户在Ajax请求等待期间滚动了页面,也可以避免出
             现诡异的“滚动复位”效果。
                 这样一来,只需通过很少的代码就实现了相当不错的用户体验。
















             ——————————
                ① github的代码片段粘贴服务,该Gist位于https://gist.github.com/134653。*
   45   46   47   48   49   50   51   52   53   54   55