阅读量:0
pwa + iframe
当a域名没有使用pwa,
b域名项目使用了pwa,
把b嵌套在a中:
<title>没有使用pwa的a项目</title> <iframe frameborder="0" height="100%" src="https://b.com" width="100%"></iframe>
打开a网站会发现,a网站是没有pwa的安装按钮的。
a网站没有pwa的原因
其实主要在于iframe
下能否触发子页面的beforeinstallprompt
?
简单来说:
beforeinstallprompt
事件是用于 Progressive Web Apps (PWA)
的一个事件,它会在浏览器准备好显示安装提示时触发。根据 Web 的安全模型,beforeinstallprompt
事件只能在顶级上下文中被触发,即在主页面中,而不能在 iframe
中触发。
因此,子组件(在 iframe
中的内容)是无法直接触发 beforeinstallprompt
事件的。如果需要在 iframe
中的内容提示用户安装 PWA
,建议在主页面中处理这个事件,并根据需要与 iframe
中的内容进行通信,例如使用 postMessage
API 进行跨域通信。
总结来说,iframe
不能直接触发子组件的 beforeinstallprompt
,而需要通过父页面的处理来实现与用户交互的功能。
具体来说:
beforeinstallprompt
事件是为了支持 Progressive Web Apps (PWA)
的安装而设计的,它在浏览器决定可以显示安装提示时触发。由于安全
和用户体验
的原因,某些限制被施加在这个事件的触发和响应上。
- 安全性:
iframe
可能加载来自不同源的内容,这可能会引发安全问题。允许iframe
中的页面触发beforeinstallprompt
事件可能会导致恶意页面诱导用户安装不安全的应用
。因此,浏览器限制了该事件的触发权限,只在顶级上下文中允许
。 - 用户体验: 通过限制
beforeinstallprompt
事件的触发,仅允许顶级页面处理,确保用户在明确的上下文中接收到安装提示。这样可以避免在嵌入的iframe
中出现意外的安装提示,从而提升用户体验。 - 浏览器实施: 不同的浏览器在处理 PWA 和相关事件(如
beforeinstallprompt
)时,通常采取了一致的策略,确保用户的行为不会被嵌套内容(如 iframe)意外干扰
。
有关 PWA 和相关事件的行为可以在以下文档中找到:
- MDN Web Docs - beforeinstallprompt:(该文档描述了 beforeinstallprompt事件的触发条件和使用方法)
- Google Developers - Progressive Web Apps:(介绍了 PWA 的概念,包括安装提示的处理。)
- W3C - Web App Manifest:(这是 PWA相关的标准文档,其中也提到了与应用安装相关的行为。)
总结
基于安全性和用户体验的考虑,beforeinstallprompt
事件只能在顶级上下文中触发,而无法通过 iframe
直接触发。如果需要在 iframe
中进行相应的操作,建议通过父页面进行处理并与 iframe
之间进行通信。