Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 08.11.2009, 17:07
Интересующийся
Отправить личное сообщение для Dimanoid Посмотреть профиль Найти все сообщения от Dimanoid
 
Регистрация: 06.05.2009
Сообщений: 18

Динамическое подключение скриптов
Сразу прошу прощения, если написал не в тот раздел.

Проблема такая:
К HTML-странице подключается внешний скрипт. В процессе работы он подключает к странице еще один скрипт и добавляет его в конец/начало (пробовал оба варианта) тэга HEAD. После этого мне надо чтобы первый скрипт вызывал функцию из нового. Но,насколько я понял логику, новый скрипт прочитается только после выполнения текущего. Нельзя ли заставить браузер прочитать новый скрипт сразу после подключения? Хочется видеть новый скрипт именно в отдельном js-файле.

Вот мой код:
HTML-файл:
Код:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ru" lang="ru">

<head>
	<title>Привет!</title>
	<meta http-equiv="content-type" content="text/html;charset=utf-8" />
	<script type="text/javascript" src="/sys/kernel"></script>
</head>

<body>
</body>
</html>
Вот скрипт kernel:
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 я очень обрезал, он большой).

Заранее спасибо за помощь!
Ответить с цитированием
  #2 (permalink)  
Старый 10.11.2009, 13:38
Аватар для Snowcore
Аспирант
Отправить личное сообщение для Snowcore Посмотреть профиль Найти все сообщения от Snowcore
 
Регистрация: 02.06.2009
Сообщений: 92

можно создать функцию, которая периодически будет проверять загружен ли main.js:
для этого используйте setInterval, а в функции делайте проверку, например:

if (typeof(main) != undefined) {
  ...
}
Ответить с цитированием
  #3 (permalink)  
Старый 10.11.2009, 21:20
Интересующийся
Отправить личное сообщение для Dimanoid Посмотреть профиль Найти все сообщения от Dimanoid
 
Регистрация: 06.05.2009
Сообщений: 18

Snowcore,
Это не совсем то, т.к. все равно функция main() вызовется после прочтения всего kernel, а хотелось бы, чтобы она вызывалась до окончания кода kernel.
Ответить с цитированием
  #4 (permalink)  
Старый 20.01.2010, 07:14
Новичок на форуме
Отправить личное сообщение для is5201 Посмотреть профиль Найти все сообщения от is5201
 
Регистрация: 20.01.2010
Сообщений: 3

Предлагаю вот что:
Код:
<body>
	<script>
function addScript(url) {
			var xmlhttp;
			
			try {
				xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
			} catch (e) {
				try {
					xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
				} catch (E) {
					xmlhttp = false;
				};
			};
			
			if (!xmlhttp && typeof XMLHttpRequest!='undefined') {
				xmlhttp = new XMLHttpRequest();
			};
			
			xmlhttp.open('GET', url, false);
			xmlhttp.send(null);
		
			var obj = document.createElement('script');
			var textScr = document.createTextNode(xmlhttp.responseText);
			
			document.body.appendChild(obj);
			obj.appendChild(textScr);
		};
		
		addScript('script.js');
		some_func();
</script> <button onclick="some_func()">Click ME!!!</button> </body>
Содержимое script.js:
Код:
function some_func() {alert(1)};
Сразу говорю: в мелкомягком не работает.
Кто придумает как победить ослика пишите).

Последний раз редактировалось is5201, 20.01.2010 в 07:17.
Ответить с цитированием
  #5 (permalink)  
Старый 20.01.2010, 07:34
Аватар для Ex_Soft
Профессор
Отправить личное сообщение для Ex_Soft Посмотреть профиль Найти все сообщения от Ex_Soft
 
Регистрация: 19.12.2009
Сообщений: 164

тынць?
__________________
"Helo, word!" - 17 errors 56 warnings
Ответить с цитированием
  #6 (permalink)  
Старый 20.01.2010, 08:03
Новичок на форуме
Отправить личное сообщение для is5201 Посмотреть профиль Найти все сообщения от is5201
 
Регистрация: 20.01.2010
Сообщений: 3

Теперь кушает и IE:
Код:
<body>
<script>
		function addScript(url) {
			var xmlhttp;
			
			try {
				xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
			} catch (e) {
				try {
					xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
				} catch (E) {
					xmlhttp = false;
				};
			};
			
			if (!xmlhttp && typeof XMLHttpRequest!='undefined') {
				xmlhttp = new XMLHttpRequest();
			};
			
			xmlhttp.open('GET', url, false);
			xmlhttp.send(null);
			
			if (navigator.appName=="Microsoft Internet Explorer") {
				var ifr = document.createElement('iframe');
				document.body.appendChild(ifr);
				ifr.document.write("<script>"+xmlhttp.responseText+"<\/script>");
				document.body.removeChild(ifr);
			} else {
				var obj = document.createElement('script');
				var textScr = document.createTextNode(xmlhttp.responseText);
				document.body.appendChild(obj);
				obj.appendChild(textScr);
			};
		};
		
		addScript('script.js');
		some_func();
</script> <button onclick="some_func()">Click ME!!!</button> </body>
Ответить с цитированием
  #7 (permalink)  
Старый 20.01.2010, 08:40
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

Сообщение от is5201
Предлагаю вот что:
Не надо такое предлагать, браузер будет зависать, пока скрипты грузятся.

И вы что, в IE скрипт в iframe выполняете?

В IE есть функция execScript.
Ответить с цитированием
  #8 (permalink)  
Старый 20.01.2010, 10:55
Аватар для Ex_Soft
Профессор
Отправить личное сообщение для Ex_Soft Посмотреть профиль Найти все сообщения от Ex_Soft
 
Регистрация: 19.12.2009
Сообщений: 164

Зачем мутить с 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 - все сухо...
__________________
"Helo, word!" - 17 errors 56 warnings
Ответить с цитированием
  #9 (permalink)  
Старый 20.01.2010, 12:40
Интересующийся
Отправить личное сообщение для Dimanoid Посмотреть профиль Найти все сообщения от Dimanoid
 
Регистрация: 06.05.2009
Сообщений: 18

Ой, моя тема продолжается Спасибо за решение, но необходимость уже отпала, я просто обошелся без такого подключения.
Спасибо всем за помощь!

ЗЫ Совместимость с ИЕ, кстати, меня не очень волнует. Пора переходить на нормальные браузеры.
Ответить с цитированием
  #10 (permalink)  
Старый 20.01.2010, 12:55
Новичок на форуме
Отправить личное сообщение для is5201 Посмотреть профиль Найти все сообщения от is5201
 
Регистрация: 20.01.2010
Сообщений: 3

Если вы хотите разделять функцию на две никаких проблем нет. Но если мы хотим сделать все в одной: подгрузить библиотеку и выполнить один из её методов, может возникнуть проблема. Метод может просто не успеть подгрузиться. Поэтому я и делаю синхронный запрос - подгружаю данные, а затем пытаюсь сделать доступными функции библиотеки.
С iframe конечно моя промашка). Вот рабочий код:
Код:
<body>
	<script>
function addScript(url) {
			var xmlhttp;
			
			try {
				xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
			} catch (e) {
				try {
					xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
				} catch (E) {
					xmlhttp = false;
				};
			};
			
			if (!xmlhttp && typeof XMLHttpRequest!='undefined') {
				xmlhttp = new XMLHttpRequest();
			};
			
			xmlhttp.open('GET', url, false);
			xmlhttp.send(null);
			
			if (navigator.appName=="Microsoft Internet Explorer") {
				window.execScript(xmlhttp.responseText);
			} else {
				var obj = document.createElement('script');
				var textScr = document.createTextNode(xmlhttp.responseText);
				document.body.appendChild(obj);
				obj.appendChild(textScr);
			};
		};
		
		addScript('script.js');
		some_func();
</script> </body>
Содержимое script.js:
Код:
function some_func() {
	alert('some func');
};
function some_func2() {
	alert('some func2');
};
Совместимость: IE5+, Opera9+, Firefox.

Последний раз редактировалось is5201, 20.01.2010 в 13:15.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Динамическое удаление строк таблицы Tankist Events/DOM/Window 16 03.07.2013 15:42
Динамическая подзагрузка и исполнение скриптов NT Man Javascript под браузер 2 28.08.2009 11:32
ДИнамическое изминение таблицы Legi Элементы интерфейса 1 08.02.2009 03:10
Динамическое изменение размеров изображения Макс Элементы интерфейса 7 21.07.2008 15:55
Совершествуем стиль написания скриптов Mitrandir Events/DOM/Window 6 16.06.2008 08:02