JavaScript, как отловить событие, когда ленивый загруженный скрипт готов? - PullRequest
6 голосов
/ 18 марта 2011

У меня файл JavaScript с отложенной загрузкой, как мне отловить событие, когда класс в файле готов к использованию? Мне нужно только загрузить этот скрипт в конкретном случае. Поэтому он загружается не через onload, а в условии if.

Ленивый код загрузки, который я взял отсюда: http://friendlybit.com/js/lazy-loading-asyncronous-javascript/

if (externalClassRequired) {
    var s   = document.createElement('script');
    s.type  = 'text/javascript';
    s.async = true;
    s.src   = 'http://yourdomain.com/script.js';
    var x   = document.getElementsByTagName('script')[0]
    x.parentNode.insertBefore(s, x);

    // When do I know when the class named "geo" is available?
}

Обновление:
Извините, ребята, я совсем забыл про Ajax! :) Я был так сосредоточен на своей проблеме, что не увидел очевидного решения @Tokimon. Простейшее решение с помощью jQuery будет:

$.getScript('http://yourdomain.com/script.js', function() {
  // callback or use the class directly
});

Ответы [ 5 ]

3 голосов
/ 18 марта 2011
if (s.readyState) s.onreadystatechange = function () {
    if (s.readyState === "loaded" || s.readyState === "complete") {
        s.onreadystatechange = null;
        callback();
    }
}; else s.onload = function () {
    callback();
};
1 голос
/ 18 марта 2011
var onloadCallback = function() {
    alert('onload');
}

var s   = document.createElement('script');
s.type  = 'text/javascript';
s.async = true;
s.onreadystatechange = function () { // for IE
  if (this.readyState == 'complete') onloadCallback();
};
s.onload = onloadCallback; // for other browsers
s.src   = 'http://yourdomain.com/script.js';
var x   = document.getElementsByTagName('script')[0]
x.parentNode.insertBefore(s, x);   

Вы также можете использовать XMLHttpRequest для загрузки файла.

1 голос
/ 18 марта 2011

Если я понимаю, что вы хотите сделать правильно. Вот почему существуют методы обратного вызова.

Объяснено довольно хорошо здесь Получение лучшего понимания функций обратного вызова в JavaScript

1 голос
/ 18 марта 2011

Или вы можете получить скрипт через ajax.Тогда вы уверены, что скрипт загружается при запуске события ajax succes:)

1 голос
/ 18 марта 2011

Поскольку для этого требуется HTTP-запрос, вы должны иметь возможность поместить на него событие onload.

s.onload = function() {
  // do something
}

В «Даже более быстрых веб-сайтах» Стив Соудерс предлагает решение, которое можно увидеть здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...