2016-12-07 19 views
0

我加載jQuery的這樣:爲什麼jQuery仍然未定義但腳本標記被加載的可能性很小?

function require(url, cb = new Function) { 
    var s = document.createElement('script'); 
    s.src = url; 
    // s.async=true; 
    // ^^^^^^^^^^^^ This is already removed, but the problem still existed. 
    s.onload = cb; 
    document.head.appendChild(s); 
    } 
    require(jquery_cdn_url, function(){ 
    try { 
     alert($); 
    } catch (e) { 
     ga('send', 'pageview', e); 
    } 
    }); 

catch塊中的錯誤是不會發生所有的時間。但是對於一些訪問者(很小的機會),因爲我通過將信息發送給Google Analytics來追蹤這些信息。

在此問題的以前版本中,腳本具有async屬性。但是在真實的項目中,我刪除了它,並且錯誤仍然出現。

這是爲什麼發生?有什麼辦法可以避免這種情況?

一些進一步的想法:

  • 的谷歌分析代碼也被加載這種方式,因此,如果onload功能不適用於某些用戶代理工作,ga()也應該送什麼給谷歌。
  • 我想一種避免這種情況的方法:在try ... catch區塊中,使用類似「xxx.html?load = sync」的查詢重新加載失敗的案例。然後我在服務器端進行一些檢測,如果有load=sync查詢,那麼我會輸出帶有同步JavaScript標籤的代碼。這聽起來像是一種可能的解決方法,但並不完美,因爲它需要另一次重新加載(更多浪費的網絡請求)和一些服務器端編程工作量。
+0

你確定jQuery被加載? –

+0

如果'onload'回調被觸發,我認爲這意味着它被加載。 –

+0

你確定這個網址是否正確?你有沒有在「網絡」選項卡中確認外部jQuery實際上正在加載? –

回答

2

你不是說哪些瀏覽器的問題出現在,但支持的script標籤跨瀏覽器seems to be spotty.

onload屬性這可以給你造成的問題看到 - 檢查用戶代理字符串以查看瀏覽器版本是否匹配。

顯然老版IE版本的正確方法是使用onreadystatechangeHere是一個寫法,說明它是如何完成的。

要記住的另一個細節是the src attribute should be set after the onload attribute以確保onload處理程序實際上被觸發。但是,這看起來不像是你問題的原因:如果出現這種情況,處理程序根本不會被解僱。

+0

這似乎是可能的情況。我會對此做更多的測試。但是,如果用戶使用的是較舊的IE,那麼'onload'中的東西永遠不會被執行。我確實在onload回調中發現了錯誤。 Google Analytics報告也在該回調中發送。 –

+0

@AwQiruiGuo我無法找到任何清楚的信息,說明IE的舊版本*做了什麼* - onload處理程序是否從未在此處被觸發,或者立即啓動而無需等待腳本加載。如果是後者,這可能是你的問題的原因;如果前者,那麼它必須是別的東西 –

+0

那麼。這是可能的。非常感謝你Pekka!你的鏈接確實給了我很多想法。我想也許我可以使用更多的方法來改善onload功能。 –

-2

的CDN網址加載到你的require功能添加腳本標記,但CDN網址將使穹頂時間來加載從網絡的js文件。它將首先發出一個獲取請求,然後將獲得包含文件內容的響應,然後才能完全加載jquery,並且可以訪問$。 雖然這也取決於您的互聯網速度。有時你會很快得到CDN js內容,有時候可能需要很長時間。

+0

'CDN網址將採取穹頂時間從網絡加載js文件'但是這是爲什麼他使用'onload'事件,不是嗎? –

+0

's.onload'只會檢查腳本標記是否加載到DOM中。不是正在加載的CDN網址。 – Sanchit

+1

你有這方面的來源嗎?我在網上可以看到的內容似乎有所不同 –

0

我做了一個fiddle它似乎工作。我認爲解決方案是將代碼放入onload事件中。你也可能是緩存清理問題,請參考this question

window.onload = function() { 
 
    function require(url, cb = new Function) { 
 
    var s = document.createElement('script'); 
 
    s.src = url; 
 
    s.async = true; 
 
    s.onload = cb; 
 
    document.head.appendChild(s); 
 
    } 
 
    require('https://code.jquery.com/jquery-2.2.4.min.js', function(){ 
 
    alert($); //ReferenceError: $ is not defined 
 
    }); 
 
};

+0

這並非一直在發生。它發生的機會很小,我必須通過Google Analytics(分析)設置來追蹤。我目前有2個例子。我確實跟蹤了用戶代理。一個是Linux,另一個是Windows NT。 –

相關問題