Как насчет какой-то договоренности об обратном вызове? Вместо того, чтобы динамически добавляемый скрипт просто выполнялся сам при загрузке, он должен вызывать функцию в вашем основном скрипте, которая решит, стоит ли идти дальше. Вы могли бы заставить функцию основного скрипта просто возвращать true или false (выполнить / не выполнять), или она могла бы принять функцию обратного вызова в качестве параметра, чтобы она могла точно определить, когда запускать динамический скрипт - таким образом, если у вас было несколько динамические сценарии главный сценарий может подождать, пока все они загрузятся, а затем выполнить их в определенном порядке.
В вашем основном скрипте JS:
function dynamicScriptLoaded(scriptId,callback) {
if (scriptId === something && someOtherCondition())
callback();
// or store the callback for later, put it on a timeout, do something
// to sequence it with other callbacks from other dynamic scripts,
// whatever...
}
В вашем динамически добавленном скрипте:
function start() {
doMyThing();
doMyOtherThing();
}
if (window.dynamicScriptLoaded)
dynamicScriptLoaded("myIdOrName",start);
else
start();
Динамический скрипт проверяет, есть ли определенная функция dynamicScriptLoaded (), ожидая, что она будет в основном скрипте (не стесняйтесь обновить его до более надежного теста, то есть проверки, что dynamicScriptLoaded на самом деле является функцией). Если он определен, он вызывает его, передавая функцию обратного вызова. Если он не определен, он предполагает, что все в порядке, чтобы продолжить и выполнить себя - или вы можете использовать любую резервную функцию, которая вам нравится.
ОБНОВЛЕНИЕ: я изменил тест if
выше, так как if(dynamicScriptLoaded)
выдаст ошибку, если функция не существует, тогда как if(window.dynamicScriptLoaded)
будет работать. Предполагая, что функция является глобальной - очевидно, это можно изменить, если использовать схему пространства имен.
За год с того момента, как я впервые опубликовал этот ответ, мне стало известно, что загрузчик yepnope.js позволяет вам загружать скрипт, не выполняя его, поэтому он должен быть в состоянии справиться с упомянутой ситуацией blankSlate в комментарии ниже. yepnope.js всего 1.7kb.