Модераторы: Sardar, Aliance
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Синхронный запрос в Firefox, Не вызывается onreadystatechange 
:(
    Опции темы
mgukov
Дата 2.10.2010, 16:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 50
Регистрация: 22.3.2009

Репутация: нет
Всего: нет



При синхронном запросе в Firefox 3.6.10 не вызывается onreadystatechange. В IE, Chrome, Opera приведенный ниже фрагмент javascript работает.
Код

var req = new XMLHttpRequest();
req.open("get", "test.html", false);
req.onreadystatechange = function() { do_something(); };
req.send(null);

Как в Firefox реализовать синхронный запрос?

Вариант вроде этого : 
Код

var req = new XMLHttpRequest();
req.open("get", "test.html", false);
req.send(null);
do_something();
мне не подходит

Это сообщение отредактировал(а) mgukov - 2.10.2010, 17:25
PM MAIL   Вверх
Amphiluke
Дата 2.10.2010, 17:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


   ☽
***


Профиль
Группа: Завсегдатай
Сообщений: 1253
Регистрация: 26.8.2009

Репутация: 35
Всего: 112



Цитата(mgukov @  2.10.2010,  20:43 Найти цитируемый пост)
Вариант вроде этого 
...
мне не подходит


Почему? Какой смысл в использовании события onreadystatechange при синхронном запросе? И понимаете ли вы, что в приведенном вами случае функция do_something() будет вызвана еще до того как будет отправлен запрос?

PM   Вверх
mgukov
Дата 2.10.2010, 17:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 50
Регистрация: 22.3.2009

Репутация: нет
Всего: нет



Код

var req = new XMLHttpRequest();
req.open("get", "test.html", false);
req.send(null);
do_something();

В этом случае функция do_something() будет вызвана еще до того как будет отправлен запрос?
Не понимаю, объясните пожалуйста

Это сообщение отредактировал(а) mgukov - 2.10.2010, 17:55
PM MAIL   Вверх
Amphiluke
Дата 2.10.2010, 17:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


   ☽
***


Профиль
Группа: Завсегдатай
Сообщений: 1253
Регистрация: 26.8.2009

Репутация: 35
Всего: 112



Да не в этом случае, а вот в вашем первом случае:


Цитата(mgukov @  2.10.2010,  20:43 Найти цитируемый пост)

Код

var req = new XMLHttpRequest();
req.open("get", "test.html", false);
req.onreadystatechange = function() { do_something(); };
req.send(null);


 smile 
Потому что вы не проверяете значение свойства readyState. До того как будет отправлен запрос, событие onreadystatechange оповестит о вызове метода open (readyState=1), затем о вызове метода send (readyState=2), затем о частичном принятии данных запроса (readyState=3) и лишь потом уже об окончательном получении ответа (readyState=4). И всякий раз будет вызываться ваша do_something().

Но речь прежде всего о том, почему вас не устраивает второй вариант. smile

Это сообщение отредактировал(а) Amphiluke - 2.10.2010, 18:00
PM   Вверх
mgukov
Дата 2.10.2010, 18:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 50
Регистрация: 22.3.2009

Репутация: нет
Всего: нет



Не устраивает потому что в IE, Chrome, Opera первый вариант работает.
Допустим я создал объект XMLHttpRequest и использую его многократно. Сначала использую его для асинхронного запроса.
Код

var req = new XMLHttpRequest();
req.open("get", "test.html", ture);
req.onreadystatechange = function() { if (req.readyState == 4 && res.status == 200) do_something(); };
req.send(null);

Далее, для синхронного запроса.
Код

req.open("get", "test.html", false);
req.send(null);
if (res.status == 200) do_something();

Так если я забыл добавить 
Код
req.onreadystatechange = null;
 то в IE, Chrome, Opera do_something() выполнится 2 раза

Да и первый вариант удобнее

PM MAIL   Вверх
Amphiluke
Дата 2.10.2010, 18:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


   ☽
***


Профиль
Группа: Завсегдатай
Сообщений: 1253
Регистрация: 26.8.2009

Репутация: 35
Всего: 112



Прежде всего, обратите внимание на то, что сами разработчики FF пишут об использовании атрибута onreadystatechange для синхронных запросов:
Цитата(MDC)

onreadystatechange    nsIDOMEventListener    
A JavaScript function object that is called whenever the readyState attribute changes. The callback is called from the user interface thread.
Warning: This must not be used from native code. You should also not use this with synchronous requests.

Так что на поддержку ожидаемого вами поведения этого браузера при синхронном запросе лучше не надеяться, а писать собственный код, в котором предусмотреть все возможности.

Добавлено @ 18:40
Если вы хототе использовать код многократно для отправки как синхронных, так и асинхронных запросов, то и передавайте в функцию логический параметр, определяющий режим передачи:
Код

function sendReq(async) {
    var req = new XMLHttpRequest();
    req.open("get", "test.html", async);
    if (async)
        req.onreadystatechange = function() {
            if (req.readyState == 4 && res.status == 200) do_something();
        };
    req.send(null);
    if (!async && res.status == 200) do_something();
}


Это сообщение отредактировал(а) Amphiluke - 2.10.2010, 18:41
PM   Вверх
mgukov
Дата 2.10.2010, 18:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 50
Регистрация: 22.3.2009

Репутация: нет
Всего: нет



Согласен, большое спасибо за ответы
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию.
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0456 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.