让人困惑的“history 前端路由” - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
angsheng
V2EX    分享发现

让人困惑的“history 前端路由”

  •  
  •   angsheng 2019-12-31 20:39:14 +08:00 2694 次点击
    这是一个创建于 2110 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我看到“前端技术”里边有这么个“通 window.history 实现“前端路由”,据说非常神奇、高端,不用在地址栏加#号了,简直是常人说不能及,会用了香车美女登顶人生巅峰,

    据说这种高级技术要用到“history.pushState 以及 window.onpopstate”。

    那么我就来看下它是怎么实现的吧?

    首先是 MDN 上的文档:

    “HTML5 引入了 history.pushState() 和 history.replaceState() 方法,它们分别可以添加和修改历史记录条目。这些方法通常与 window.onpopstate 配合使用”

    然后举例子细叙参数类型,总体来说就是这个玩意更改浏览器的历史记录,那个好像思路就有了,根据历史记录被更改了的事件,为事件注册处理程序来达到更改视图的目的,是不是??

    紧接着我就去看 popstate:

    “每当处于激活状态的历史记录条目发生变化时,popstate 事件就会在对应 window 对象上触发. 如果当前处于激活状态的历史记录条目是由 history.pushState()方法创建,或者由 history.replaceState()方法修改过的, 则 popstate 事件对象的 state 属性包含了这个历史记录条目的 state 对象的一个拷贝.

    调用 history.pushState()或者 history.replaceState()不会触发 popstate 事件. popstate 事件只会在浏览器某些行为下触发, 比如点击后退、前进按钮(或者在 Javascript 中调用 history.back()、history.forward()、history.go()方法).”

    看到这我就头大了,这到底是触发事件还是不触发事件??

    然后我就百度别人写的东西吧,上刑一般看了 CSDN 那些粘贴复制博文,

    连篇累牍、

    汗牛充栋、

    浩如云海,

    看了半天还是一头雾水!

    本想着这么一个小问题,花五分钟了解下,结果可好弄了一个多小时还没弄明白,直到我耐下性子细发现了这么一篇例子:

    https://blog.csdn.net/qq_33332184/article/details/90161368

    其中: $('a').on('click',function(){ console.log(this.text) var text = this.text; $('#router').html('

    '+ text +'

    ') history.pushState(null,null,'#/'+text); })

    简直让我惊呼!!

    原来所谓的通过 history 实现“前端路由”就是这么个意思:通过 history.pushstate 更改一下地址栏的字符串!!(至于视图处理的触发是仍然是通过其他的事件(这段代码里是 click ))

    没错,就是这么简单! 惊喜不惊喜?意外不意外?

    那现在看来 MDN 也没跟你说假话,人家只是说“配合使用”,也没讲什么“前端路由”。

    我只能是感叹前端的技术实在是夫俗子不能驾驭哦!

    2 条回复    2020-01-01 16:57:19 +08:00
    RyougiShiki
        1
    RyougiShiki  
       2019-12-31 23:05:31 +08:00
    同样感觉+1,刚开始没懂,history 以为跟历史记录前进后退函数有关。直到看到 vue-router 文档中关于 history 模式配置,apache、nginx、rewrite 这些关键字。
    为了 url 里少写一个# 真是煞费苦心,前端有时候太细了。
    angsheng
        2
    angsheng  
    OP
       2020-01-01 16:57:19 +08:00
    @RyougiShiki 你用“细”这个词总结。我其实是很想吐槽的,@#¥#!又怕做前端的朋友打我,哈哈哈
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5064 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 34ms UTC 09:39 PVG 17:39 LAX 02:39 JFK 05:39
    Do have faith in what you're doing.
    ubao 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