Вам уже повезло, что ваш скрипт не зависал при вызове функции $ в $(document)
:)
Вот пример.
test.js:
function sleep(milliseconds)
{
var end = new Date().getTime() + milliseconds;
while (new Date().getTime() < end);
document.write('external script executed<br/>');
}
sleep(3000);
test.html
<html>
<head>
<title>test</title>
<script type="text/javascript">
var fileref=document.createElement('script');
fileref.setAttribute("type","text/javascript");
fileref.setAttribute("src", "test.js");
document.getElementsByTagName("head")[0].appendChild(fileref)
document.write('page script executed<br/>');
</script>
</head>
<body>
</body>
</html>
test.html
загружает test.js
перед записью в документ. Если вы ожидаете, что результат будет:
внешний скрипт выполнен
Выполнен скрипт страницы
... тогда вы ошибаетесь.
Когда вы добавляете элемент <script>
к <head>
вашей страницы, функция appendChild()
сразу возвращается после добавления элемента, не ожидает полной загрузки вашего скрипта . В приведенном выше примере результат будет:
Выполнен скрипт страницы
внешний скрипт выполнен
Вот почему я сказал, что вам повезло, что вы можете использовать jQuery в то время, когда вы не уверены, что он полностью загружен.
Обойти эту проблему можно было бы добавить ваш $(document).ready(...);
в качестве сценария к <head>
вашего документа. Можно ожидать, что обычный браузер - если вы понимаете, что я имею в виду - загружает и выполняет сценарии в том порядке, в котором вы добавили их на свою страницу.
var pageScript = document.createElement('script');
pageScript.setAttribute("type", "text/javascript");
var pageScriptSource = document.createTextNode("document.write('page script executed<br/>');");
pageScript.appendChild(pageScriptSource);
document.getElementsByTagName("head")[0].appendChild(pageScript);
Протестировано с FF и IE. Работает в ФФ ...
Это не полное решение, но у меня нет времени (и я не хочу) найти взлом для IE;)