You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 06:07:03