Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

HTML+CSS+JavaScript

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: асинхронный ажакс
 
 автор: btr   (10.02.2013 в 12:47)   письмо автору
 
 

Здравствуйте.

в див с id='a_all' пытаемся вывести рез-т запроса через ажакс

  var e_t = document.getElementById('a_all');
  e_t.innerHTML = '';
  str1 = ajax_1('?dd=4',1);
  e_t.innerHTML = str1;


сам запрос:

function ajax_1(param,if_get)
{
// получаем объект запроса
var xmlhttp = getXmlHttp();
get_return = 'пустое место';

// создаем путь
var get_url = '1.php';
var get_ = get_url + param;
// запрос
xmlhttp.onreadystatechange = function() 
{
  if (xmlhttp.readyState == 4) 
  {
    if(xmlhttp.status == 200) 
    {
      if (if_get == 1) 
      {
        get_return = xmlhttp.responseText;
        alert(get_return + ' vvv ' + xmlhttp.responseText+"rrrr"); 
      }
    }
  }
}

xmlhttp.open('GET', get_,true);
xmlhttp.send(null);
return get_return;
}

в файле 1.php:
echo 'запрос прошел';


получаем алерт:
"запрос прошел  // вроде бы переменной get_return значение присвоено?

 vvv запрос прошел

rrrr"


через переменную get_return в e_t.innerHTML добавляется "пустое место".

подскажите, пожалуйста, почему?

  Ответить  
 
 автор: btr   (10.02.2013 в 13:20)   письмо автору
 
   для: btr   (10.02.2013 в 12:47)
 

-----------------------
пс догадываюсь, что алерт и присвоение срабатывает позже, чем приходит ответ.
Нашел, что вытащить это значение можно через функцию обратного вызова, переданную в качестве параметра в ajax_1. Но вот как организовать доступ к этому значению вне функции ajax_1?

разЪясните пожалуйста

  Ответить  
 
 автор: btr   (10.02.2013 в 13:43)   письмо автору
 
   для: btr   (10.02.2013 в 13:20)
 

ну хотя бы толкните, где почитать про это?
пажаалуйста!!

  Ответить  
 
 автор: btr   (10.02.2013 в 14:25)   письмо автору
 
   для: btr   (10.02.2013 в 13:43)
 

в общем, решил поступить так:

передал в функцию объект, в который надо вставить рез-т запроса

  var e_t = document.getElementById('a_all');
  e_t.innerHTML = '';
  ajax_1('?dd=4',1,e_t)


и произвожу вставку в обработчике
xmlhttp.onreadystatechange = function() 
{
  if (xmlhttp.readyState == 4) 
  {
    if(xmlhttp.status == 200) 
    {
      if (if_get == 1) 
      {
        e_t.innerHTML = xmlhttp.responseText;
      }
    }
  }
}


правильно ли так поступать?

  Ответить  
 
 автор: ЯСА   (11.02.2013 в 09:30)   письмо автору
 
   для: btr   (10.02.2013 в 14:25)
 

во-первых:
надо так:
1. open
2. onreadystatechange
3. send


а у вас:
1. onreadystatechange
2. open
3. send

во-вторых, функция, создающая объект xmlhttp, открывающая его и отсылающая запрос, не может ничего знать о том, каков будет ответ сервера

ответ сервера узнаёт безымянная функция, коя прописана у вас на событии onreadystatechange объекта xmlhttp и ответ эта функция может получить только после четвёртого её срабатывания (когда readyState изменится в четвёртый раз с нуля до 4-х)

следовательно, сначала делаете просто вызов функции ajax_1 (), которая ничего не должна возвращать (внутри функции скрипач return get_return; не нужен)
var e_t = document.getElementById('a_all');
  e_t.innerHTML = '';
  str1 = ajax_1('?dd=4',1);
  e_t.innerHTML = str1;

прописывание ответа сервера должно быть внутри безымянной функции, коя "навешена" у вас на onreadystatechange

  Ответить  
 
 автор: btr   (11.02.2013 в 09:52)   письмо автору
 
   для: ЯСА   (11.02.2013 в 09:30)
 

во-первых спасибо.

во-вторых
прописывание ответа сервера должно быть внутри безымянной функции,
а поподробнее можно? как именно прописать ответ??

я вот просто в эту безымянную функцию элемент передал, но мне кажется, это не совсем правильно...

  Ответить  
 
 автор: ЯСА   (11.02.2013 в 10:29)   письмо автору
 
   для: btr   (11.02.2013 в 09:52)
 

в народе говорят, что "когда кажется - креститься надо"
но лучше всего - узнать
------

теоретически всё очень просто:
1) функция А () создаёт объект XMLHTTPRequest, открывает его и отправляет запрос

2) на этом её работа исчерпывается, здесь происходит т.н. "разрыв исполнения", сравнимый с использованием модального окна alert () внутри js-кода: покуда на "ОК" не нажмёте, исполнение приостанавливается
на какое время приостанавливается - оно неизвестно, зависит от пользователя

3) так и здесь... когда придёт ответ сервера (и придёт ли он?) - функции А () неизвестно
время получения запроса сервером и прихода ответа от него зависит от многих факторов (скорость, обеспечиваемая провайдером; доступность сервера и т.д.)

4) но внутри функции А () вы можете назначить вызов другой функции - функции В (), которая будет срабатывать при изменении состояния объекта XMLHTTPRequest

5) "место для вывода" ответа сервера вы можете:
-- либо прописать непосредственно в функции В () - если это "место" можно определить в глобальных переменных (например, по id объекта),
-- либо передать это "место" через параметры функции В () из функции А ()
и первый, и второй способы будут "правильными" - решение "как лучше" принимать вам
--------------

AJAX (ажакс) - это от английского Asynchronous Javascript and XML
так что ваш "асинхронный ажакс" - это что-то дважды асинхронное :)

  Ответить  
 
 автор: btr   (11.02.2013 в 20:03)   письмо автору
 
   для: ЯСА   (11.02.2013 в 10:29)
 

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

  Ответить  
 
 автор: ЯСА   (11.02.2013 в 21:08)   письмо автору
 
   для: btr   (11.02.2013 в 20:03)
 

объект для связи страницы с сервером называется XMLHTTPRequest
а работать он может как синхронно, так и Асинхронно
и только в последнем случае это называется AJAX

почитайте про это дело по-русски

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования