Live, live, live... Die! Live?!..
Создание, последовательность отработки и удаление js-скриптов.
live_die.js:
var d = document;
var h = d.documentElement.firstChild; //~ <head>
function _debug(m) {
var p = d.createElement("p");
p.appendChild(d.createTextNode(m + " :: " +
(new Date().valueOf()).toString().substr(0,10)));
d.body.appendChild(p);
}
function createScript(src) {
_debug("create :: " + src);
var s = d.createElement("script");
s.setAttribute("src", src);
h.appendChild(s);
}
window.onload = function() {
createScript("http://"); //~ fake url
createScript("live_die.php?s=2");
}
live_die.php:
if ('1' === $_GET['s']) sleep(10); //~ это нам ещё пригодится.
elseif ('2' !== $_GET['s']) die();
echo '_debug("resonse :: ' . $_GET['s'] . '");';
Всё замечательно. Первый скрипт быстро отваливается, т.к. указан несуществующий ресурс, второй отрабатывает и в _debug() уходит m=2. Теперь изменим источник первого скрипта на live_die.php?s=1 и посмотрим реакцию браузеров.
window.onload = function() {
createScript("live_die.php?s=1");
createScript("live_die.php?s=2");
}
Opera. Версию 7.21 убираю из рассмотрения как недоразумение, т.к. скрипты для неё нужно создавать несколько иначе и портить код не хочется. Версия 7.54 покажет следующее:
create :: live_die.php?s=2 :: 1111957820
create :: live_die.php?s=1 :: 1111957820
resonse :: 2 :: 1111957820
resonse :: 1 :: 1111957830
[28/Mar/2005:02:10:20 +0500] "GET /live_die.php?s=2 HTTP/1.1"
[28/Mar/2005:02:10:30 +0500] "GET /live_die.php?s=1 HTTP/1.1"
Хм… как всегда, не знаешь чего и ждать. Ну да ладно, порядок создания запросов мне в данный момент менее интересен, гораздо интереснее их отработка и вывод результатов. Здесь без сюрпризов. Кстати, камень в огород кривой b3: первым она, в отличие от своей предшественницы, создаст запрос live_die.php?s=1, после чего замёрзнет на десять секунд, дожидаясь ответа сервера (отголоски прикручивания XmlHTTPRequest?).
IE 5.0, 5.5, 6. Без неприятных сюрпризов, как и 7.54:
create :: live_die.php?s=1 :: 1111955181
create :: live_die.php?s=2 :: 1111955181
resonse :: 2 :: 1111955181
resonse :: 1 :: 1111955191
Mozilla 1.75, 1.4; FF 1.0, 0.9.3, 0.6. Запросы так же создаются одновременно, но результатов отработки второго мы не увидим до тех пор, пока браузер не разберётся с первым:
create :: live_die.php?s=1 :: 1111956626
create :: live_die.php?s=2 :: 1111956626
resonse :: 1 :: 1111956636
resonse :: 2 :: 1111956636
[28/Mar/2005:01:50:26 +0500] "GET /live_die.php?s=2 HTTP/1.1"
[28/Mar/2005:01:50:36 +0500] "GET /live_die.php?s=1 HTTP/1.1"
И, да, ещё один интересный момент:
function createScript(src) {
_debug("create :: " + src);
var s = d.createElement("script");
s.onreadystatechange = function(){_debug("IE: readystatechange");}
s.setAttribute("src", src);
h.appendChild(s);
}
window.onload = function() {
createScript("live_die.php?s=1");
setTimeout( function(){
h.removeChild(h.lastChild);
_debug("removed");
}, 5000);
}
IE:
create :: live_die.php?s=1 :: 1112136602
IE: readystatechange :: 1112136602
removed :: 1112136607
IE: readystatechange :: 1112136612
Opera, Mozilla:
create :: live_die.php?s=1 :: 1112136670
removed :: 1112136675
resonse :: 1 :: 1112136680
Т.е. если в промежутке «запрос-ответ» удалить сам скрипт, то ответ дойдёт до всех трёх браузеров, но вот функция, вызываемая из него, в IE уже не будет отрабатывать.
Categories: dHtml | comments: (0)