🗒️<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