Динамическое подключение скриптов
Сразу прошу прощения, если написал не в тот раздел.
Проблема такая: К 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, время: 02:42. |