Показать сообщение отдельно
  #1 (permalink)  
Старый 10.07.2011, 18:27
Кандидат Javascript-наук
Отправить личное сообщение для Slavenin Посмотреть профиль Найти все сообщения от Slavenin
 
Регистрация: 20.11.2010
Сообщений: 143

Класс для работы с ajax
Написал для работы вот такой вот класс:
function  AJAXprov()
{
  var xmlhttp;
  
  this.provXmlHttp = function()
  {
	  var xmlhttp;
    try 
    {
		  xmlhttp = new ActiveXObject('Msxml2.XMLHTTP');
	  } 
    catch (e) 
    {
		  try 
      {
  		  xmlhttp = new ActiveXObject('Microsoft.XMLHTTP');
  		} 
      catch (E) 
      {
		    xmlhttp = false;
		  }
	  }
	  if (!xmlhttp && typeof XMLHttpRequest!='undefined') 
    {
		  xmlhttp = new XMLHttpRequest();
	  }
    return xmlhttp;
  }


  
//  this.changeState = function()
//  {
//    if (this.xmlhttp.readyState == 4) 
//    {
//      if(this.xmlhttp.status == 200) 
//      {
//        //this.setAnsw(this.xmlhttp.responseText);
//        eval( "(" + 'this.answServ = '  + this.xmlhttp.responseText + ")");
//      }
//    }
//  }
  
//функция принимает 4 параметра первый - режим работы false/true (синх/асинх), 
//второй - тип запроса (POST/GET)
//третий - параметры для запроса (адрес, по которому нужно отправить запрос
//четвертый -  аргумент, содержащий параметры для запроса
  this.sendAnsServ = function (modeWork, typeSend, adr, param)
  {
    //var xmlhttp = this.xmlhttp;
    if(typeSend == 'G')
    {
      adr = adr + '?' + param;
      httpP.open('GET', adr, modeWork);
      httpP.setRequestHeader('Cache-Control', 'no-cache, must-revalidate');
      //	 httpP.onreadystatechange = this.changeState
        httpP.onreadystatechange = function()
        {
        if (httpP.readyState == 4) 
    		{
          if(httpP.status == 200) 
          {
            setAnsw(httpP.responseText);
          }
        }
      }
      httpP.send(null);
    }
    if(typeSend == 'P')
    {
      httpP.open('POST', adr, modeWork);
      httpP.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
    	httpP.setRequestHeader('Cache-Control', 'post-check=0,pre-check=0, false');
    	httpP.setRequestHeader('Cache-Control',  'max-age=0, false');
    	httpP.setRequestHeader('Pragma', 'no-cache');
    	httpP.setRequestHeader('Cache-Control', 'no-cache, must-revalidate');
    	httpP.send(param);
      if(this.xmlhttp.status == 200)
      {
        setAnsw(httpP.responseText);
      }
    }
  }
}
  
function test()
{
  ttt = new AJAXprov();
  httpP = ttt.provXmlHttp();
  ttt.sendAnsServ(true, 'P', 'http://localhost/enginenew/router.php', 'p=3,1,test,1');
 // document.getElementById('test').innerHTML = answServ;
  
}

 //=======================
//устанавливат ответ сервера
//======================= 
  function setAnsw (answ)
  {
    var str =  'answServ = \''  + answ + '\';';
    eval(str);
    //eval('var obj = ' + d + ';');
  }

<a href ="" onclick ="test()">test</a>
<div id="test"></div>

но возникло несколько вопросов.
первый, если назначить на изменение состояния внутреннюю функцию обработчик, то при его изменении и обращении к назначенной функции теряется указатель this. Реально ли вообще назначить свой обработчик события?
второй, при выводе в нужный див происходит странная вещь, ответ с сервера сначала в него выводится, а потом оттуда исчезает, дебагерами оперы и ИЕ в происходящем разобраться не удалось, фаербаг показал след картину, сначала ответ с сервака выводится в див, затем происходит вызов
function onclick(event) {
 test();
 }
и инфа из дива пропадает. Что происходит я не понимаю. До этого писал подобную функцию и все нормально работало...
третье, почему-то не работает отсылка параметров методом POST не передается параметр "р". Подскажите что происходит.
__________________

Ответить с цитированием