July 18, 2009
Пытался заставить работать XMLHttpRequest в Опере, IE, Сафари и FireFox.
Опера проблем не вызвала вообще, как обычно. Она довольно терпима к вольностям.
В IE оказался следующий прикол:
присвоение req.onreadystatechange для асинхронных запросов должно стоять после req.open() иначе эта херня не работает, так как вызов req.open() обнуляет это поле. В примерах, скопированных мной из инета оно стояло до, посему у меня ушол битый час чтобы понять, почему оно не работает. Что характерно, судя по различным источникам, до IE 6 поведение было другим, req.onreadystatechange не обнулялся при вызове req.open() именно поэтому во многих примерах, до сих пор находимых в интернете, присвоение req.onreadystatechange стоит до req.open().
Сафари тоже в общем-то особых проблем не вызвал, ибо тестировал я уже после того, как заставил работать в IE. Тот же самый код в нем заработал сразу.
Но самое веселье оказалось, как обычно, с FireFox. Этот блядский браузер начиная с третьей версии не правильно вызывает этот самый onreadystatechange, и чтобы оно работало, надо эту функцию вешать на req.onload
На всякий случай замечу, что Сафари обижается, если пытаться присвоить одновременно req.onreadystatechange и req.onload, хотя и Опере и IE и самому FireFox это почему то совершенно похуй. Посему следует делать это через проверку
if(firefox) req.onload = state_Change;
req.onreadystatechange = state_Change;
Где state_Change - функция обработчика. Учтите только, что если вам нужна обработка не только успешной загрузки страницы, а и обработчик ошибок, то вам следует повесить его на req.onerror и req.onabort. Моя state_Change была довольно простой, поэтому я обошелся вышеприведенным. Хотя в окончательном решении, видимо, придется предусмотреть и возможность ошибок загрузки.
Переменная firefox образуется в самом начале скрипта примерно так:
var firefox = 0;
var agt=navigator.userAgent.toLowerCase();
if (agt.indexOf("firefox") != -1) firefox=1;
Ну и отдельно следует упомянуть о том, что разные браузеры используют разные версии XMLHttpRequest объекта, поэтому инициализировать его надо примерно так:
var req=null;
try{
req = new XMLHttpRequest();
}
catch (e)
{
try {
req = new ActiveXObject("Msxml2.xmlhttp");
}
catch (e){
try{
req = new ActiveXObject("Microsoft.xmlhttp");
}
catch (e){}
}
}
if (req == null) alert("Your browser does not support XMLHTTP.");
Тэги: Jul2009 Разное Полезные сведенья
posted by urbanian.ru at July 18, 2009 СвернутьВозьми и не парься с изоюретением лисапеда: http://microformats.org/wiki/rest/ahah
Работает во всех браузерах. Правда, это компактная шняжка, там всего по минимуму и только для гетов (для постов надо дописывать), но асинхронные запросы выполняет на ура в любых браузерах.
posted by мини_я at July 18, 2009 СвернутьТы явно не внимательно читал. В FireFox с версии 3.0 это не будет работать ибо он в принципе не вызывает onreadystatechange после смены состояния на 1, а успех запроса - это состояние 4. В IE 7 в общем-то тоже, если в цикл поставить, ибо req.onreadystatechange присваивается перед req.open. Одноразово оно работает, почему-то.
posted by urbanian.ru at July 19, 2009 Свернутьу мня работает. не веришь - проверь - begabozg.ru :)
posted by мини_я at July 19, 2009 СвернутьШоб я так еще понимал, что именно у тебя там функционирует на этом. Насколько я вижу, с глагны оно вообще не вызывается нигде.
Теоретически оно может работать, если данные отдаются очень быстро и состояния 1 и 4 onreadystatechange практически совпадают. FireFox правильно вызывает при смене состояния c 0 на 1, но не дальше. У меня же там, если нет данных, идет ожидание до 20 секунд на стороне серверного скрипта. Состояния 1 и 4, соответственно, очень различаются по времени. Так вот, нихера оно не работает, если не сделать так, как я описал.
posted by urbanian.ru at July 20, 2009 СвернутьНа глагне да, нету вызовов. Лан, я заходить не уговариваю. На глагне же в исходном коде страницы эти две функции обработки асинхронных запросов в самом верху видны. req.open там после req.onreadystatechange, и зуб даю - работает. Хотя соглашусь с тем, что да, данные у мня достаточно быстро по запросу отдаются. Попробую как-нть на досуге искуственно замедлить выдачу.
posted by urbanian.ru at July 20, 2009 СвернутьДа, как работает - запрос вызвать - ahah(url,target). url - адрес запроса, target - id объекта, куда выплюнет результат.
posted by urbanian.ru at July 24, 2009 СвернутьНаконец-то руки дошли - проверил с задержкой - работает. Видимо не в браузере у тебя дело. Пруфлинк: begabozg.ru/1/index.php - спецом для проверки накатал файлик. По клику на test в области с точечной границей отображается результат запроса к файлу 1.php
Код 1.php:
задержка выдачи - 10 секунд. Пашет. Функцию асинхронного запроса видно в исходном коде страницы.
posted by urbanian.ru at July 24, 2009 Свернутьблин, код похерился. короче там:
sleep(10);
echo "Тра-ля-ля-ля-ля!!! Ля!";
и все.
posted by мини_я at July 27, 2009 СвернутьСлушай, ну не парь мне мозги. Просто сравни как работают эти две страницы:
http://www.mojbred.com/test_ajax.php
http://www.mojbred.com/test_ajax1.php
Разница только в закомментированной строке if(firefox) req.onload = state_Change; В последнем, сегодня проапдейченном firefox вторая страница не работает.
Ну и заодно для IE - ставим инициализацию перед open:
http://www.mojbred.com/test_ajax2.php - и в IE оно перестает работать.
Я написал этот пост чтобы кто-то, у кого не будет работать, мог понять почему не работает. А ты людей с толку сбиваешь.
posted by мини_я at August 9, 2009 СвернутьКстати, если вдруг интересно, для чего я этак заморачивался, тут результат - http://4atec.net/
posted by mikesarchive.blogspot.com at July 18, 2009 Свернуть
posted by мини_я at July 18, 2009 СвернутьЭто готовая либа что ли? Да я в общем-то уже сделал то, что мне было нужно. На самом деле пару десятков строчек кода всего.
posted by o--0.blogspot.com/ at August 22, 2009 СвернутьПро глюк firefox'а
http://www.nczonline.net/blog/2009/07/09/firefox-35firebug-xmlhttprequest-and-readystatechange-bug/
Ошибка всплывает только при использовании определённой версии firebug и firefox. Сколько ж этот глюк у меня времени скушал, пипец...
Короче, обновляем firebug и не паримся, навряд много у кого всё ещё имеется такое роковое сочетаньице.
posted by мини_я at August 22, 2009 СвернутьУ меня нет firebug, а firefox отнюдь не одной версии этот глюк имеет, а все версии после 3.1. Я тоже нашел описание этого глюка в англоязычных блогах. Последний раз я апдейтил его недели 2 назад, глюк все ещё был.
Архив:
Jul2024 Jun2024 May2024 Apr2024 Mar2024 Feb2024 Jan2024 Dec2023 Nov2023 Oct2023 Sep2023 Aug2023 Jul2023 Jun2023 May2023 Apr2023 Mar2023 Feb2023 Jan2023 Dec2022 Nov2022 Oct2022 Sep2022 Aug2022 Jul2022 Jun2022 May2022 Apr2022 Mar2022 Feb2022 Jan2022 Dec2021 Nov2021 Oct2021 Sep2021 Aug2021 Jul2021 Jun2021 May2021 Apr2021 Mar2021 Feb2021 Jan2021 Dec2020 Nov2020 Oct2020 Sep2020 Aug2020 Jul2020 Jun2020 May2020 Apr2020 Mar2020 Feb2020 Jan2020 Dec2019 Nov2019 Oct2019 Sep2019 Aug2019 Jul2019 Jun2019 May2019 Apr2019 Mar2019 Feb2019 Jan2019 Dec2018 Nov2018 Oct2018 Sep2018 Aug2018 Jul2018 Jun2018 May2018 Apr2018 Mar2018 Feb2018 Jan2018 Dec2017 Nov2017 Oct2017 Sep2017 Aug2017 Jul2017 Jun2017 May2017 Apr2017 Mar2017 Feb2017 Jan2017 Dec2016 Nov2016 Oct2016 Sep2016 Aug2016 Jul2016 Jun2016 May2016 Apr2016 Mar2016 Feb2016 Jan2016 Dec2015 Nov2015 Oct2015 Sep2015 Aug2015 Jul2015 Jun2015 May2015 Apr2015 Mar2015 Feb2015 Jan2015 Dec2014 Nov2014 Oct2014 Sep2014 Aug2014 Jul2014 Jun2014 May2014 Apr2014 Mar2014 Feb2014 Jan2014 Dec2013 Nov2013 Oct2013 Sep2013 Aug2013 Jul2013 Jun2013 May2013 Apr2013 Mar2013 Feb2013 Jan2013 Dec2012 Nov2012 Oct2012 Sep2012 Aug2012 Jul2012 Jun2012 May2012 Apr2012 Mar2012 Feb2012 Jan2012 Dec2011 Nov2011 Oct2011 Sep2011 Aug2011 Jul2011 Jun2011 May2011 Apr2011 Mar2011 Feb2011 Jan2011 Dec2010 Nov2010 Oct2010 Sep2010 Aug2010 Jul2010 Jun2010 May2010 Apr2010 Mar2010 Feb2010 Jan2010 Dec2009 Nov2009 Oct2009 Sep2009 Aug2009 Jul2009 Jun2009 May2009 Apr2009 Mar2009 Feb2009 Jan2009 Dec2008 Nov2008 Oct2008 Sep2008 Aug2008 Jul2008 Jun2008 May2008 Apr2008 Mar2008 Feb2008 Jan2008 Dec2007 Nov2007 Oct2007 Sep2007 Aug2007 Jul2007 Jun2007 May2007 Apr2007 Mar2007 Feb2007 Jan2007 Dec2006 Nov2006 Oct2006 Sep2006 Aug2006 Jul2006 Jun2006 May2006 |
|
| |