🗒️<iframe>
<iframe> 元素代表一个嵌套的 browsing context(浏览上下文),嵌入另一个 HTML 页面。每个被嵌入的 browsing context 都有自己的 document 并允许 URL 导航。嵌入的那个叫 parent browsing context。
1. browsing context
browsing context 就是浏览器显示 Document 的环境。在现代浏览器中,它通常是一个 tab,也可以是一个 window,甚至可以只是 page 的一部分(比如 frame 或 iframe)。每个 browsing context 都有一个 origin 和一个有序的历史记录。browsing contexts 之间的通信有受限制。在同 origin 的 browsing contexts 之间,可以使用 BroadcastChannel 。
注意:每个 browsing context 都是一个完整的 document 环境,因此页面中的每个 <iframe> 都需要增加 memory 和其它 computing resources。所以,虽然理论上我们可以使用任意数量的 <iframe>,但需要检查是否存在性能问题。
2. 属性
除了全局属性之外,还有:
name
width height
srcdoc
嵌入的 inline HTML。优先级高于 src 属性
src
嵌入的 page URL
sandbox
控制对 <iframe> 中嵌入内容所应用的限制
值为空表示用所有限制
也可以解除特定限制-多个值之间用空格分隔
allow
指定 Permissions Policy(权限策略)
该策略根据 request 的 origin 来定义 <iframe> 可以使用哪些功能
比如访问 microphone, camera, battery, web-share 等
referrerpolicy
allowfullscreen
loading
试验中:
browsingtopics
credentialless
csp
已废弃:
longdesc
scrolling 行为
样式
align
frameborder
marginheight
marginwidth
allowpaymentrequest
3. 脚本
对于父文档:
window.frames伪数组(array-like object)里,就包含着内联 frames属性
contentWindow即 iframe 资源的window对象属性
contentDocument即 iframe 内的document,等价于contentWindow.document
对于被嵌入的 iframe:
window.parent可以取到其 parent window 的引用
脚本访问 frame 的 content,是受 same-origin policy 约束的。如果脚本是从不同 origin 加载的,那么它就不能访问其它 window 对象中的大多数 properties。Cross-origin communication 可以通过 Window.postMessage() 来实现。
https://developer.mozilla.org/en-US/docs/Web/API/Window
https://developer.mozilla.org/en-US/docs/Web/API/Window/frames
https://developer.mozilla.org/en-US/docs/Web/API/HTMLIFrameElement
https://developer.mozilla.org/en-US/docs/Web/API/HTMLIFrameElement/contentDocument
https://developer.mozilla.org/en-US/docs/Web/API/HTMLIFrameElement/contentWindow
https://developer.mozilla.org/en-US/docs/Web/API/Window/parent
https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage
4. 定位和缩放
作为 replaced element,可以使用属性 object-position 和 object-fit 来调整 iframe 元素框里 embedded document 的 position, alignment 和 scaling。
5. error 和 load 事件行为
error 和 load 事件行为在 <iframe>上触发的 error 和 load 事件,可用于探测 local network HTTP servers 的 URL space。因此,出于安全预防措施,用户代理不会在 <iframe> 上触发error事件,而 load 事件始终会被触发即使 <iframe> 的内容加载失败。
Last updated