Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > JavaScript, Ajax
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.12.2009, 08:37   #1
slips
Форумчанин
 
Аватар для slips
 
Регистрация: 28.10.2008
Сообщений: 350
По умолчанию Ajax проблемы с загрузкой

Доброе утро, вопрос заключается в слудующем.
Есть две кнопки, при щелчке на первой срабатывает JS который при помощи Ajax возвращает данные, при клике на другую другие данные.
Так вот если очень быстро щёлкать то на одну то на другую кнопку теряются результаты возвращаемые сервером.
Как с этим можно бороться ?
slips вне форума Ответить с цитированием
Старый 06.12.2009, 12:57   #2
SkyM@n
Laravel/Vue expert
Старожил Подтвердите свой е-майл
 
Аватар для SkyM@n
 
Регистрация: 08.08.2007
Сообщений: 2,832
По умолчанию

Нужно немного подправить скрипт.
SkyM@n вне форума Ответить с цитированием
Старый 06.12.2009, 23:47   #3
slips
Форумчанин
 
Аватар для slips
 
Регистрация: 28.10.2008
Сообщений: 350
По умолчанию

Цитата:
Сообщение от SkyM@n Посмотреть сообщение
Нужно немного подправить скрипт.
Т.е. проблема только в этом ?
slips вне форума Ответить с цитированием
Старый 07.12.2009, 00:25   #4
SkyM@n
Laravel/Vue expert
Старожил Подтвердите свой е-майл
 
Аватар для SkyM@n
 
Регистрация: 08.08.2007
Сообщений: 2,832
По умолчанию

да, всего лишь.
SkyM@n вне форума Ответить с цитированием
Старый 07.12.2009, 02:08   #5
slips
Форумчанин
 
Аватар для slips
 
Регистрация: 28.10.2008
Сообщений: 350
По умолчанию

Цитата:
Сообщение от SkyM@n Посмотреть сообщение
да, всего лишь.
Если бы я знал где.
Может вы подскажите.
Код HTML:
// создание ajax объекта
function createRequestObject()
{
    // переменная для хранения ссылок на обьект XmlHttpRequest
     var xmlHttp;
     try
     {
       // попытка создать обьект XmlHttpRequest
       xmlHttp = new XMLHttpRequest();
     }
     catch(e)
     {
       // предпологается что в качестве браузера использует
       // ie6 и более старая его версия
       var xmlHttpVersions = new Array('Msxml2.XMLHTTP.6.0',
                                       'Msxml2.XMLHTTP.5.0',
                                       'Msxml2.XMLHTTP.4.0',
                                       'Msxml2.XMLHTTP.3.0',
                                       'Msxml2.XMLHTTP',
                                       'Microsoft.XMLHTTP');
     // пытаемся создать обьект
     // пока одна из попыток не увенчается успехом
     for (var i=0; i<xmlHttpVersions.length && !xmlHttp; i++)
       {
        try
          {
            // попытка создать обьект XmlHttpRequest
            xmlHttp = new ActiveXObject(xmlHttpVersions[i]);
          }
        catch(e) {} // игнорируем возможные ошибки
       }
     } // вернусть созданный обьект или сведения об ошибке

     if (!xmlHttp)
       return null; else return xmlHttp;
}

function RequestDataTabs(idElement)
{
  var curTab=idElement.parentNode; // ссылаемся на li
  var ulTab=curTab.parentNode;       // ссылаемся на ul
  var cont=nodeById('InfContener'); //нашли контейнер
  var url='tabs.php';
  for (var i=0; i<ulTab.childNodes.length; i++)
    ulTab.childNodes[i].className = (ulTab.childNodes[i].className == "active") ? ''
      : ulTab.childNodes[i].className;
   curTab.className += 'active';
  var http=createRequestObject();
  if (http)
    {
      try
      {
        http.open('GET', url+'?tabid='+curTab.id,true);	       // инициируем загрузку страницы
        http.onreadystatechange = function () {	   // назначаем асинхронный обработчик события
				if(http.readyState == 4)
				 {
				  if (http.status == 200)
				    { // значение 200 говорит о том что транзакция прошла успешно
				     try
				      {
					    cont.innerHTML = http.responseText; // присваиваем содержимое
					  }catch(e) { alert("Ошибка чтения ответа сервера"+e.toString());}

					}
					 else {
                     alert("Не удалось получить данные:\n" +
                     http.statusText);
                     }
				}
			}
		http.send(null);
      } // вывести сообщение об ошибке в случае неудачи
      catch(e)
       {
         alert("Невозможно сооединиться с сервером:\n"+e.toString());
       }
    }
}
slips вне форума Ответить с цитированием
Старый 07.12.2009, 02:20   #6
slips
Форумчанин
 
Аватар для slips
 
Регистрация: 28.10.2008
Сообщений: 350
По умолчанию

такое ощущение что проблема имено в переменой
Код HTML:
      var http;

Последний раз редактировалось slips; 07.12.2009 в 05:20.
slips вне форума Ответить с цитированием
Старый 07.12.2009, 11:45   #7
mv28jam
Старожил
 
Аватар для mv28jam
 
Регистрация: 09.09.2008
Сообщений: 2,624
По умолчанию

Код:
function RequestDataTabs(idElement)
...if (http.status == 200){
      cont.innerHTML = http.responseText;...
Это происхоит из-за того что вы не следите за событиями. Вы запускаете ф-ю без параметра, который говорит о том какое событие будет обрабатывать этот запрос, в результате у вас может висеть неограниченное количество запросов, которые могут сработать в любой момент независимо от порядка их вызова. Это всё равно что пытаться записать время прихода сотрудников на работу без указания имён.
есть 2 варианта решения
1)Запретить отправку запроса если не пришёл результат любого другого уже запущенного.
Код:
function RequestDataTabs(idElement){
   if(!flag) return false;
   flag=false;
...if (http.status == 200){
      flag=true;
      cont.innerHTML = http.responseText;...
2)Давать событиям(запросам) идентификаторы, и зависимости от того какое событие произошло определять действия.
Код:
function RequestDataTabs(idElement, id){
...if (http.status == 200){
      somefunction(http.responseText, id);
      ...
}
function somefunction(res, id){
   if(id  ....) x.innerHTML = res;
}
Стрелок-охотник
mv28jam вне форума Ответить с цитированием
Старый 07.12.2009, 18:01   #8
slips
Форумчанин
 
Аватар для slips
 
Регистрация: 28.10.2008
Сообщений: 350
По умолчанию

спасибо вам огромное..
slips вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с загрузкой ОС Vali_T Операционные системы общие вопросы 18 07.04.2010 18:50
Проблема с загрузкой страницы Nester Работа с сетью в Delphi 5 06.11.2009 13:37
Проблема с загрузкой XP. hebu Windows 11 20.07.2009 14:33
помогите с загрузкой в веббраузер.. Анастасия123456789 Общие вопросы Delphi 4 27.11.2008 15:51
Проблемы с загрузкой главной страницы. antfrolov Помощь студентам 2 05.04.2008 16:50