Программисты браузеров заслуживают анальной кары

Всяческий Бред - Идти на Главную Страницу >>>

Категории:

Полезные Сведенья
Кухонная Философия
Общество и его пороки
Новости
Еда и Питье
Техника
Разное
Личное
Природа
Фото/Видео
"Веселые" Картинки
Юмор


Пишите Письма



Реклама:

Реклама

July 17, 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 Разное Полезные сведенья

Темы, имеющие некоторое отношение к этой (русскоязычный поиск в mysql все же очень не совершенен):
Ололо, набашорк! May 30, 2011
Не перевелись еще программисты... December 14, 2007
Про нововведения January 4, 2013
Лучи анальной тошноты разработчикам Vista January 22, 2010
О комментах в ЖЖ November 7, 2012


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 urbanian.ru at July 19, 2009 Свернуть
З.Ы, - фаерфокс у мня 3.0.4, на всякий



posted by mikesarchive.blogspot.com at July 18, 2009 Свернуть
posted by мини_я at July 18, 2009 Свернуть
Это готовая либа что ли? Да я в общем-то уже сделал то, что мне было нужно. На самом деле пару десятков строчек кода всего.


posted by o--0.blogspot.com/ at August 21, 2009 Свернуть
Про глюк firefox'а
http://www.nczonline.net/blog/2009/07/09/firefox-35firebug-xmlhttprequest-and-readystatechange-bug/

Ошибка всплывает только при использовании определённой версии firebug и firefox. Сколько ж этот глюк у меня времени скушал, пипец...

Короче, обновляем firebug и не паримся, навряд много у кого всё ещё имеется такое роковое сочетаньице.
posted by мини_я at August 21, 2009 Свернуть
У меня нет firebug, а firefox отнюдь не одной версии этот глюк имеет, а все версии после 3.1. Я тоже нашел описание этого глюка в англоязычных блогах. Последний раз я апдейтил его недели 2 назад, глюк все ещё был.


пользователь: пароль:
регистрироваться  Залогинится под OpenID


Архив:

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