2013-10-11 3 views
0

Я ищу что-то похожее на то, как работает JavaScript-фрагмент Google Analytics JavaScript.Загрузка async JS, затем вызов функций?

К примеру у меня есть это,

(function(d, t) { 
    var g = d.createElement(t), 
     s = d.getElementsByTagName(t)[0]; 
    g.src = 'myjs.js'; 
    s.parentNode.insertBefore(g, s); 
}(document, 'script')); 

Скрипт определяет класс, но когда я называю это:

var newClass = new myclass('myparam'); 

Я получаю не определенную ошибку. Однако, если я подожду и снова назову его в консоли, я больше не получу ошибку. Я предполагаю, что сценарий еще не полностью загружен, поэтому класс не существует.

Однако это можно назвать функции Google Analytics непосредственно после импорта, например,

(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ 
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o), 
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) 
})(window,document,'script','//www.google-analytics.com/analytics.js','ga'); 

ga('create', '[userid]', '[website]'); 

Как я могу сделать это с моим сценарием?

ответ

2

Что делает этот код GA, сразу же создает объект со встроенным кодом. Объект просто сохраняет вызовы в массиве до загрузки сценария GA. Затем скрипт GA потребляет массив. (См. Подробности ниже.)

Вы не можете сделать это с кодом, который вы указали, потому что A) Это функция-конструктор, а B) В вашем коде используется возвращаемое значение.

Вот подробно о том, что делает, что GA-код:

(function (i, s, o, g, r, a, m) { 
    // Remember the name 'ga' on window, using the property GoogleAnalyticsObject 
    i['GoogleAnalyticsObject'] = r; 

    // Create or retrieve the 'ga' function. If there already is one, 
    // it's used as-is. If not, create a new function. 
    i[r] = i[r] || function() { 
     // The bit in parens initializes an array if there isn't one 
     // Then the push call remembers the arguments for this call 
     (i[r].q = i[r].q || []).push(arguments) 
    }, i[r].l = 1 * new Date(); // The bit after the comma sets or updates the `l` property on the function with the timestamp of when this code was run. 
    // From here fairly standard, load the GA script asynchronously 
    a = s.createElement(o), 
    m = s.getElementsByTagName(o)[0]; 
    a.async = 1; 
    a.src = g; 
    m.parentNode.insertBefore(a, m) 
})(window, document, 'script', '//www.google-analytics.com/analytics.js', 'ga'); 
Смежные вопросы