Drew's Workbench
iframe对history对象的影响
02.01.20192 Min Read — In Web开发

在实际问题中遇到在使用了iframe的情况下对前端路由的影响。应用的角度讲,这种方式不常用也不大会影响生活,不过浏览器如何处理这个情况确实是一个有意思的问题。遂做如下小实验:

┌─────────────────────────────────────────────────┐
│ Main window                                     │
╞═════════════════════════════════════════════════╡
│   Keep changing iframe.src and print history    │
│            +----------------------+             │
│            |                      |             │
│            |                      |             │
│            |    iFrame            |             │
│            |    (Print history)   |             │
│            |                      |             │
│            |                      |             │
│            +----------------------+             │
└─────────────────────────────────────────────────┘

由于安全策略的原因,history的内容并不能直接被访问,只有一个length属性可以看看stack的大小。所以这里所谓的print也只是打印下length和自己手动记录的src值而已,除了响应操作之外并没有太多意义。

问题

  • history在host和iframe中是否互相独立?
  • 如果不是,那是怎样的互相影响?

结论

  • host和iframe中的history实例是不同的,实例下对应的model是相同的(joint session history)

划重点:

history是所有fully activeDocument对象的所有browsing context的所有session history的合集。

简单说就是同一个session, 同一个history,甚至不同域也逃不掉(虽然依然收同源策略制约)。

其他takeaway:

  • history.length看看就好没啥意义,不同浏览器初始值都不同,变化也各种没谱,还有个最大值50
  • iframe.src的变化会反映到history中,同浏览器地址栏
  • document的路由基本不用考虑了,事件侦听和同步的成本比较大。