2015-02-06 2 views
0

Я использую тему начальной загрузки, для которой требуется несколько файлов javascript. На некоторых моих страницах я загружаю на сервер довольно много контента, что означает, что не все html будут на странице во время обработки файлов javascript.Лучший способ задержать загрузку js?

Это предотвращает привязку обработчиков событий к html, загружаемому после оценки javascript. До сих пор я исправил проблему, загрузив скрипты после завершения вызова ajax, но для меня это кажется довольно хоккеем. Вот моя функция:

$.get("/path/to/rest/call", function(data) { 
    $('#htmlElement').html(data); 
}).done(function() { 
    $.getScript("/path/to/js/file.js"); 
}); 

Я чувствую, что есть лучший способ сделать это. Здесь?

+1

Ничего хоккея о нем для меня. Вы загружаете скрипт, когда страница готова для этого скрипта. Вот как вы должны это делать. Вы можете изменить сценарий, чтобы он ничего не делал при загрузке, и тогда вы можете загрузить его в любое время. Затем, когда ваш вызов ajax завершается, вы просто вызываете функцию в этом скрипте. Это упрощает многое, потому что вы отключаетесь, когда скрипт загружается с момента вызова и выполнения функции в ней. – jfriend00

+0

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

+1

Итак, у вас есть сторонняя библиотека, которая пытается напрямую изменить вашу страницу, не называя в ней ничего. Это очень странно. Что это за библиотека? – jfriend00

ответ

1

Возможно, существует более чистый способ решения этой проблемы, чем динамическая загрузка библиотеки метроуи. Похоже, это зависит от .ready() от jQuery, чтобы знать, когда загружается страница и когда она может инициализировать свои вещи. Но это не работает для вас, потому что вы динамически загружаете контент через Ajax.

Что вы можете сделать, так это то, что вы можете приостановить уведомление jQuery ready() до тех пор, пока не загрузится содержимое ajax. Это приведет к отключению инициализации метро до тех пор, пока не загрузится динамический контент. Это позволит вам загружать метро в теге <script> в разделе <head>, как это предлагает их документ. Как это работает, вы добавите этот раздел <head>, после загрузки JQuery:

<script> 
    jQuery.holdReady(true); 
</script> 

Затем, после того, как ваш код Аякса успешно завершен, вы делаете это (из обработчика успеха, после того, как вы положили ваш новое содержание в страницу):

jQuery.holdReady(false); 

, который затем выпускает JQuery назвать это .ready() обработчиков и метро будут делать это дело после того, как будет загружен ваш контент.

См. jQuery doc для jQuery.holdReady(...).

+0

Мне нравится этот подход, спасибо. – jasono

Смежные вопросы