2011-05-18 2 views
1

Я столкнулся с аналогичной проблемой с this guy, за исключением того, что моя проблема связана со сценариями, а не с изображениями.

Я использую комбинацию $.getScript() и $(window).load() для динамического загрузки JavaScript и использования функций, которые загружаются после полной загрузки сценария.

Это хорошо работает в Chrome, но Safari, похоже, всегда запускает событие onload слишком рано. Мне было интересно, есть ли способ заставить Safari ждать, пока все сценарии загрузятся аналогично блоку document.body.offsetWidth. Из того, что я понял (и из результатов, которые я видел, когда я его тестировал), document.body.offsetWidth блокируется до тех пор, пока не будут загружены стили и изображения, но, по-видимому, не скрипты.

Редактировать: Возможно, стоит отметить, что он делает иногда работает в Safari, но я не вижу шаблона. Иногда событие запускается до того, как скрипт полностью загружен и выполнен, и обработчик прошел $(window).load() сбой, потому что функции отсутствуют.

+0

Почему вы не можете использовать обработчик 'success' для' $ .getScript() '? Это будет работать после завершения загрузки сценария. –

+0

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

+0

@Kevin Peno: Мне нужно загрузить остальные сценарии, а не только один скрипт. Загружается несколько скриптов. Они все разделены на собственный сценарий в зависимости от их функциональности. – alexcoco

ответ

1

На основе комментариев, которые вы сделали, в частности тех окружающих зависимостей, я хотел бы использовать библиотеку как RequireJS. Это даст вам то, что вам нужно для импорта скриптов и их зависимостей, а также перехватывает вызовы функций и кода при выполнении зависимостей.

+0

Спасибо, я тоже смотрел на Namespace.js. Я тоже посмотрю на это и оцениваю его с коллегами. Я вернусь к тебе, когда смогу. – alexcoco

+0

Это, скорее всего, будет работать, но я не думаю, что смогу получить это одобрение на работе. Я по-прежнему буду считать это правильным, так как это лучшее решение, с которым я столкнулся до сих пор. Я также должен упомянуть [LABjs] (http://labjs.com/), так как это выглядит как еще одно достойное решение. Спасибо за вашу помощь. – alexcoco

0

Вы пробовали готовый старый документ?

$(document).ready(function() { 
    //code here 
}) 

У меня никогда не было проблем при использовании этого. В худшем случае вы можете сбросить тег скрипта после всех других тегов скрипта, которые содержат требуемый код.

+0

Это не поможет, я не думаю, что проблема заключается в том, что механизм «готов» не знает ждать динамически загружаемых скриптов. – Pointy

+0

Это не сработает, потому что '$ (document) .ready()' связывает обработчик с событием DOMContentLoaded, которое запускается после того, как DOM готов, но до того, как скрипты/images/css будут готовы. Как я уже сказал, мой код работает в Chrome без сбоев каждый раз. – alexcoco

0

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

// Simplified callback to check for all scrips loaded. 
var numDynScriptsReady = 0, 
    numDynScriptsNeeded = 4; 

function dynScriptsReady() 
{ 
    numDynScriptsReady++; 

    if(numDynScriptsLoaded == numDynScriptsNeeded) 
    { 
     // Run functions you need after loaded.... 
    } 
} 

// Example script get 
$.getScript("http://example.com/script.js", dynScriptsReady); 
// etc.... 
+0

Это интересно, но это означает, что мне приходилось подсчитывать количество скриптов каждый раз, когда я пишу обработчик/добавляю другой импорт. Основная проблема заключается в том, что у меня будет один скрипт, который сделает что-то очень конкретное, и этот скрипт, в свою очередь, импортирует собственные зависимости внутри себя. Таким образом, в импортированных сценариях есть импорт, что усложняет ситуацию, когда их нужно подсчитывать. – alexcoco

+0

@alexcoco, Тогда разверните его. Вы можете использовать '.data' для хранения счетчика зависимостей для конкретного' скрипта', аналогичного глобальному 'var'. Вы можете использовать эту функцию как '$ .bind' для вновь добавленных элементов сценария, а затем' $ .trigger' для обратного вызова 'success' этого конкретного' $ .getScript'. Будучи стажером, я ожидаю, что вам будет интересно узнать об этом! –

+0

Сохранение ценности - это не столько проблема. Проблема заключается в понимании того, сколько скриптов необходимо импортировать.Если мне приходится каждый раз подсчитывать их, я мог бы хранить все в одном большом файле. – alexcoco

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