Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #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 не передается параметр "р". Подскажите что происходит.
__________________

Ответить с цитированием
  #2 (permalink)  
Старый 10.07.2011, 18:30
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 28.03.2011
Сообщений: 5,418

напиши в начале кода
debugger

открой файрбаг и прослеживай за течением кода, нажимая F11\F10

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

Сообщение от melky Посмотреть сообщение
напиши в начале кода
debugger

открой файрбаг и прослеживай за течением кода, нажимая F11\F10

..
и в JS классов нет -_- это функция
я и так все отследил и какой именно из вызовов все портит тоже написал.

а насчет классов, все лишь пользуюсь авторитетной терминологией http://javascript.ru/tutorial/object...unkciya-extend
__________________

Ответить с цитированием
  #4 (permalink)  
Старый 10.07.2011, 19:38
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 28.03.2011
Сообщений: 5,418

о, извини. многа букав.


Цитата:
первый, если назначить на изменение состояния внутреннюю функцию обработчик, то при его изменении и обращении к назначенной функции теряется указатель this. Реально ли вообще назначить свой обработчик события?
да. очень даже. все делается через функцию call или apply


Цитата:
третье, почему-то не работает отсылка параметров методом POST не передается параметр "р". Подскажите что происходит.
чтобы отсылать данные через ПОСТ, следует
httpP.send("data=itIsMyData&anotherdata=anotherdata")

проверь это. у тебя странная query

и еще. попробуй уже сам найти ошибку. ниже представлена структура твоего кода. где же ты ошибся?


function  AJAXprov()  {
  
  Ajax_OBJ;

  this.sendAnsServ = function (modeWork, typeSend, adr, param)  {


    if(typeSend == 'G')  {

	      *!*adr = adr + '?' + param;//  => adr +  "?p=3,1,test,1"*/!*
	
	      open_request, 
	      setting_headers,
	      set_onreadystatechange 
	      send;
	
	     (тут всё ок. )
    }

    if(typeSend == 'P')
    {

      open;
      set_headers;

      *!*send(param);// => 3,1,test,1 */!*

*!*
      if(this.xmlhttp.status == 200)
      {
        setAnsw(httpP.responseText);
      }
*/!*

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

да, this я пропустил, просто хотел вначале сделать объект xmlhttp полем своего объекта, но с этим опять возникла куча проблем, а указатель остался. но строка if(httpP.status == 200) по-прежнему вызывает ошибку в ИЕ причем написано "Остановлено в результате возникновения неизвестной ошибки." Пост отсыл я в принципе починил. Но проблема с тем что инфа сначала появляется в диве, а потом оттуда исчезает осталась... с этим то что делать?
__________________

Ответить с цитированием
  #6 (permalink)  
Старый 11.07.2011, 00:01
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 28.03.2011
Сообщений: 5,418

это виноват колбек. что там в эвале - ведаете только вы

//=======================
//устанавливат ответ сервера
//======================= 
  function setAnsw (answ)
  {
    var str =  'answServ = \''  + answ + '\';';
    eval(str);
    //eval('var obj = ' + d + ';');
  }
Ответить с цитированием
  #7 (permalink)  
Старый 11.07.2011, 00:07
Кандидат Javascript-наук
Отправить личное сообщение для Slavenin Посмотреть профиль Найти все сообщения от Slavenin
 
Регистрация: 20.11.2010
Сообщений: 143

сделал прямой вывод
function setAnsw (answ)
  {
    //var str =  'answServ = \''  + answ + '\';';
    //eval(str);
    document.getElementById('test').innerHTML = answ;
  }

результат тот же... А в eval просто строка, потом там должен быть объект json, пока же просто строка
__________________


Последний раз редактировалось Slavenin, 11.07.2011 в 00:09.
Ответить с цитированием
  #8 (permalink)  
Старый 11.07.2011, 12:20
Кандидат Javascript-наук
Отправить личное сообщение для Slavenin Посмотреть профиль Найти все сообщения от Slavenin
 
Регистрация: 20.11.2010
Сообщений: 143

мда, опять я обманул сам себя... как оказалось, то что в параметре href прописана ссылка на саму страницу, явилось причиной ее постоянного обновления, отсюда исчезновение вывода. Достаточно просто было дописать в onclick return false; и все встало на свои места. Всем благодарность за участие, тему можно закрывать
__________________


Последний раз редактировалось Slavenin, 11.07.2011 в 12:26.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Решение проблемы кодировок для AJAX и PHP без iconv (cp1251 в AJAX) Serge Ageyev AJAX и COMET 10 24.04.2013 20:48
Как в общем меню для всех страниц поменять класс определенного пункта в зависимости о phenom Элементы интерфейса 2 08.04.2011 11:09
Ищу библиотеки для работы с 3D Бобр Общие вопросы Javascript 3 06.08.2010 17:02
JS-скрипт для вывода результата работы PHP-скрипта в заданном месте страницы Tycoon AJAX и COMET 0 06.11.2009 10:18
Модуль для работы с модулями JSprog Ваши сайты и скрипты 29 02.09.2009 13:31