Javascript 在没有类的情况下使用google登录时,如何使用GoogleAuth.then();g-符号2“;div

Javascript 在没有类的情况下使用google登录时,如何使用GoogleAuth.then();g-符号2“;div,javascript,google-signin,Javascript,Google Signin,根据对这一问题的回答,我有一段代码,它使用谷歌登录,而不使用带有g-signn2样式的div: <html> <head> <meta name="google-signin-client_id" content="APP_CLIENT_ID"> </head> <body> <div id="my-signin2"></div> <a href="#" onclick="signOut();

根据对这一问题的回答,我有一段代码,它使用谷歌登录,而不使用带有
g-signn2
样式的div:

<html>
<head>
<meta name="google-signin-client_id" content="APP_CLIENT_ID">
</head>
<body>
  <div  id="my-signin2"></div>
    <a href="#" onclick="signOut();">Sign out</a>
  <script>
    function onSuccess(googleUser) {
      console.log('Logged in as: ' + googleUser.getBasicProfile().getName());
    }
    function onFailure(error) {
      console.log(error);
    }
    function renderButton() {
      gapi.signin2.render('my-signin2', {
        'scope': 'profile email',
        'width': 240,
        'height': 50,
        'longtitle': true,
        'theme': 'dark',
        'onsuccess': onSuccess,
        'onfailure': onFailure
      });
    }

    function signOut() {
      var auth2 = gapi.auth2.getAuthInstance();
      auth2.signOut().then(function () {
        console.log('User signed out.');
      });
    }
  </script>

  <script src="https://apis.google.com/js/platform.js?onload=renderButton" async defer></script>
</body>
</html>

函数onSuccess(谷歌用户){
log('登录身份:'+googleUser.getBasicProfile().getName());
}
功能失效(错误){
console.log(错误);
}
函数renderButton(){
gapi.signn2.render('my-signn2'{
“范围”:“配置文件电子邮件”,
“宽度”:240,
身高:50,,
"龙缇乐":对,,
“主题”:“黑暗”,
“onsuccess”:onsuccess,
“onfailure”:onfailure
});
}
函数签出(){
var auth2=gapi.auth2.getAuthInstance();
auth2.signOut().then(函数(){
log('User signed out');
});
}
但是,我想使用
GoogleAuth.then(onInit,onFailure)
,这样我就可以知道lib初始化何时完成,并且我可以决定更新我的视图。我也无法添加任何侦听器,以便在登录完成时通知它们

问题是在使用上述代码或类引用创建按钮之前,
gapi.auth2
是未定义的。似乎如果没有这两个步骤中的任何一个,我都无法调用
gapi.auth2.getAuthInstance()
来设置侦听器,也无法得到一个承诺,通知我init何时完成


我的问题是,我想在创建按钮之前进行初始化,看看是否需要创建登录按钮。

要获得
gapi.auth2
,首先需要加载它

gapi.load('auth2', function() {
  // continuation
  gapi.auth2.init();
});
platform.js基本上加载api.js+
.signn2
名称空间
.signin2
命名空间允许您呈现按钮和小部件。但如果您想要细粒度的控制,我不建议您使用它

.signn2
所做的是

  • 检测类别
    g-signn2
    并渲染按钮
  • 渲染指定元素上的按钮
  • 单击时调用登录
  • 根据用户的登录状态,使用字符串呈现按钮

    • 我在类似领域的另一个问题回答了这个问题:

      答案是不使用platform.js,而是使用api.js并加载auth2:

      <html lang="en">
        <head>
          <script src="https://apis.google.com/js/api.js"></script>    
          <script type="text/javascript">
              function onSignIn(googleUser) {
                  console.log( "signedin");
                  // Useful data for your client-side scripts:
                  var profile = googleUser.getBasicProfile();
                  console.log("Name: " + profile.getName());
              };
      
              gapi.load('auth2', function() {
                  gapi.auth2.init({
                      client_id: "REPLACE_WITH_YOUR_ID",
                      scope: "profile email" // this isn't required
                  }).then(function(auth2) {
                      console.log( "signed in: " + auth2.isSignedIn.get() );  
                      auth2.isSignedIn.listen(onSignIn);
                      var button = document.querySelector('#signInButton');
                      button.addEventListener('click', function() {
                        auth2.signIn();
                      });
                  });
              });
          </script>
        </head>
        <body>
          <div id="signInButton"><img src="IMAGE_FILE" /></div>
        </body>
      </html>
      
      
      函数onSignIn(谷歌用户){
      控制台日志(“已签名”);
      //客户端脚本的有用数据:
      var profile=googleUser.getBasicProfile();
      log(“Name:+profile.getName());
      };
      load('auth2',function(){
      gapi.auth2.init({
      客户id:“用您的id替换”,
      范围:“配置文件电子邮件”//这不是必需的
      }).then(函数(auth2){
      log(“登录:+auth2.isSignedIn.get());
      auth2.isSignedIn.listen(onSignIn);
      var按钮=document.querySelector('signInButton');
      addEventListener('click',function(){
      auth2.signIn();
      });
      });
      });