Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / HTML, JavaScript, VBScript, CSS [игнор отключен] [закрыт для гостей] / <script> - события и "innerHTML"? / 13 сообщений из 13, страница 1 из 1
29.01.2010, 10:46:25
    #36437925
an0nym
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
<script> - события и "innerHTML"?
Два вопроса:

1. есть ли у <script src="..."> другие события кроме onload, в зависимости от которых можно сказать, успешно ли загрузился .js-файл или нет? Видел onreadystatechange, но сомневаюсь, думаю он только в IE работает. Надо хотя бы событие, происходящее после успешной загрузки (onload уже нашел, так что уже не нужно), и событие, происходящее при любой ошибке - будь-то 4xx, 5xx, желательно отдельно timeout (но его я смогу и сэмулировать)?

2. можно ли в <script></script> динамически записать код, который автоматически исполнится? Т. е. что-то вроде script_el = document.createElement('script'); script_el.innerHTML = 'alert("1")';
...
Рейтинг: 0 / 0
29.01.2010, 10:53:39
    #36437952
Яростный Меч
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
<script> - события и "innerHTML"?
an0nym,

Обычно так делают
Код: plaintext
1.
2.
3.
var scr = document.createElement("script");
scr.src="http://...";
document.body.appendChild(scr);

В src указывают адрес php или ashx, с параметрами при необходимости.
на сервере генерится js код, который отрабатывается при загрузке скрипта.

И всё это называется jsonp. Это вариант кроссдоменного аякса.
...
Рейтинг: 0 / 0
29.01.2010, 11:00:34
    #36437982
an0nym
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
<script> - события и "innerHTML"?
Яростный Меч,

я это знаю.

Именно для этого способа мне нужен отлов ошибок из вопроса 1.

Если отлов ошибок невозможен, то я хочу грузить содержимое скрипта аяксом (придется на свой домен ограничиться, переживу), запихивать его в <script></script> и таким образом подгружать. Отловить ошибки загрузки аяксом я точно смогу.
...
Рейтинг: 0 / 0
29.01.2010, 11:02:17
    #36437985
Яростный Меч
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
<script> - события и "innerHTML"?
an0nymто я хочу грузить содержимое скрипта аяксом (придется на свой домен ограничиться, переживу), запихивать его в <script></script> и таким образом подгружать.Т.е. подгрузка скрипта в виде текста?
Тогда его не в <script></script>, а прямо в функцию eval()
...
Рейтинг: 0 / 0
29.01.2010, 11:02:44
    #36437988
an0nym
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
<script> - события и "innerHTML"?
Яростный Меч,

в <script> никак? :(
...
Рейтинг: 0 / 0
29.01.2010, 11:03:00
    #36437990
an0nym
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
<script> - события и "innerHTML"?
evalить не хочется.
...
Рейтинг: 0 / 0
29.01.2010, 11:04:12
    #36437998
Яростный Меч
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
<script> - события и "innerHTML"?
an0nymevalить не хочется.А какая разница?

То, что находится в <script></script> (в хтмл), тоже фактически evalится.
...
Рейтинг: 0 / 0
29.01.2010, 11:06:51
    #36438009
an0nym
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
<script> - события и "innerHTML"?
Яростный Меч,

AFAIK, ошибки легче отловить.
...
Рейтинг: 0 / 0
29.01.2010, 11:10:26
    #36438025
Яростный Меч
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
<script> - события и "innerHTML"?
Можно попробовать создавать див, добавлять в боди, и в иннерХТМЛ присваивать
Код: plaintext
<script>загруженный скрипт</script>

Но, возможно, в некоторых браузерах <script></script> может быть только непосредственно в body или head
...
Рейтинг: 0 / 0
29.01.2010, 11:11:52
    #36438030
an0nym
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
<script> - события и "innerHTML"?
Резюмируя мои сегодняшние топики...

Есть следующий код
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
var loader = function() {
	var _files       = {};
	var _head_el     = document.getElementsByTagName('head')[ 0 ];
	var _IE_workaround = function(callback) {
		var target = window.event.srcElement;
		if (target.readyState == 'loaded') callback.call(target);
	}
	return {
		isLoaded: function(name) {
			return _files[name] ? true : false;
		},
		load: function(name, onload) {
			if (this.isLoaded(name)) {
				onload();
			} else {
				var script_el  = document.createElement('script');
				script_el.type = 'text/javascript';
				if (onload instanceof Function) {
					if (script_el.addEventListener) {
						var listener = function() {
							onload();
							script_el.removeEventListener('load', listener, false);
						};
						script_el.addEventListener('load', listener, false);
					} else if (script_el.attachEvent) {
						var listener = function() {
							_IE_workaround(onload);
							script_el.detachEvent('onreadystatechange', listener);
						};
						script_el.attachEvent('onreadystatechange', listener);
					}
				}
				script_el.src = this.path + name + '.js';
				_head_el.appendChild(script_el);
			}
			return true;
		},
		path: ''
	};
}();
loader.path = 'my_script/';
loader('class1', function() {
	var test = new class1();
	loader('class2', function() {
		var test2 = new class2();
		loader('class1', function() {
			var test3 = new class1();
			console.log(test);
			console.log(test2);
			console.log(test3);
		});
	});
});

Первая проблема - в вышеприведенном примере он подгрузит my_script/class1.js 2 раза. И у меня есть сомнения, что если после
Код: plaintext
var listener = function() {
поставить
Код: plaintext
_files[name] = true;
- это будет недостаточно безопасно - есть мизерная вероятность запросить подгрузку некоторого файла и попасть в момент, когда событие onload уже случилось, но _files[name] в true еще не проставилось. JS однопоточен? Нужно ли мне бояться этой вероятности? Как можно сделать bulletproof? :)

Вторая проблема - хочется
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
loader('class1', function() {
	var test = new class1();
	loader('class2', function() {
		var test2 = new class2();
		loader('class1', function() {
			var test3 = new class1();
			console.log(test);
			console.log(test2);
			console.log(test3);
		});
	});
});
развернуть в
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
loader('class1');
var test = new class1();
loader('class2');
var test2 = new class2();
loader('class1');
var test3 = new class1();
console.log(test);
console.log(test2);
console.log(test3);
- думаю попробовать через синхронный аякс. Стоит пробовать?
...
Рейтинг: 0 / 0
29.01.2010, 11:17:24
    #36438048
an0nym
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
<script> - события и "innerHTML"?
loader('class...

читаться как

loader.load('class...
...
Рейтинг: 0 / 0
29.01.2010, 11:24:02
    #36438071
an0nym
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
<script> - события и "innerHTML"?
и 3 проблема, хочется добавить в
Код: plaintext
load: function(name, onload) {
третий параметр onerror и, по возможности, 4 параметр - ontimeout. Само собой - это callbackи. ontimeout я могу сэмулировать с помощью setTimeout и проверкой в нём, подгрузился ли уже скрипт или нет, хотя не хотелось бы. onerror не могу.
...
Рейтинг: 0 / 0
30.01.2010, 22:50:52
    #36440519
зы
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
<script> - события и "innerHTML"?
Так что надо-то? Сделать лоадер? Так их до грязи все кому не лень делают разной степени компактности и навороченности и постят их на ajaxian.com. Возьми готовый, не ломай голову.
...
Рейтинг: 0 / 0
Форумы / HTML, JavaScript, VBScript, CSS [игнор отключен] [закрыт для гостей] / <script> - события и "innerHTML"? / 13 сообщений из 13, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]