Chrome迁移至FedCM后,isNotDisplayed()等方法的替代方案问询
替代FedCM废弃方法的监控方案
FedCM(Federated Credential Management)更新后,原有的isDisplayMoment()、isDisplayed()、isNotDisplayed()及getNotDisplayedReason()状态监控方法已被移除,可通过以下原生API和事件逻辑替代:
1. 监控弹窗显示/关闭状态
- 利用
get()方法的Promise状态:调用navigator.credentials.get({ federated: { providers: [...] } })后,Promise的resolved/rejected状态可间接反映弹窗交互流程。若用户完成授权或主动关闭弹窗,Promise会触发对应状态变更;若调用后直接返回reject,则说明弹窗未被展示。 - 监听专属全局事件:Chrome提供了
fedcm-dialog-show和fedcm-dialog-close两个全局事件,可直接捕获弹窗的显示与关闭动作,示例代码:
window.addEventListener('fedcm-dialog-show', () => { // 弹窗已显示,执行对应监控逻辑 }); window.addEventListener('fedcm-dialog-close', () => { // 弹窗已关闭,执行对应监控逻辑 });
2. 获取弹窗未显示的原因
调用navigator.credentials.get()时,若弹窗未正常展示,Promise会抛出标准Error对象,可通过错误的name和message属性获取具体原因,示例:
try { const credential = await navigator.credentials.get({ federated: { providers: [{ configURL: 'https://your-provider.com/fedcm.json', clientId: 'your-client-id', nonce: 'generated-nonce' }] } }); } catch (error) { // 常见错误类型:NotAllowedError(用户禁用FedCM)、NotFoundError(无可用身份提供者)等 console.log('弹窗未显示原因:', error.name, error.message); }
3. 组件状态的间接判定逻辑
结合交互流程做状态推导:
- 若
get()方法调用后立即返回reject,判定为组件未展示; - 若调用后进入等待状态,随后返回
resolved或reject,则判定为组件曾展示并完成用户交互。
内容的提问来源于stack exchange,提问作者user23184419
相关产品推荐
相关产品推荐

