Newsgroup: it.comp.lang.javascript
Titolo: Parsing con JavaScript di un XML creato dinamicamente con PHP

Salve ragazzi, sono inesperto sia di XML sia di JavaScript, l'unico
linguaggio che conosco bene e che mi trovo ad affrontare è il PHP.
Spero che mi possiate aiutare, il problema è questo:
Ho un form dove l'utente deve inserire una serie di valori e quando
viene inviato il java carica questa funzione:
function update()
{
	var frm 		= document.forms['worth_form'];
	var url 		= encodeURI(frm.url.value);
	var cat 		= frm.cat.options[frm.cat.selectedIndex].value;
	var numlinks 	=
frm.numlinks.options[frm.numlinks.selectedIndex].value;
	var sitewide 	= frm.sitewide[1].checked ? '1' : '0';
	if(url == '' || url == 'http://'){
		return false;
	}
	if(cat == ''){
		return false;
	}
	if(numlinks == ''){
		return false;
	}
	var query;
	query  = "calcola.php";
	query += "?url=" + url;
	query += "&cat=" + cat;
	query += "&num_links=" + numlinks;
	query += "&site_wide=" + sitewide;
	query += "&area=" + area;
	ajaxReqVar = new ActiveXObject("Microsoft.XMLHTTP");
	ajaxReqVar.open("GET", query, true);
	var doc = ajaxReqVar.responseXML.documentElement;
                if(doc.hasChildNodes()) {
    	var data = doc.childNodes[0];
		var result = data.firstChild.data;
		switch(result)
		{
			case '1':
				result = 'test';
				break;
			default:
				result = 'test valore default';
				break;
		}
               }
	return true;
}
Il file XML è creato tramite calcola.php, di cui riporto il sorgente
(ovviamente è solo un file di prova, dopo il valore del campo "amount"
verrà calcolato tramite un algoritmo:
<?php
header("Content-disposition: filename=index.xml");
header("Content-type: application/octetstream");
header("Pragma: no-cache");
header("Expires: 0");
echo'<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>';
echo"<response>
<amount>test</amount>
</response>";
?>
Grazie a chiunque abbia voglia e la cortesia di aiutarmi. ;)
Saluti.
Gotenks

 </response>";
Mi sa che dal server devi inviare un file XML: non deve essere allegato,
non deve essere di tipo application, per quanto ne so.
Prova con
header("Content-type: text/xml");
header("Pragma: no-cache");
header("Expires: 0");
e poi il resto (occhio anche al charset, eventualmente!). Facci sapere se
va :)
-- 
Nando [?]
Apostolo della Prova

Intanto Nando grazie anche solo per avermi risposto. Il problema
continua a persistere anche modificando il php che genera l'xml. Credo
che ci sia qualcosa che non và nella funzione javascript, gli hai dato
un'occhiata per caso?
L'errore javascript che mi riporta IE è questo: 'null' è nullo o non
è un oggetto.
Grazie di nuovo.
Gotenks
Nando ha scritto:


 Nando ha scritto:
[...]
Ciao :-)


 fatto tu:
Eheheh scusami ma non sono abituato a frequentare newsgroup! Come puoi
vedere però ho imparato subito come me lo hai detto! :D
Adesso con calma... Il problema è risolto al 100% su Internet Explorer
ma qualcosa non và su FireFox.. Ti faccio vedere le nuove funzioni che
ho implementato per il funzionamento dello script:
function newXmlHttpRequest()
{
  if (window.XMLHttpRequest)
   ajaxReqVar = new XMLHttpRequest();
  else if (window.ActiveXObject)
   ajaxReqVar = new ActiveXObject("Microsoft.XMLHTTP");
  else return null;
}
function sendRequest(url)
{
	ajaxReqVar.open("GET", url, false);
	if (window.XMLHttpRequest) {
		ajaxReqVar.send('');
	}else{
		ajaxReqVar.send();
	}
}
function updateWorth()
{
	var frm 		= document.forms['worth_form'];
	var url 		= encodeURI(frm.url.value);
	var cat 		= frm.cat.options[frm.cat.selectedIndex].value;
	var numlinks 	=
frm.numlinks.options[frm.numlinks.selectedIndex].value;
	var sitewide 	= frm.sitewide[1].checked ? '1' : '0';
	var area		= '';
	if(!selectedPageArea){
		updatePriceTag(generateAmountString('0'));
		return false;
	}else{
		area = selectedPageArea.className;
	}
	if(url == '' || url == 'http://'){
		updatePriceTag(generateAmountString('0'));
		return false;
	}
	if(cat == ''){
		updatePriceTag(generateAmountString('0'));
		return false;
	}
	if(numlinks == ''){
		updatePriceTag(generateAmountString('0'));
		return false;
	}
	var query;
	query  = "calcola.php";
	query += "?url=" + url;
	query += "&cat=" + cat;
	query += "&num_links=" + numlinks;
	query += "&site_wide=" + sitewide;
	query += "&area=" + area;
	newXmlHttpRequest();
	sendRequest(query);
	var doc = ajaxReqVar.responseXML.documentElement;
    if(doc.hasChildNodes()) {
    	var data = doc.childNodes[0];
		var result = data.firstChild.data;
		switch(result)
		{
			case 'invalid':
				result = generateAmountString('110');
				break;
			default:
				result = generateAmountString(result);
				break;
		}
		updatePriceTag(result);
    }
	return true;
}
E ti faccio vedere anche su cosa sto lavorando:
www.getpaidinfo.net/test.htm
. Prova a riempire tutti i campi e vedrai
che, almeno su IE, sulla destra ti mostra TEST una volta che hai
riempito tutti i campi.
Grazie mille per l'ennesima volta e prenditi tutto il tempo per
rispondermi, mi sei già stato utilissimo finora!

 rispondermi, mi sei già stato utilissimo finora!
Per l'ennesima volta, non c'è di che :)


> Per l'ennesima volta, non c'è di che :)
Continuo ad approfittare della tua gentilezza.. Non funzionava su IE
perchè stavo facendo prove eheh! Adesso è ok:
http://www.getpaidinfo.net/test.htm
Ho fatto tutto ciò che mi hai consigliato:
1) creare un oggetto al caricamento della pagina...
window.onload=function() { ajaxReqVar= new newXmlHttpRequest(); }
2) migliorata la funzione per creare l'oggetto:
function newXmlHttpRequest()
{
   var oReq = null;
   if (window.XMLHttpRequest)
    oReq = new XMLHttpRequest()
   else if (window.ActiveXObject)
    oReq = new ActiveXObject("Microsoft.XMLHTTP");
   return oReq;
}
3) modificata la funzione updatePrice() per lavorare con l'oggetto
istanziato:
	if (ajaxReqVar) sendReq(query)
    else {alert("Javascript Error!");return};
Ma lo script continua a funzionare su IE, ma non su FireFox! :( Non so
dove mettere mani, è uno dei miei primi lavori con JS.. :'(

 dove mettere mani, è uno dei miei primi lavori con JS.. :'(
Sì, ho visto :)
Mò butti un occhio più attento (non è ch'io sia una cima, eh!). Comunque,
come suggerimento anche per il futuro, aiutati con un po' di debug, magari
qualche alert qua e là... ad esempio, subito dopo il sendReq, prova a
mettere un alert(ajaxReqVar.responseText), tanto per vedere se lato
xmlhttprequest è tutto ok...


 dove mettere mani, č uno dei miei primi lavori con JS.. :'(
Ah, potrebbe essere questo: gli spazi e i caratteri di tabulazione
(compresi i caratteri di "a capo") vengono considerati nodi a tutti gli
effetti da FireFox, ma non da IE. Ad esempio, partendo da questo xml
<response>
<amount>test</amount>
</response>
per firefox i figli di response sono 3:
[0] nodo di testo
[1] elemento amount
[2] nodo di testo
e non uno, come per explorer. Quindi, la cosa piů semplice da fare č
"compattare" il tuo xml:
<response><amount>test</amount></response>
-- 



Grazie mille, non ti dovrò stressare più! ;D Adesso funziona alla
grande!
Ciao.
Gotenks

 Continuo ad approfittare della tua gentilezza..
Finché si può, una mano la si dà volentieri. Mi pare che adesso vada, no?
Anche perché devo andare :)


 ha scritto:

Bene, mi fa piacere. Leggiti un po' di cose in giro, ce n'è tante sia su
javascript in generale che su "ajax" in particolare. Buon lavoro :)
