花瓣网这种 Route 是如何做的 - V2EX
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 5802 次点击
    这是一个创建于 3719 天前的主题,其中的信息可能已经有所发展或是发生改变。
    花瓣( 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
    larnshare  
       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     Solana     945 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 22:23 PVG 06:23 LAX 14:23 JFK 17:23
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86