Labjs откладывает выполнение загруженных сценариев до готовности DOM? - PullRequest
4 голосов
/ 23 марта 2011

Вопрос касается http://labjs.com - потрясающей библиотеки для неблокирующей загрузки JavaScript и управления зависимостями.

Я прочитал документы, но я, должно быть, слишком устал или что-то в этом роде - я не смог найти что-нибудь относительно DOM ready ready.Сценарии выполняются после того, как DOM готов или нет?

Возможно, если я сделаю:

$LAB.script('my-library.js').wait(function(){ 
  // interacting with DOM 
});

Будет ли это безопасно?Или я должен использовать какой-то $(function() {}) и т. Д.?

Ответы [ 2 ]

7 голосов
/ 23 марта 2011

Любой загрузчик сценариев по умолчанию разблокирует загрузку сценариев из событий DOM-ready страницы и загрузки, по крайней мере, по намерению / определению.

Итак, простой ответ: НЕТ, LABjs не будет блокировать выполнение скрипта, пока не будет готова DOM. Некоторые сценарии, загруженные LABjs, могут выполняться до готовности к DOM, а другие могут выполняться после готовности к DOM.

Если у вас действительно есть случаи, когда вашему коду нужно ждать DOM, вы должны использовать такую ​​среду, как jQuery, и использовать встроенную оболочку, готовую к DOM $(document).ready(...), чтобы сделать эту логику готовой к DOM.

Однако во многих случаях люди думают, что им нужно ждать готовности к DOM, тогда как они этого не делают:

  1. Большинство людей сравнивают DOM-ready с "загрузка всех скриптов завершена". Если вы просто ждете DOM-ready, потому что вам нужно убедиться, что все ваши скрипты загружены, это ошибочное и неправильное предположение. Вместо этого используйте средство загрузчика сценариев, чтобы определить, когда все сценарии загружены, и запускайте их в соответствующее время, независимо от загрузки DOM. С LABjs это так же просто, как все ваши скрипты в одной цепочке $ LAB и окончательный .wait() в конце цепочки - вы можете быть уверены, что ваш код в этом обратном вызове .wait() не будет работать пока все скрипты не загрузятся и не запустятся.

  2. Большинство людей думают, что им нужно ждать, пока DOM-ready сделает такие вещи, как присоединение обработчиков событий или запуск запросов Ajax. Это также неверное предположение. Если ваш код просто запрашивает у DOM элементы для присоединения к ним обработчиков событий или если вы вообще ничего не делаете с DOM, а вместо этого делаете вызовы Ajax, не заключайте вашу логику в оболочку, готовую к DOM.

  3. С другой стороны, многие люди предполагают, что если ваш код выполняется в конце тега body, вам не нужно ждать готовности к DOM. Неправильно. DOM-ready - DOM-ready, независимо от того, где указан ваш код.

В общем, единственный раз, когда ваш код действительно должен быть обернут в DOM-готовую оболочку, это если он собирается изменить DOM. В противном случае, не ждите, пока DOM-ready запустит ваш код. Будьте умны в отношении того, что упаковано, а что нет.

1 голос
/ 16 декабря 2011

Как насчет использования потрясающего отложенного объекта в jQuery?Это работает как шарм:

var waitThenLaunch = function() {
    var deferredDocReady = $.Deferred();
    $(document).ready(function() {
        deferredDocReady.resolve();
    });
    var deferredScriptsReady = $.Deferred();

    // Load your last remaining scripts and launch!!!
    $LAB.script('last.js').wait(function(){ deferredScriptsReady.resolve(); });

    $.when(deferredDocReady, deferredScriptsReady).done(function() { launchApp(); });
};
$LAB.script('jquery.min.js')
    .script('another_script.js')
    .script('another_script.js').wait()
    .script('another_script.js')
    .script('another_script.js').wait(function(){ waitThenLaunch(); });

Найдите отличное объяснение здесь: http://www.erichynds.com/jquery/using-deferreds-in-jquery/

...