Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737 Форумы портала PHP.SU :: Простите, у меня вопрос - а почему в AJAX обязательна функция обработчика события onreadystatechange и зачем вообще функции?
Покинул форум
Сообщений всего: 14
Дата рег-ции: Апр. 2014
Помог: 0 раз(а)
В соответствии с минимально-работающим AJAX алгоритмом XMLHttpRequest();:
1. Создание экземпляра объекта XMLHtppRequest 2. Объявление обработчика события onreadystatechange экземпляра xhr 3. Открытие соединения с указанием типа запроса get post, URL и др. парам-в 4. Посыл запроса
И
var $j=new XMLHttpRequest();$j.onreadystatechange=function(){document.body.innerHTML=$j.responseText}
$j.open("GET","/eho.php",true);
$j.send();
}
setInterval(function(){jupd()}, 1);
</script>
cat eho.php
<?php echo microtime(); ?>
(минимальной программой для примера, <script>1.-8.),
хотелось бы поинтересоваться всеми тремя видами функций в минимально-работающем примере AJAX:
1.
.onreadystatechange=function(){}
(там - где всего одна(!) команда принимает и обрабатывает)
2.
setInterval(function(){jupd()}, 1);
(когда я заменил на setInterval(jupd(), 1); - программа решила для себя: сработаю всего разочек)
3. function jupd() {}
Общей функции "для" минимального AJAX. Но если setInterval работает, только с функцией (вызвав её) - то можно было бы избавиться вставив весь код в setInterval.
Иными словами убрав хоть эти несчастные две функции до одной... setInterval(function(){jupd({.onreadystatechange=function(){}})}, 1); jupd()
________________________________ __
Теоретически возможный ответ вами .onreadystatechange=function() - из теории
Вопрос слегка более интересный: почему setInterval вызывается комплексно.
И наверное самый вопрос за который я буду драться хотя он для меня не принципиален (так же и отступлю) - но драться продолжу вновь из-за принципов. 3. function jupd() {}
________________________________
Собственно мой вопрос и вам и у будущим читателям этого вопроса: помочь пояснить код минимальной учебной программы по строкам с точки зрения попыток (
почему будет или не будет работать
почему вообще работает
и как можно улучшить наглядность для изучающих ajax
(людей не прошедших тернии битв форумных троллей "штамп-лидеров/шаблонистов").
___________________
пожалуй начну - НАЧНУ ИЗДАЛЕКА...
Как я вижу ситуацию с AJAX:
Рабочий вариант спецификации (есть и перевод http://xmlhttprequest.ru/) говорит нам что асинхронного стандарта ещё нет (как (написано) не поддерживаются браузерами readyState статусы 0,1,2,3частично).
а конкретно:
Я попытался проделать замену с создания объекта xhr (переменная с долларом) на прямое xhr.*** по всей программе - не работает. Сделал вывод - до сих пор всё неопределенно (в рабочем стандартном написано что спецификация w3c будет всё меняться и ничего не гарантируется).
...
итоги:
? обязательные функции
? обязательные $-переменные/объекты (?инкарцерации форматы)
Покинул форум
Сообщений всего: 5025
Дата рег-ции: Нояб. 2012 Откуда: Украина, Львов
Помог: 127 раз(а)
Вы хоть заглядивали в доку?
1. XMLHtppRequest 2 имеет не onreadystatechange а onload. хотя и первое также работает
2. setInterval не рекомендуеться к использованию. почему ичщем в гугле
3.
xcislav пишет:
readyState статусы 0,1,2
Зачем Вам эти статусы? статус 4 означает что запрос выполнен (тоесть не 200, а то что есть результат)
4. Вторым аргументом setInterval идет время в милисекундах. Вы же указали 1 мсек. Если мне не изменяет память то нельзя указивать меньше 54 мсек.
А теперь Вы много расписали но я так и не понял что Вам нужно. Вам нужно раз в 1 сек отправлять запрос?
IllusionMH
Отправлено: 23 Апреля, 2014 - 11:26:22
Активный участник
Покинул форум
Сообщений всего: 4254
Дата рег-ции: Февр. 2011 Откуда: .kh.ua
Помог: 242 раз(а)
esterio, там речь о первом. Просто нет точки в конце предложения и нумерованный список в строку запиан.
Писать в таймер можно что угодно, но минимально значение 4мс.
xcislav, где вы нарыли этот код?
onreadystatechange - обязательна, здесь все обрабатывается. А больше функций и не нужно.
Таймер можно выкидывать, если не нужен запрос каждые n секунд, иначе писать разумный интервал.
Покинул форум
Сообщений всего: 5025
Дата рег-ции: Нояб. 2012 Откуда: Украина, Львов
Помог: 127 раз(а)
IllusionMH пишет:
но минимально значение 4мс
Я же описал что не помню точного значения, но 1 точно не катит.
Но все же если учитивать что setInerval с таким минимальним интервалом и то что идет 2 одновременних запросса (дрегие же идут в очередь), то можно представить какая там будет очередь. Ведь я не верю что он укладеться в 4 мс в запрос.
Лично я бы делал через setTimeout в onreadystatechange
IllusionMH
Отправлено: 23 Апреля, 2014 - 12:35:03
Активный участник
Покинул форум
Сообщений всего: 4254
Дата рег-ции: Февр. 2011 Откуда: .kh.ua
Помог: 242 раз(а)
esterio, setTimeout(fn, 1) используется для переноса выполнения кода в конец "очереди" и ивент лупе. Все равно браузер выполнит это через свой минимальный интервал и не раньше чем дойдет очередь.
В данном случае явно бездумная копипаста/правка.
Да в большинстве случаев так бы и дедалось. Хотя в конечном счете получится нехилый уровень вложенности
Так что у таймаута тоже минусов хватает. Да и запросы на сервер - не отрисовка старницы. Погрешность интервала тут вообще по барабану(при разумном интрвале).
esterio
Отправлено: 23 Апреля, 2014 - 12:42:23
Активный участник
Покинул форум
Сообщений всего: 5025
Дата рег-ции: Нояб. 2012 Откуда: Украина, Львов
Помог: 127 раз(а)
IllusionMH пишет:
setTimeout(fn, 1) используется для переноса выполнения кода в конец "очереди" и ивент лупе
Здесь можно поподробней если не сложно
IllusionMH
Отправлено: 23 Апреля, 2014 - 12:59:13
Активный участник
Покинул форум
Сообщений всего: 4254
Дата рег-ции: Февр. 2011 Откуда: .kh.ua
Помог: 242 раз(а)
esterio, примерно так. for для долгого синхронного кода, который явно дольше интервала.
Если запустить так, - интервал будет в конце. Если закоментирвоать строку с таймаутом, и убрать коммент с предыдущей - interval будет вторым.
И если копнуть дальше - только IE у меня вывел before перед тем как for надолго занял единственный процесс в котором выполняется JS (собственно он и должен вывести стркоу в консоли.)
Чтобы избежать этого, можно сделать вот так
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.