2014-10-03 51 views
4

我正在使用Google API(gapi)進行用戶登錄。如何爲gapi添加onload事件?

我的代碼如下。它異步加載谷歌sdk。一旦它被加載,我需要調用API函數gapi.auth.authorize

(function(d: any, s: string, id: string) { 
    var js: HTMLScriptElement, gjs: Element = d.getElementsByTagName(s)[0]; 
    if (d.getElementById(id)) return; 
    js = d.createElement(s); js.id = id; 
    js.src = "https://apis.google.com/js/client.js"; 
    gjs.parentNode.insertBefore(js, gjs); 

    if (js.readyState){ //IE 
     js.onreadystatechange = function(){ 
      if (js.readyState == "loaded" || 
       js.readyState == "complete"){ 
       js.onreadystatechange = null; 
       gapi.auth.authorize(); //<-- details omitted 
      } 
     }; 
    } else { //Others 
     js.onload = function(){ 
      gapi.auth.authorize(); //<-- details omitted 
     }; 
    } 
}(document, 'script', 'google-jssdk')); 

現在的問題是 - 我得到錯誤

TypeError: gapi.auth is undefined

應當定義嗎?我看着控制檯,然後輸入gapi.auth,我得到一個響應的對象。

所以我認爲js.onload事件是提前觸發,即當gapi.auth尚未準備好。

如何解決這個問題?或者更具體地說,如何爲gapi添加onload事件?

+0

我有同樣的問題。我在mac os上使用chrome。我正在同步加載,當我在控制檯輸入'gapi.auth'時,它仍然是'undefined',當我鍵入'gapi'時,我得到一個具有許多屬性的對象,比如'client','plus'等,但是沒有'auth'。這是否與從開發者控制檯啓用的API有關?我啓用的所有功能都是Google+ API。 – 2015-10-07 18:27:43

回答

3

這是什麼瀏覽器?另外,您需要在腳本的src屬性末尾包含?onload=myFunction參數,然後執行window['myFunction'] = function() { ... }以檢測庫準備情況。加載通常會注入一個額外的腳本節點,您也需要等待那個腳本節點。

+0

起初讓我困惑,但後來我意識到你正在談論腳本標記,就像這樣:''那麼在我實現我的回調函數appStart之後它就完全工作了。 – ThisClark 2016-04-18 03:55:10