Live, live, live... Die! Live?!..

30th March 2005 - 04:11

Создание, последовательность отработки и удаление 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)

Комментарии временно отключены.