问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

history 源码分析

发布网友 发布时间:2024-10-10 04:44

我来回答

1个回答

热心网友 时间:2024-11-17 08:46

history库与源码分析

history库基于html5的history接口,专门用于管理和监控浏览器地址栏的变化。本文将分为两部分进行探讨:html5的history接口;以及history库的实现。


html5的history接口

通过使用html的history.pushState(state, title, url)方法,可以实现浏览器地址栏的变更,同时避免页面的刷新。配合ajax请求,这种操作可以实现局部刷新的效果。详细操作方法可以参考MANIPULATING HISTORY FOR FUN & PROFIT这篇文章。此外,若要确保回退按钮也能实现局部刷新,需要监听popstate事件。


history库的实现

history库构建了一个虚拟的history对象,它可以用于操作浏览器地址栏的变更、hash路径的变更或管理内存中的虚拟历史堆栈。各history对象都包含以下属性或方法:push(path, state)、replace(path, state)、go、goBack、goForward、block(prompt)和listen((location, action) => {})。


listen函数会在地址栏变更后执行。实现上,history会先收集历史堆栈入口的变更数据并写入虚拟的history对象中,然后再执行listen函数。这种机制涉及createBrowserHistory、createHashHistory和createMemoryHistory模块中的setState函数。因此,通过pushState、replaceState、go方法,或通过改变location对象来更新地址栏,都可以调用setState执行监听函数。


监听函数与阻断地址栏变更

history提供了两种阻断地址栏变更的方法:在变更前拦截和在变更后回滚。对于变更地址栏的三种方式:直接改变location对象、调用pushState或replaceState方法、或使用go方法,前两种我们能知道变更后的值,所以history选择在变更前拦截;后一种我们无法得知变更后的值,因此history选择在变更后回滚。实现上,history使用transitionManager.confirmTransitionTo包裹前两种方法的调用过程,并通过监听popstate和hashchange事件获得变更后的location数据,进一步使用transitionManager.confirmTransitionTo判断是否需要回滚或维持现状。


transitionManager的机制

transitionManager由createTransitionManager模块创建,提供四种方法:appendListener(fn)、notifyListeners(...args)、setPrompt(nextPrompt)和confirmTransitionTo(location, action, getUserConfirmation, callback)。这些方法共同协作触发监听函数、阻断地址栏变更。


不同历史库实现

本文将详细分析createBrowserHistory、createHashHistory和createMemoryHistory模块。


createBrowserHistory

createBrowserHistory基于html5中的pushState和replaceState来变更地址栏。它支持html5 history接口的浏览器,并在不支持时直接修改location.href或使用location.replace方法。此外,它接受props参数,如forceRefresh、getUserConfirmation、keyLength和basename,以控制地址栏变更的细节。


createHashHistory

createHashHistory专注于hash路径的变更,实现逻辑与createBrowserHistory类似,但针对hash路径进行专门处理。它接受basename、getUserConfirmation和hashType等属性,以定制hash路径的编码和解码策略。


createMemoryHistory

createMemoryHistory在内存中创建一个完全虚拟的历史堆栈,不与真实的地址栏交互,也与popstate、hashchange事件无关。它通过props参数控制初始历史堆栈内容、索引值和路径长度,实现对历史记录的管理。


工具函数

文章还介绍了PathUtils、LocationUtils和DOMUtils等工具函数,它们分别用于路径操作、location对象操作以及判断DOM环境。

热心网友 时间:2024-11-17 08:48

history库与源码分析

history库基于html5的history接口,专门用于管理和监控浏览器地址栏的变化。本文将分为两部分进行探讨:html5的history接口;以及history库的实现。


html5的history接口

通过使用html的history.pushState(state, title, url)方法,可以实现浏览器地址栏的变更,同时避免页面的刷新。配合ajax请求,这种操作可以实现局部刷新的效果。详细操作方法可以参考MANIPULATING HISTORY FOR FUN & PROFIT这篇文章。此外,若要确保回退按钮也能实现局部刷新,需要监听popstate事件。


history库的实现

history库构建了一个虚拟的history对象,它可以用于操作浏览器地址栏的变更、hash路径的变更或管理内存中的虚拟历史堆栈。各history对象都包含以下属性或方法:push(path, state)、replace(path, state)、go、goBack、goForward、block(prompt)和listen((location, action) => {})。


listen函数会在地址栏变更后执行。实现上,history会先收集历史堆栈入口的变更数据并写入虚拟的history对象中,然后再执行listen函数。这种机制涉及createBrowserHistory、createHashHistory和createMemoryHistory模块中的setState函数。因此,通过pushState、replaceState、go方法,或通过改变location对象来更新地址栏,都可以调用setState执行监听函数。


监听函数与阻断地址栏变更

history提供了两种阻断地址栏变更的方法:在变更前拦截和在变更后回滚。对于变更地址栏的三种方式:直接改变location对象、调用pushState或replaceState方法、或使用go方法,前两种我们能知道变更后的值,所以history选择在变更前拦截;后一种我们无法得知变更后的值,因此history选择在变更后回滚。实现上,history使用transitionManager.confirmTransitionTo包裹前两种方法的调用过程,并通过监听popstate和hashchange事件获得变更后的location数据,进一步使用transitionManager.confirmTransitionTo判断是否需要回滚或维持现状。


transitionManager的机制

transitionManager由createTransitionManager模块创建,提供四种方法:appendListener(fn)、notifyListeners(...args)、setPrompt(nextPrompt)和confirmTransitionTo(location, action, getUserConfirmation, callback)。这些方法共同协作触发监听函数、阻断地址栏变更。


不同历史库实现

本文将详细分析createBrowserHistory、createHashHistory和createMemoryHistory模块。


createBrowserHistory

createBrowserHistory基于html5中的pushState和replaceState来变更地址栏。它支持html5 history接口的浏览器,并在不支持时直接修改location.href或使用location.replace方法。此外,它接受props参数,如forceRefresh、getUserConfirmation、keyLength和basename,以控制地址栏变更的细节。


createHashHistory

createHashHistory专注于hash路径的变更,实现逻辑与createBrowserHistory类似,但针对hash路径进行专门处理。它接受basename、getUserConfirmation和hashType等属性,以定制hash路径的编码和解码策略。


createMemoryHistory

createMemoryHistory在内存中创建一个完全虚拟的历史堆栈,不与真实的地址栏交互,也与popstate、hashchange事件无关。它通过props参数控制初始历史堆栈内容、索引值和路径长度,实现对历史记录的管理。


工具函数

文章还介绍了PathUtils、LocationUtils和DOMUtils等工具函数,它们分别用于路径操作、location对象操作以及判断DOM环境。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
windows8怎么本地连接 windows8如何设置网络 诸葛亮故里诸葛亮故里纪念馆 临沂诸葛亮文化旅游节历届介绍 第四届诸葛亮文化旅游节纪念诞辰 ...请根据该表回答下面问题: (1)表中A、B、C分 ...请你分析样品A、B、C中代表血浆、原尿和尿液的样品分别是... c糖蛋白化验 江诗丹顿金属手表(江诗丹顿的手表女款) 定位最好的手表? 表带上的圈叫什么 荒野乱斗热区争夺模式玩法技巧 请问如何自己在家学做足疗?谁能给我个资料?我想给我爸我妈做做,谢了 在家做足疗 华数TV怎么投屏 华数tv更新之后投不了屏的原因有哪些 以l开头的字母和x开头的字母和y开头的字母,越多越好,要有中文, Y开头的英语单词,不要yo-yo和黄色? 弹幕视频有什么好看? 新鲜生姜怎么保存时间长 ...聊天保存在文件夹里的图片DAT文件用什么软件打开 戴尔Inspiron 灵越 560s(I560SD-158 纯蓝)基本规格 戴尔Inspiron 灵越 560s(I560SD-158 纯蓝)主要参数 戴尔Inspiron 灵越 560S基本参数 3999元戴尔Inspiron灵越560s电脑性能如何? 3800元戴尔560s家用电脑配置如何? 徐州镀锌方管厂家报价 女性稍微一热就满头大汗 星际争霸里面马特·霍纳这个角色重要吗? 四川南充市阆中古城历史名人中有那位是“抗金名将”、那位是“西征名将... 优先股股东有什么权利 古城阆中悠久历史 小米手机抢购如何捡漏 iphone没电了,充了好几个小时还开不了机怎么办 ...几个小时能充满?刚买的第一次充电充了十个小时还没满这正常吗... 埋线双眼皮多久可以用洗面奶洗脸 有哪些注意事项 产后40天月子病能治好吗,产后42天可以同房吗 如果得了月子病是不是产后一百天内都可以治 如何选择鲜甜的菠萝蜜? 如何选购比较甜的菠萝蜜? 菠萝蜜怎么选好吃又甜肉又多 全聚德的烤鸭外带可以放多久 ...朝阳区的便宜房烤鸭能否带走?能保存多长时间? 普洱茶的揉捻 普洱茶的制作工序之揉捻揉捻的作用 普洱茶制作工艺“揉捻”详解 【茶学入门】普洱茶制作工艺详解之揉捻 “揉捻”对优质普洱茶的重要性和目的 五香兔肉采用了哪些传统的烹饪技巧? 工伤医疗待遇外费用的承担应该由谁承担 长春轩五香兔肉制作 考察结束要不要感谢考察人员