Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 15.09.2008, 18:47
Кандидат Javascript-наук
Отправить личное сообщение для magistr_bender Посмотреть профиль Найти все сообщения от magistr_bender
 
Регистрация: 07.09.2008
Сообщений: 133

проблемка с классом
есть такой себе маленький классик...
function ajax()
{
  this.request;
  this.cache=new Array();
  this.cache.method=new Array();
  this.cache.url=new Array();
  this.cache.request_vars=new Array();
  this.cache.status_element=new Array();
  this.ajaxVersions=new Array("MSXML2.XMLHTTP.6.0",
                              "MSXML2.XMLHTTP.5.0",
                              "MSXML2.XMLHTTP.4.0",
                              "MSXML2.XMLHTTP.3.0",
                              "MSXML2.XMLHTTP",
                              "Microsoft.XMLHTTP");
  this.errors=new Array();
  this.last_status_element;
}
ajax.prototype.createAjax=function()
{
  if (window.XMLHttpRequest)
  {
    try
    {
      this.request=new XMLHttpRequest();
    }
    catch (e) {}
  }
  else if (window.ActiveXObject)
       {
         for (i=0;i<this.ajaxVersions.length;i++)
         {
           try
           {
             this.request=new ActiveXObject(this.ajaxVersions[i]);
           }
           catch (e)
           {
             if (this.ajaxVersions.length==i)
             {
               this.error.push("Невозможно создать ajax объект: "+e.toString());
             }
           }
           if (this.request)
           {
             break;
           }
         }
       }
}
ajax.prototype.send_request=function(method,url,request_vars,status_elem_id)
{
  this.cache['method'].push(method);
  this.cache['url'].push(url);
  //if (request_vars)
  //{
    //request_vars=encodeURIComponent(request_vars);
  //}
  this.cache['request_vars'].push(request_vars);
  this.cache['status_element'].push(document.getElementById(status_elem_id));
  if (this.request)
  {
    try
    {
      if ((this.request.readyState==4 || this.request.readyState==0) && this.cache['url'].length>0)
      {
      	cache_entry=new Array();
        cache_entry['method']=this.cache['method'].shift();
        cache_entry['url']=this.cache['url'].shift();
        cache_entry['request_vars']=this.cache['request_vars'].shift();
        this.last_status_element=this.cache['status_element'].shift();
        var self=this;
        var self_element=this.last_status_element;
        this.request.onreadystatechange=function () {self.get_response(self,self_element)};
        this.request.open(cache_entry['method'],cache_entry['url'],true);
        this.request.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
        this.request.send(cache_entry['request_vars']);
      }
    }
    catch (e)
    {
      this.errors.push("Невозможно отправить данные на сервер: "+e.toString());
    }
  }
  else
  {
  	this.errors.push("Не создан объект для отправки данных на сервер.")
  }
}
ajax.prototype.get_response=function (self,self_element)
{
  try
  {
    if (self.request.readyState==4)
    {
      if (self.request.status==200)
      {
        self.last_status_element.innerHTML='';
        var response=eval("("+self.request.responseText+")");
        var element;
        var element_content;
        for (i=0;i<response.id.length;i++)
        {
          if (response.label[i]=='d')
          {
            eval(response.content[i]);
          }
          else
          {
            element=document.getElementById(response.id[i]);
            element.innerHTML=response.content[i];
          }
        }
      }
      setTimeout('xmlhttp.send_request()',500);
    }
    else
    {
      self_element.innerHTML='<div align="center"><img src="ajax/wait.gif" border="0"> Загрузка...</div>';
    }
  }
  catch (e)
  {
    self.errors.push("Невозможно прочитать ответ: "+e.toString());
  }
}
var xmlhttp=new ajax();
xmlhttp.createAjax();

который типо аякс)))) и написанный с применением фрэймворка прототайп ,как вы могли уже заметить, дорогие читатели.
но, у этого класса есть небольшой (ну смотря с какой стороны постомреть мож и большой) глюк, он заключается в том, что гдето после 13 запросса(странное число не правда ли?) если не обновлять страничку то для отправки реквеста необходимо дважды обратиться к функции сенд с первого раза она непонимает ... при чём ждать можно сколь угодно долго.. всёравно с первого кликане срабатывает, но как только делаеш 2-й клик реквест отсылается, но респонс считывается не 1 раз а 2 .. собственно как и кликов... тоесть респонс возвращается 2 раза подрят... в чём бок?

Последний раз редактировалось magistr_bender, 15.09.2008 в 18:50.
Ответить с цитированием
  #2 (permalink)  
Старый 15.09.2008, 18:53
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

Сообщение от magistr_bender
написанный с применением фрэймворка прототайп ,как вы могли уже заметить
Че-та не заметили.
Сообщение от magistr_bender
this.cache=new Array(); 
this.cache.method=new Array(); 
this.cache.url=new Array(); 
this.cache.request_vars=new Array(); 
this.cache.status_element=new Array();
В js нет ассоциативных массивов.
Ответить с цитированием
  #3 (permalink)  
Старый 15.09.2008, 19:00
Кандидат Javascript-наук
Отправить личное сообщение для magistr_bender Посмотреть профиль Найти все сообщения от magistr_bender
 
Регистрация: 07.09.2008
Сообщений: 133

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

вопрос в другом... как это исправить... хоть убей непойму

Последний раз редактировалось magistr_bender, 15.09.2008 в 19:08.
Ответить с цитированием
  #4 (permalink)  
Старый 15.09.2008, 19:12
Кандидат Javascript-наук
Отправить личное сообщение для magistr_bender Посмотреть профиль Найти все сообщения от magistr_bender
 
Регистрация: 07.09.2008
Сообщений: 133

я кажется понял в чём бок.. бок в таймауте.. если слишком часто вызываеш запросы то начинает глючить... но опять же непойму как исправить.. надо походу както таймаут установить
Ответить с цитированием
  #5 (permalink)  
Старый 15.09.2008, 19:12
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

magistr_bender, процитированный мною код все равно, что
this.cache=new String(); 
this.cache.method=new Array(); 
this.cache.url=new Array(); 
this.cache.request_vars=new Array(); 
this.cache.status_element=new Array();
Жестокий и бессмысленный.
Ответить с цитированием
  #6 (permalink)  
Старый 15.09.2008, 19:27
Кандидат Javascript-наук
Отправить личное сообщение для magistr_bender Посмотреть профиль Найти все сообщения от magistr_bender
 
Регистрация: 07.09.2008
Сообщений: 133

я понимаю ваше негодование профессор, но мне надо както сделать кэш запросов... если не так, то как?
Ответить с цитированием
  #7 (permalink)  
Старый 15.09.2008, 19:30
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

this.cache = {};
Ответить с цитированием
  #8 (permalink)  
Старый 15.09.2008, 19:36
Кандидат Javascript-наук
Отправить личное сообщение для magistr_bender Посмотреть профиль Найти все сообщения от magistr_bender
 
Регистрация: 07.09.2008
Сообщений: 133

в таком случае запросы не выполняются вообще... а когда обозначен массив всё ок
Ответить с цитированием
  #9 (permalink)  
Старый 15.09.2008, 19:37
Кандидат Javascript-наук
Отправить личное сообщение для magistr_bender Посмотреть профиль Найти все сообщения от magistr_bender
 
Регистрация: 07.09.2008
Сообщений: 133

а не. .сори.. гоню. всё ок) щас только проверю будет ли бок

бок так и не пропал... но теперь он после 5 запроса гдето

Последний раз редактировалось magistr_bender, 15.09.2008 в 19:41.
Ответить с цитированием
  #10 (permalink)  
Старый 15.09.2008, 19:39
Отправить личное сообщение для Андрей Параничев Посмотреть профиль Найти все сообщения от Андрей Параничев
 
Регистрация: 21.02.2008
Сообщений: 1,250

magistr_bender,
Порядок должен быть такой:
<объект_xmlHTTPRequest>.open(...)
<объект_xmlHTTPRequest>.onreadystatechange = function(){}
<объект_xmlHTTPRequest>.send()
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
FF и IE - проблемка.... Ilja_ORDY Общие вопросы Javascript 5 17.09.2008 09:22
Проблемка со скриптом Дмитрий Общие вопросы Javascript 3 07.08.2008 17:14