网页导航之约 0.1.0
此包令浏览器中豫言之客改当前页之址与历史:离此而往他处、易当前之址、重载,及不离本页而压入或替换历史(以地址栏之查询参数记“开某项目、某版本”之类态)。回退与前进所生之 popstate、hashchange,不在此包,以[网页事件之约](../网页事件/规范.文言.md)订“窗口”得之(类曰历史)。读当前网址全文,用网页文树包之读取页面网址;解与改网址,用网址定位、网址查询二包。客依此包,诸术皆当具。
址之律
诸术之“址”参数,皆依当前页之网址而解(可为绝对网址,亦可为 /路径、?查询、#锚 等相对之引),且当合:
- 长至多八千一百九十二 UTF-16 码元,不得为空,不得含 ASCII 控制字符(零至三十一、一百二十七)与反斜杠;
- 解后之协议惟 http: 或 https:(javascript:、data:、blob:、file: 等一概拒之)。
违约则发豫言事故(中文辞,可捕)。
诸术
前往网址:字符串,返有
等于 location.assign(址):于历史留一条而往新址(可他来源)。页随即卸,此调之后客之代码不保证行;欲于离前所为(存稿之类)当先于调用完成。
替换当前网址:字符串,返有
等于 location.replace(址):以新址易当前历史项,退不复至旧址(登录跳转常用)。页随即卸。
重载页面:有,返有
等于 location.reload()。页随即卸。
压入历史:字符串,返有;替换历史:字符串,返有
等于 history.pushState(null, '', 址) 与 history.replaceState(null, '', 址):惟改地址栏与历史,不重载、不触发 popstate,状态物恒为 null。址解后须与当前页同源,否则发事故(浏览器亦拒之)。常法:择一项目则压入历史(“/cloud/?project=…”),筛选变则替换历史。
移动历史:整数,返有
等于 history.go(n):负则后退,正则前进;零无效(重载用重载页面),绝对值至多五十。移动异步而成,浏览器随后触发 popstate(同文档内)或径卸其页(离本文档时)。
与他包之配
- 读当前址:网页文树包之读取页面网址、读取页面查询参数。
- 拼带查询之址:网址查询包与网址包。
- 回退与前进:网页事件包订阅界面事件(“窗口”,“popstate”,“{}”),事类曰历史,详情
{"网址":当前址,"状态":null}。客既收,自决重读址而更界面,或重载页面。
限额与败
| 项 | 限 | | --- | --- | | 址长 | 至多八千一百九十二 UTF-16 码元 | | 移动历史 | 一至五十,或负五十至负一 |
违约之调用(址不合、压入或替换非同源、步数越界)发事故;浏览器因页正卸或历史操作过繁而拒之,亦发事故。宿主已闭则发事故。
一致性之例
- 当前页
https://例.站/cloud/?service=code:压入历史(“/cloud/?project=甲”)后读取页面网址为https://例.站/cloud/?project=甲,popstate 不发;移动历史(负一)后归原址,并收一类曰历史、名曰 popstate 之事。 - 压入历史(“https://别处.站/”):发事故(非同源)。
- 前往网址(“javascript:alert(1)”)、前往网址(“data:text/html,x”):发事故。
- 前往网址(“?panel=终端”)解为当前路径加新查询而往。
- 替换历史(“#锚”)后址带 #锚,历史条数不变。
界
此包不定:历史状态物(恒 null)、window.open(新窗与弹窗)、beforeunload 之问、Navigation API、单页路由库、下载与链接之点击(用 a[href] 与界面事件)。