V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a JavaScript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
JavaScript 权威指南第 5 版
Closure: The Definitive Guide
kalintw
V2EX  ›  JavaScript

花瓣网这种 Route 是如何做的

  •  
  •   kalintw · 2015-09-06 17:09:54 +08:00 · 5318 次点击
    这是一个创建于 3368 天前的主题,其中的信息可能已经有所发展或是发生改变。
    花瓣( Pinterest )这种风格的 route :

    1. 在主页或者瀑布流列表页,点击单个 item
    1.1 地址栏变成单个 pin 的 url ,比如: http://huaban.com/pins/469222884 ,注意,此时页面并没有刷新;
    1.2 单个 pin 的内容是以 modal 的形式弹出来,覆盖在原来的瀑布流列表页上面,瀑布流列表页并没有remove;
    1.3 关闭 modal 单页,地址栏变回列表页 url

    2. 直接访问单个 item
    比如还是那个单个 pin 的 url : http://huaban.com/pins/469222884, 直接是内容页。


    请教前端的朋友,这种效果大概是怎么做的?是什么单独的技术,或者 best practice 吗?
    有没有相关的库、文章可以学习?
    19 条回复    2015-09-07 14:38:19 +08:00
    nowgoo
        1
    nowgoo  
       2015-09-06 17:16:44 +08:00
    nowgoo
        2
    nowgoo  
       2015-09-06 17:19:02 +08:00   ❤️ 1
    上面的链接挂了,关键词: html5 history api
    abelyao
        3
    abelyao  
       2015-09-06 17:21:40 +08:00   ❤️ 1
    基本就是楼上说的那样,大概的应用原理就是,点某个 item 的时候通过 AJAX 加载这个 item 的内容到列表页上,然后通过 window.history.pushState 改变当前地址栏显示的 url (实际上你还是停留在列表页)
    whahuzhihao
        4
    whahuzhihao  
       2015-09-06 17:21:59 +08:00
    history 类似的还有 网易云音乐 WEB 版这种跳转不会中断播放 也是用的这种特性
    ChefIsAwesome
        5
    ChefIsAwesome  
       2015-09-06 17:23:09 +08:00
    直接访问回页面, ajax 请求回数据。同一个数据要做两手准备,后端做起来挺麻烦的。
    fburst
        6
    fburst  
       2015-09-06 17:24:27 +08:00   ❤️ 1
    billdc
        7
    billdc  
       2015-09-06 17:31:39 +08:00   ❤️ 1
    现在主流框架都支持,楼上说得没错,有一些是用 html5 history api.
    pajax,react,angularjs 都支持,自己手动写比较麻烦,建议使用框架,这样对于不支持 html5 的浏览器,也能很好支持.
    ChefIsAwesome
        8
    ChefIsAwesome  
       2015-09-06 17:31:49 +08:00
    @whahuzhihao 网易那个是用 hash 做路由的,跟花瓣的不一样。
    kalintw
        9
    kalintw  
    OP
       2015-09-06 17:34:11 +08:00
    @whahuzhihao
    @nowgoo
    @abelyao
    @ChefIsAwesome
    @fburst
    @billdc

    知道方向就好找资料了,多谢各位回复!
    NemoAlex
        10
    NemoAlex  
       2015-09-06 17:48:08 +08:00   ❤️ 1
    楼上说的没错, HTML History API 。并不是什么新鲜的东西了。
    花瓣这个,具体的方案是用了 History.js ,会自动在不兼容的浏览器上使用 hash tag 来实现。
    learnshare
        11
    learnshare  
       2015-09-06 17:51:59 +08:00
    @whahuzhihao
    @ChefIsAwesome
    网易云音乐内嵌一个 iframe , URL 控制刷新 iframe 里的页面
    kalintw
        12
    kalintw  
    OP
       2015-09-06 18:08:38 +08:00
    @NemoAlex 多谢!
    monsun
        13
    monsun  
       2015-09-06 18:57:23 +08:00
    @whahuzhihao 网易云音乐之类的跟这个不太相同, 播放控件是放在外层,内页全部用 iframe 加载. 以前干过这档子事..
    coffce404
        14
    coffce404  
       2015-09-06 19:08:40 +08:00
    利用 HTML5 History API ,以前封装过这样的库 https://github.com/Coffcer/coffce-pjax
    在现代浏览器上使用 pushState ,在低版本浏览器上( IE8, IE9 )使用 hash ,对更低的 IE6~7 和不执行 js 的搜索引擎蜘蛛则保持默认跳转。
    不过已经很久不维护啦
    ttph1oc
        15
    ttph1oc  
       2015-09-06 19:45:14 +08:00
    直接访问和当前页弹框应该是两套模板。但我个人是很憎恨这样搞的,因为我认为相同路由就应该给我相同的响应。正面例子是 Chrome 应用商店。
    loading
        16
    loading  
       2015-09-06 19:49:12 +08:00 via iPhone
    搜 pjax 就是你要的东西。
    malcolmyu
        17
    malcolmyu  
       2015-09-07 11:47:17 +08:00
    关键词 pjax
    2015813
        18
    2015813  
       2015-09-07 11:59:24 +08:00
    相关内容 ajax
    keyanzhang
        19
    keyanzhang  
       2015-09-07 14:38:19 +08:00   ❤️ 1
    如果你用 React 的话,这份 react-router 的范例代码准确的实现了你的需求: https://github.com/rackt/react-router/blob/master/examples/pinterest/app.js
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3373 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 12:33 · PVG 20:33 · LAX 04:33 · JFK 07:33
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.