AJAX - скрипт, връщащ масив - 2 ЧАСТ

sizif

Registered
Здравейте!

Позволявам си да пусна нова тема като продължение на тази:
http://web-tourist.net/forum/viewtopic.php?t=56483

Ползвам тази AJAX-системка:
http://www.captain.at/howto-ajax-form-post-request.php

...предложена от FestarBG. И се опитвам да приложа идеята на StormBreaker с XML, от който Js-та да извлече масив.

_______________________________
___________________

Ето какво съм направил дотук:

AJAX-a, който съм опростил за тестовете - post.js :

Код:
var http_request = false;

   function makePOSTRequest(url, parameters)
{
      http_request = false;
      if (window.XMLHttpRequest) { // Mozilla, Safari,...
         http_request = new XMLHttpRequest();
         if (http_request.overrideMimeType) {
         	// set type accordingly to anticipated content type
            //http_request.overrideMimeType('text/xml');
            http_request.overrideMimeType('text/html');
         }
      } else if (window.ActiveXObject) { // IE
         try {
            http_request = new ActiveXObject("Msxml2.XMLHTTP");
         } catch (e) {
            try {
               http_request = new ActiveXObject("Microsoft.XMLHTTP");
            } catch (e) {}
         }
      }
      if (!http_request) {
         alert('Cannot create XMLHTTP instance');
         return false;
      }
      
      http_request.onreadystatechange = alertContents;
      http_request.open('POST', url, true);
      http_request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
      http_request.setRequestHeader("Content-length", parameters.length);
      http_request.setRequestHeader("Connection", "close");
      http_request.send(parameters);
   }




   function alertContents() {
      if (http_request.readyState == 4) {
         if (http_request.status == 200) {
            //alert(http_request.responseText);
     //result = http_request.responseText;

result=http_request.responseText.getElementsByTagName("res");



for(i=0; i < 6; i++)
{
document.getElementById('myspan_'+i).innerHTML = result[i];


            //document.getElementById('myspan').innerHTML = result;            
         } else {
            alert('There was a problem with the request.');
         }
      }
   }


function get() {
      var poststr = "";
      makePOSTRequest('post.php', poststr);
   }


Post.php :
Код:
<?
$niz= <<< GAN

<?xml version="1.0" encoding="windows-1251"?> 
<results> 
<res>red 1</res> 
<res>red 2</res> 
<res>red 3</res> 
<res>red 4</res>
<res>red 5</res> 
</results>

GAN;

header('Content-Type: text/xml');
echo $niz;
?>
И файлът, в който се зарежда всичко това и трябва да се принтира резултата:

Код:
<script src="post.js"></script>

<input type="button"  value="Submit" onclick="javascript:get();">

<br><br>
Server-Response:<br>
<hr>
<span name="myspan" id="myspan_0"></span>
<BR><span name="myspan" id="myspan_1"></span>
<BR><span name="myspan" id="myspan_2"></span>
<BR><span name="myspan" id="myspan_3"></span>
<BR><span name="myspan" id="myspan_4"></span>
<BR><span name="myspan" id="myspan_5"></span>
<hr>
Дава ми грешка - несъществуващ обект, т.е. не се създава масив.

Виждате ли причина за грешка или с XML-а няма да стане?
 
Не може да не стане с XML-a. Някъде в javascript-а се бъркаме.

ПП. Я виж това го промени на responseXML

result=http_request.responseXML.getElementsByTagName("res");

ПП2. Я пробвай да изведеш нещо така
alert(http_request.responseXML.getElementsByTagName("res")[0].firstChild.nodeValue);
Това би трябвало да изведе първия елемент.
 
Значи виж предлагам ти 1 вариант да не се мъчиш много ,че доколкото видях имаше някой объркани работи:

http://baf.zapto.org/sizif/sizif.txt

За да видиш как бачка отвори индекса ;)
Успех.
п.п. пробвах го и под ИЕ ,но 6 така ,че не гарантирам дали ше бачка навсякъде.

Може и да има някой друг бъг ама поне ще видиш как става :)
 
bafitu каза:
Значи виж предлагам ти 1 вариант да не се мъчиш много ,че доколкото видях имаше някой объркани работи:

http://baf.zapto.org/sizif/sizif.txt

За да видиш как бачка отвори индекса ;)
Успех.
п.п. пробвах го и под ИЕ ,но 6 така ,че не гарантирам дали ше бачка навсякъде.

Може и да има някой друг бъг ама поне ще видиш как става :)

http://web-tourist.net/forum/viewtopic.php?t=56483 чети
 
е добре с xml ..
http://baf.zapto.org/sizif2/sizif.txt

демото на индекса
..
Използвах един друг ajax малко променен е от този горе ама поне си го знам ,че този си е наред щото съм го ползвал и преди ;)
само ,че съм го подкарал с get ,че с пост нещо се опъваше ,но нямам време да го гледам що не става и с пост сега..ако не ти трябва да предаваш някакви огромни данни предавай си ги с гет поне няма да имаш проблеми..
иначе верно може да ползва вариант с serialize ,но не ти гарантирам успех ;)

аа и още нещо :
много е важно в генерираният xml отначало да няма никакъв символ/спейс както си го написал иначе ще имаш проблеми и ще се чудиш 2 часа ;)
 
bafitu,
благодаря много + 1т!

Ползвах същия AJAX, така че само ще си допълня в кода функциите, които си добавил! :)

StormBreaker,
благодаря за идеята и за това че проследи двете теми!

cnoko,
това вече е висш пилотаж, а моето ниво в Js е много, много ниско :(
 
bafitu,

а как ще стане стойността да се подава към хидън полета:

<INPUT TYPE="HIDDEN" ID="" VALUE="">


Код:
function addElement(i,v)
{
  var ni = document.getElementById('myspan');
  var newdiv = document.createElement('span');
  var divIdName = 'myspan_'+i;
  newdiv.setAttribute('id',divIdName);
  newdiv.innerHTML = v+"<BR>";
  ni.appendChild(newdiv);
}

Твоя начин е по-добър от първоначалната идея да създавам готови полета в хтмл-а :)
 
ами на createelement пишеш input
останалото се прави с
newdiv.setAttribute('id',divIdName);
newdiv.setAttribute('type','hidden');
newdiv.setAttribute('value',var-a);
innerHTML нямаш в случая

може да си алертнеш после с document.getelementbyid dividname.value
за да видиш ,че стойноста се е записала

не знам дали точно това имаше впредвид ама в момента за това се сещам ;)
 
Благодаря!

не знаех как да му задам хидън :)
а сега като гледам и стойността щеше да ми е проблем :))
 

Back
Горе