Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 05.01.2009, 03:32
V0v@n
 
Сообщений: n/a

Как перередать responseXML в ф-цию?
Здравствуйте! Помогите разобраться..
Вот код:

var respXml = 1;
var xmlHttp = createXmlHttpRequestObject();

function createXmlHttpRequestObject()

{

...
}


function ajax ( params , serverAddress )

{

if (xmlHttp)

{
try

{

if ((xmlHttp.readyState == 4 || xmlHttp.readyState == 0))

{

xmlHttp.open("POST", serverAddress , true);

xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");


xmlHttp.onreadystatechange = handleRequestStateChange;

xmlHttp.send ( params);

}

}

catch (e)

{

displayError("search error: "+e.toString());

}

}

}


function handleRequestStateChange()

{
if (xmlHttp.readyState == 4)

{
if (xmlHttp.status == 200)

{

respXml = xmlHttp.responseXml;

}

else

{

displayError("handleRequestStateChange error: "+xmlHttp.statusText);

}

}

}


Вопрос - как перередать значение respXml в функцию для последующей обработки. Через return или глобальную переменную. Последняя почему-то не изменяется. Почему? Тогда весь код выше можно было бы записать в отдельный файл, он был бы универсальным, подключался при необходимости во всех случаях. Хотется получить примерто это:
var xml = ajax ( params , serverAddress );
или var xml = respXml;
//обработка xml

Вариант написать в
handleRequestStateChange()
..
respXml = xmlHttp.responseXml;
response(respXml);
Не подходит, потому что для разных запросов должны быть и разные обработчики..
Спасибо.
Ответить с цитированием
  #2 (permalink)  
Старый 05.01.2009, 12:17
Отправить личное сообщение для Octane Посмотреть профиль Найти все сообщения от Octane  
Регистрация: 10.07.2008
Сообщений: 3,873

Передавайте в обработчик события onreadystatechange свою callback-функцию, которую он вызовет в нужное время с соответствующими параметрами.
Ответить с цитированием
  #3 (permalink)  
Старый 05.01.2009, 16:50
Новичок на форуме
Отправить личное сообщение для V0van Посмотреть профиль Найти все сообщения от V0van
 
Регистрация: 05.01.2009
Сообщений: 3

Тоесть типа так?
function handleRequestStateChange() 
{  
  if (xmlHttp.readyState == 4) 
  {
    if (xmlHttp.status == 200) 
    {
      try
      {
         readResponse();
      }
      catch(e)
      {
        displayError(" error: "+e.toString());
      }
    }
    else
    {
      displayError("error: "+xmlHttp.statusText);
    }
  }
}

Если надо обработать один запрос с одним обработчиком - то да. В readResponse(); пишеться необходимый код обработки xml и все. А если на странице 10 аякс запросов и каждый нужно обрабатывать по-своему? Вопрос в том, чтобы создать какое-то универсальное средство. Которое можно было бы вызывать примерно так:
var xml = ajax ( params , serverAddress ); //получаем результат через return
или
ajax ( params , serverAddress );
var xml = respXml; //получаем результат через глобальную перемнную
//обработка xml
Но вернуть respXml не знаю как (( Создаю вначале скрипта глобальную переменную var respXml; но она почему-то внутри handleRequestStateChange() не изменяется ((
Ответить с цитированием
  #4 (permalink)  
Старый 05.01.2009, 21:34
Отправить личное сообщение для Octane Посмотреть профиль Найти все сообщения от Octane  
Регистрация: 10.07.2008
Сообщений: 3,873

Таких универсальных решений полно, для примера можно взять любой фреймворк, например вот http://js-core.googlecode.com/files/...-ajax-0.2.5.js AJAX-модуль моего фреймворка, там самый минимум, поэтому в качестве примера сгодится Входящие параметры success и error как раз и есть те самые callback-функции, которые запускаются после успешного выполнения запроса или в результате ошибки, и в них передается ответ от сервера.

Последний раз редактировалось Octane, 05.01.2009 в 21:39.
Ответить с цитированием
  #5 (permalink)  
Старый 08.01.2009, 17:26
Новичок на форуме
Отправить личное сообщение для V0van Посмотреть профиль Найти все сообщения от V0van
 
Регистрация: 05.01.2009
Сообщений: 3

Я в сети. Спасибо большое за код. До такого кода мне еще расти и расти.. но нужное почерпнул - все что мне было нужно - это функция eval()
Пусть универсальных решений в сети и полно - написал свое собственное. Конечно, далеко не идеальное - зато работает на ура!
Теперь для работи с аяксом нужно написать всего одну! строчку кода:
ajax("serverAdr", "params", "type", "function", "destID", "loadingID", "loadingHtlml")
Тоесть адрес сервера, параметри, возвращаемый тип (xml или text), функция обработки результата, ID елемента куда запишем результат (тоесть если указана ф-ция - результат обрабатывает она, если указан destID - то результат записывается в этот елемент). Ну и последних 2 параметра - это ID елемента и текст статуса загрузки - ну гифка там какая-нибудь.
Сделана постановка в очередь - если запросов много.. Проверил роботоспособность - в цикле:
while (i=0;i<50;i++){
ajax ("script1.php","param="+i,"text","","testID",", "")
ajax ("script2.php","param="+i,"text","","testID",", "")
ajax ("script3.php","param="+i,"text","","testID",", "")
ajax ("script4.php","param="+i,"text","","testID",", "")
ajax ("script5.php","param="+i,"text","","testID",", "")
}
И через пару секунд получил 250 ответов от сервера.. все четко)))
Теперь аякс можно везьде где только можно пихать! ))
Даю код - может кому пригодится.. Если найдете неточности, ошибки или знаете как усовершенствовать - пишите.
var xmlHttp = createXmlHttpRequestObject();

var intervalID = 0;

var showErrors = true;


var dId    = ''; // destinationID 
var cbF    = ''; // callbackFunction 
var type   = ''; // type ('text' OR 'xml')

var updateInterval = 100; // how many miliseconds to wait to send new request

var timerId = 0;

/* initialize the ajax cache */

var cache = new Array();



function createXmlHttpRequestObject(){


  var xmlHttp;


  try{

    xmlHttp = new XMLHttpRequest();

  }catch(e){

    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{ 

        xmlHttp = new ActiveXObject(XmlHttpVersions[i]);

      } 

      catch (e) {} // ignore potential error
    }

  }

  if (!xmlHttp)

    displayError("Error creating the XMLHttpRequest object.");

  else 

    return xmlHttp;

}


function displayError($message){

  if (showErrors){

    alert("Error encountered: \n" + $message);
  }

}


function doAjax (){

  if (cache.length == 0 ){
  		timerId = 0; 
  		return;	 
  } 
  	 
  if (xmlHttp){   
    try{      
      if ((xmlHttp.readyState == 4 || xmlHttp.readyState == 0)){
		  		  		   
		  var ajax_params = cache.shift(); 

 		  if ( ajax_params.lHtml && ajax_params.lId ){
 		  		document.getElementById( ajax_params.lId ).innerHTML = ajax_params.lHtml; 
 		  }


		  dId    = ajax_params.dId;
		  cbF    = ajax_params.cbF;
		  type   = ajax_params.type;  			  	
 
        xmlHttp.open("POST", ajax_params.server , true);

        xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");


        xmlHttp.onreadystatechange = handleRequestStateChange;

        xmlHttp.send ( ajax_params.params); 
      }else{
      	timerId = setTimeout("doAjax();", updateInterval);
      }      	 
    }catch (e){

      displayError("search error: "+e.toString());

    }

  }

}


function handleRequestStateChange(){  	
  if (xmlHttp.readyState == 4){
    if (xmlHttp.status == 200){

      try{

        readResponse();      
      }

      catch(e){

        displayError("handleRequestStateChange1 error: "+e.toString());

      }

    }else{

      displayError("handleRequestStateChange2 error: "+xmlHttp.statusText);

    }

  }
}


function readResponse(){


  var response = xmlHttp.responseText;
 
  if (response.indexOf("ERRNO") >= 0 

      || response.indexOf("error:") >= 0

      || response.length == 0)

    throw(response.length == 0 ? "Server error." : response);


   try{

		var responseXml = xmlHttp.responseXml;  
   }catch(e){

		var responseXml = '';  
   }

 
 	if ( type == 'xml'){
		var resp = responseXml; 	
	}else{
		var resp = response;
	}

 	if ( cbF ){
		eval( cbF +'(resp)'); 	
 	}else if ( dId ){ 	
 		document.getElementById( dId ).innerHTML = resp;	
 	} 	
 	
 	timerId = setTimeout("doAjax();", updateInterval); 
}


function ajax (serverVal , paramsVal , typeVal , cbFVal , dIdVal ,
				    lIdVal , lHtmlVal ){
	
	var ajax_params = {server: serverVal,
	                   params: paramsVal,							 
							 type: typeVal,
							 cbF: cbFVal, 
							 dId: dIdVal,
							 lId: lIdVal,
							 lHtml: lHtmlVal
							 };
	cache.push( ajax_params );

	if ( !timerId ){						 
		doAjax();
	}	 
}
Ответить с цитированием
  #6 (permalink)  
Старый 08.01.2009, 18:05
Отправить личное сообщение для Octane Посмотреть профиль Найти все сообщения от Octane  
Регистрация: 10.07.2008
Сообщений: 3,873

Зачем такие заморочки с получением XHR-объекта для IE, сейчас достаточно просто получить new ActiveXObject('Microsoft.XMLHTTP'), в IE5.5 и IE6 будет работать. В IE7 по умолчанию включена поддержка native-объекта XMLHttpRequest.
Ответить с цитированием
  #7 (permalink)  
Старый 08.01.2009, 18:19
Новичок на форуме
Отправить личное сообщение для V0van Посмотреть профиль Найти все сообщения от V0van
 
Регистрация: 05.01.2009
Сообщений: 3

Не знал. Спасибо - исправлю.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как разделять страницы при выводе отчета ilshat Events/DOM/Window 7 10.12.2009 10:24
Переменная от переменной или как к имени переменной конкатенировать значение другой Aderba jQuery 5 12.11.2008 15:25
форма как в ExtJS 2 magistr_bender Общие вопросы Javascript 0 11.09.2008 16:01
Раскрывающееся меню, как переставить на другую сторону? Resager Events/DOM/Window 8 22.08.2008 21:56
Как распознать текст? monach79 Общие вопросы Javascript 12 21.07.2008 13:22