2017-09-27 32 views
0

林開發HTML應用程序結構如下:爲什麼基金會全球有時未定義?

<html> 
<head> 
    <!-- other head elements --> 
    <script src="jquery.js?_v=3736f12"></script> 
    <script src="error.js?_v=291bb66"></script> 
</head> 

<body> 
    <!-- other body elements --> 
    <script src="foundation.js?_v=880a16f"></script> 
    <script src="my_lib.js?_v=1c3b21e"></script> 
</body> 
</html> 

什麼error.js做的是,它偵聽window.onerror事件被觸發時,它通過AJAX發送錯誤信息到服務器給我們通知開發商。這種方式我們知道當用戶對某事的javascript投訴。

my_lib.js是一個相當大的庫,它執行大量任務,它通常建立在Foundation框架及其在JavaScript結構中的my_lib.js之前包含的JavaScript庫中。

現在我可以讓我的問題。這些天來,我們越來越相似的錯誤:

  • 類型錯誤:window.Foundation未定義
  • 類型錯誤:不確定是不是(評估「window.Foundation.Abide」)
  • 遺漏的類型錯誤的對象:不能讀取未定義的屬性「下拉」(代碼Foundation.Dropdown)

這些錯誤通常來自基金會全球Foundation內my_lib.js的用途和各種userAgents,但更多的是移動設備,但不完全。錯誤的發生時間通常是在準備好事件之前,或者有時在就緒事件和加載事件之間。瘋狂的事情是,這些錯誤並不總是來自同一用戶(即使他們在同一頁面上兩次也是如此),他們有時會來,而我們無法重現單一的錯誤。

我很確定,我們從來沒有將Foundation明確地定義爲未定義的,如果我們是這樣,那麼在每個打火機中都將是一個負載問題。

這使我的問題,如果foundation.js正在評估my_lib.js之前始終評估。從我閱讀帖子到所以我明白,標籤是按順序評估的,並且正在等待對方(我們從不使用異步或延期)。

只有另一條線索是,我能夠從服務器日誌,得到的是發生這些錯誤通常,當用戶正在輸入/閒置一段時間後重裝我們的網站。例如,在或刷新後登錄電子長期閒置後,同時還登錄。

沒有任何人有一個想法,爲什麼是這個hapenning?

非常感謝。

+0

我認爲庫加載 – madalinivascu

+0

之前更好地啓動所有的插件,當所有的渲染完成 – madalinivascu

+0

我會建議你給屬性'defer'到腳本元素插件被啓動。它將在解析HTML的同時下載JS(這可以提高頁面加載速度),並保證按照它們出現在文檔中的順序執行腳本。順便說一句:爲什麼不把'script'放在文檔的末尾,比如foundation或my_lib? – debute

回答

0

聽起來像是一個經典的比賽條件,在執行你的代碼庫可能會或可能不會被加載,如果不是你找回不確定。

爲了避免這種情況,你執行這依賴於庫中的任何代碼之前確保例如這個事件是triggerd。

(document.readyState === 'complete') { 
    // good to go! 
} 
+0

所以你在說,當我有兩個帶有不同js文件的腳本標籤時,不能保證當第二個腳本開始執行時第一個腳本已經準備好了嗎? – Walkerr47

+0

嚴格地講,這不應該發生腳本標籤一個接一個地順序加載,只要你不給他們任何異步標籤或類似。依靠用戶連接和其他因素,這仍然不是很可靠。你不知道你的圖書館發生了什麼。這就是爲什麼等待document.readyState更節省的原因 –