Динамическое подключение скриптов
Сразу прошу прощения, если написал не в тот раздел.
Проблема такая: К HTML-странице подключается внешний скрипт. В процессе работы он подключает к странице еще один скрипт и добавляет его в конец/начало (пробовал оба варианта) тэга HEAD. После этого мне надо чтобы первый скрипт вызывал функцию из нового. Но,насколько я понял логику, новый скрипт прочитается только после выполнения текущего. Нельзя ли заставить браузер прочитать новый скрипт сразу после подключения? Хочется видеть новый скрипт именно в отдельном js-файле. Вот мой код: HTML-файл: Код:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" function addScript(src) { var newScript = document.createElement("script"); newScript.type = "text/javascript"; newScript.src = src; var first = document.getElementsByTagName("head")[0].firstChild; document.getElementsByTagName("head")[0].insertBefore(newScript, first); // Сначала пробовал document.getElementsByTagName("head")[0].appendChild(newScript); } addScript("/sys/modules/hello/main.js"); main(); //Это вызов функции из main.js Скрипт main.js: function main() { alert("Работает"); } Можно конечно в конце файла main.js дописать main(); но не хочется так делать, потому что мне надо, чтобы main.js выполнился не сразу после подключения, а через несколько строк кода (код kernel я очень обрезал, он большой). Заранее спасибо за помощь! |
можно создать функцию, которая периодически будет проверять загружен ли main.js:
для этого используйте setInterval, а в функции делайте проверку, например: if (typeof(main) != undefined) { ... } |
Snowcore,
Это не совсем то, т.к. все равно функция main() вызовется после прочтения всего kernel, а хотелось бы, чтобы она вызывалась до окончания кода kernel. |
Предлагаю вот что:
Код:
<body> Код:
Кто придумает как победить ослика пишите). |
|
Теперь кушает и IE:
Код:
<body> |
Цитата:
И вы что, в IE скрипт в iframe выполняете? :blink: В IE есть функция execScript. |
Зачем мутить с XMLHttpRequest в синхронном режиме для того, чтобы дождаться окончания загрузки файла, если у <script> ЭстЪ onload? Дрозофила:
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=windows-1251"> <title>Test load JS</title> <script type="text/javascript"> <!-- function LoadBySrc(dest) { var CtrlLog=document.getElementById("Log"); CtrlLog.value+="LoadBySrc(\""+dest+"\")\r\n"; CtrlLog.value+=(("F1inJS1" in this) ? "" : "!")+"\"F1inJS1\" in this\r\n"; CtrlLog.value+=(("F1inJS1" in window) ? "" : "!")+"\"F1inJS1\" in window\r\n"; if(("F1inJS1" in this) || ("F1inJS1" in window)) return; var h, s; if((h=document.getElementsByTagName(dest)) && h.length>0) { h=h[0]; if(s=document.createElement("script")) { s.id="js1"; s.type="text/javascript"; s.charset="windows-1251"; if("attachEvent" in s) s.attachEvent("onload",OnLoad); else if("addEventListener" in s) s.addEventListener("load",OnLoad,false); else s.onload=OnLoad; if("onreadystatechange" in s) s.onreadystatechange=function(){if(this.readyState=="complete") OnLoad()}; s.src="js1.js"; h.appendChild(s); CtrlLog.value+=(("F1inJS1" in this) ? "" : "!")+"\"F1inJS1\" in this\r\n"; CtrlLog.value+=(("F1inJS1" in window) ? "" : "!")+"\"F1inJS1\" in window\r\n"; } } } function OnLoad() { var CtrlLog=document.getElementById("Log"); CtrlLog.value+="script OnLoad ("+(("F1inJS1" in this) ? "" : "!")+"\"F1inJS1\" in this)\r\n"; CtrlLog.value+="script OnLoad ("+(("F1inJS1" in window) ? "" : "!")+"\"F1inJS1\" in window)\r\n"; F1inJS1(); } // --> </script> </head> <body> <input type="button" id="btnLoadBySrcHead" value="Load by src (head)" onclick="LoadBySrc('head')"> <textarea id="Log" name="Log" rows="12" cols="80" readonly></textarea> </body> </html> function F1inJS1() { alert("F1 in JS1"); } Mozilla Firefox 3.5.7, M$ IE 6.0.2900.2180.xpsp_sp2_rtm040803-2158 - все сухо... |
Ой, моя тема продолжается :) Спасибо за решение, но необходимость уже отпала, я просто обошелся без такого подключения.
Спасибо всем за помощь! ЗЫ Совместимость с ИЕ, кстати, меня не очень волнует. Пора переходить на нормальные браузеры. |
Если вы хотите разделять функцию на две никаких проблем нет. Но если мы хотим сделать все в одной: подгрузить библиотеку и выполнить один из её методов, может возникнуть проблема. Метод может просто не успеть подгрузиться. Поэтому я и делаю синхронный запрос - подгружаю данные, а затем пытаюсь сделать доступными функции библиотеки.
С iframe конечно моя промашка). Вот рабочий код: Код:
<body> Код:
|
Часовой пояс GMT +3, время: 14:17. |