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

新版Google登录按钮刷新页面后消失问题求助

解决Svelte中Google登录按钮刷新后消失的问题

问题根源

Google登录的GSI脚本默认在页面首次加载时自动扫描DOM里的g_id_onload和g_id_signin元素并初始化按钮,但Svelte在页面刷新(包括硬刷新、开发环境热重载)时,DOM会重新构建,此时GSI脚本的自动扫描已经完成,导致新渲染的g_id_signin元素无法被识别并渲染成按钮。

方案一:手动注入脚本并初始化按钮

直接在Svelte组件的onMount钩子中注入GSI脚本,等脚本加载完成后手动调用API渲染按钮,确保DOM元素存在后再执行初始化:

<script>
  import { onMount } from 'svelte';

  onMount(async () => {
    // 避免重复加载脚本
    if (!document.querySelector('#google-gsi-script')) {
      const script = document.createElement('script');
      script.id = 'google-gsi-script';
      script.src = 'https://accounts.google.com/gsi/client';
      script.async = true;
      script.defer = true;

      script.onload = () => {
        // 初始化Google登录配置
        window.google.accounts.id.initialize({
          client_id: '534101779287-bm07dc8v4ln4kulqbql61nsglcku74vg.apps.googleusercontent.com',
          context: 'use',
          ux_mode: 'redirect',
          login_uri: 'http://localhost:5173/auth/callback'
        });
        // 渲染登录按钮到指定DOM元素
        window.google.accounts.id.renderButton(
          document.querySelector('.g_id_signin'),
          {
            type: 'standard',
            shape: 'rectangular',
            theme: 'outline',
            text: 'signin_with',
            size: 'medium',
            logo_alignment: 'left',
            width: '180'
          }
        );
      };

      document.head.appendChild(script);
    } else {
      // 脚本已加载,直接重新渲染按钮
      window.google.accounts.id.renderButton(
        document.querySelector('.g_id_signin'),
        {
          type: 'standard',
          shape: 'rectangular',
          theme: 'outline',
          text: 'signin_with',
          size: 'medium',
          logo_alignment: 'left',
          width: '180'
        }
      );
    }
  });
</script>

<svelte:head>
  <title>Home</title>
  <meta name="description" content="Svelte demo app" />
</svelte:head>

<section>
  <div class="h-screen">
    <div class="bg-red-300 h-80">
      <div class="g_id_signin"></div>
    </div>
  </div>
</section>

方案二:保留配置元素,手动触发初始化

如果你想保留原来的g_id_onload配置元素,可以手动引入脚本,然后在onMount中读取配置并初始化按钮:

<script>
  import { onMount } from 'svelte';

  onMount(() => {
    // 确保Google API已加载
    if (!window.google?.accounts?.id) return;

    // 读取g_id_onload中的配置
    const configEl = document.getElementById('g_id_onload');
    const config = {
      client_id: configEl.dataset.clientId,
      context: configEl.dataset.context,
      ux_mode: configEl.dataset.uxMode,
      login_uri: configEl.dataset.loginUri
    };

    // 初始化并渲染按钮
    window.google.accounts.id.initialize(config);
    window.google.accounts.id.renderButton(
      document.querySelector('.g_id_signin'),
      {
        type: 'standard',
        shape: 'rectangular',
        theme: 'outline',
        text: 'signin_with',
        size: 'medium',
        logo_alignment: 'left',
        width: '180'
      }
    );
  });
</script>

<svelte:head>
  <title>Home</title>
  <meta name="description" content="Svelte demo app" />
  <!-- 手动引入GSI脚本 -->
  <script src="https://accounts.google.com/gsi/client" async defer></script>
</svelte:head>

<section>
  <div class="h-screen">
    <div
      id="g_id_onload"
      data-client_id="534101779287-bm07dc8v4ln4kulqbql61nsglcku74vg.apps.googleusercontent.com"
      data-context="use"
      data-ux_mode="redirect"
      data-login_uri="http://localhost:5173/auth/callback"
    />
    <div class="bg-red-300 h-80">
      <div class="g_id_signin"></div>
    </div>
  </div>
</section>

方案生效原因

自动初始化只在脚本首次加载时执行一次,而手动初始化是在Svelte组件挂载完成(DOM元素已存在)后调用Google API,确保每次页面刷新后,按钮元素都能被正确识别并渲染。

内容的提问来源于stack exchange,提问作者MathankumarK

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 16:01:29