2015-02-24 148 views
3

我想等到我的所有requireJS模塊完成加載之後纔開始事件。 是否有一個事件或者一種方法來監聽我的所有requireJS模塊來完成加載?什麼時候requireJS完成加載所有模塊

細節:

我想自定義維度添加到我的谷歌Analytics(分析),然後發送網頁瀏覽。如果我設置了相同的尺寸,但在我的一些requireJS模塊中,我希望在頁面視圖之前更改尺寸,這在所有頁面上都很容易實現。

我已經得到了它的每一個頁面上運行我的模板的javascript,我想要它做的:

LISTEN_FOR_MODULES_TO_LOAD(function() { 
    $(document).trigger('set-your-analytics-dimensions-yall'); 
    ga('send', 'pageview'); 
}); 

然後在我的一些子頁面的我已經有了模塊做:

$(document).on('set-your-analytics-dimensions-yall', function() { 
    ga('set', 'dimension'); 
}); 

我想要的流量是:

  1. 聽我的所有模塊完成加載
  2. 向其他模塊設置它們的尺寸和其他值
  3. 集瀏覽量

的問題是,我沒有辦法聽我所有的requirejs模塊加載。

事情我已經考慮:

DOM就緒

這不起作用,因爲DOM已準備就緒之前或所有的JavaScript模塊被加載後觸發。

window.onload

這是不可靠的,可以多次觸發。如果圖像在10分鐘後添加到頁面,則可以再次觸發。如果外部資源永不加載,這個事件永遠不會觸發。

有沒有我錯過的選項?或者我完全錯過了requireJS?

+1

你怎麼可能知道什麼時候所有的模塊已經加載,模塊能夠在運行時包含其他模塊? – ssube 2015-02-24 19:35:36

+0

創建一個需要配置中每個其他模塊的模塊。當該模塊加載時,您會知道其他所有內容都已完成加載。 – idbehold 2015-02-24 22:07:39

+0

我認爲Google Analytics是異步加載。有一個名爲'async.js'的需求插件,我用它來加載谷歌地圖API。我不需要其他任何東西,只需將代碼放在'define'塊中,它會在google API加載時執行。希望這能解決你的問題,因爲我不太清楚GA如何加載你的代碼。 – 2015-02-27 13:39:19

回答

1

這個問題已經兩年多了,但是當我遇到同樣的問題時,這是我發現的唯一相關問題。我最終找到了適合我的答案。以下是一些背景:我有一個動態生成的頁面,其中包含多個不同數量的頁面部分,其中可能包含由require.js加載的模塊。例如,用一個可變數字圖片來繪製頁面,每個圖塊可以使用require來加載腳本。現在,當所有的瓷磚加載時,我想運行其他的JavaScript。但是如何判斷require.js何時加載完所有內容,包括可能作爲子模塊加載的模塊?

看看require.js代碼,我發現它包含一個註冊表,它似乎是掛起的加載及其回調列表。因此,當註冊表爲空時,require.js將完成加載並完成運行回調。至少看起來這樣,這對我很有用。基本上,在頁面的底部(以下任何其他呼叫,要求()),我添加此javascript:

function run_final_action($) { 
    if ($.isEmptyObject(require.s.contexts._.registry)) { 
     do_final_action(); 
    } 
    else { 
     setTimeout(run_final_action, 100); 
    } 
} 
require(['jquery'], function ($) { run_final_action($) }); 

這裏我使用jQuery,因爲我已經擁有它的頁面加載,但它不是真的有必要。基本思想是檢查註冊表中的requirejs(名爲「_」)中的缺省上下文,當它爲空時,這意味着requirejs沒有待加載的腳本或回調函數運行。無論如何,這適用於我的用例。

+0

標示爲幫助未來人們的正確答案。 – bzmw 2017-12-07 15:37:49