Ajax Script macht nur responseText

Da_Chris

Erfahrenes Mitglied
Wie der Titel schon besagt bekomme ich nur responseText aber nicht responseXML zurück.
Vielleicht habe ich was übersehen wäre jedenfalls für schnelle Hilfe echt dankbar.

ajax.js
Code:
var ajax_id = 0;

AJAX=function(args)
{
	var ajax = args;
	
	//set ajax id
	ajax.id = ajax_id++;
	ajax.log = '';
	
	ajax.request = function() 
	{
		var now = new Date();
		try{
			
			//creating XMLHttpRequest-Object
			this.xhr = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHTTP"); 
			
			//set transfermode
			this.method=(typeof this.method == 'undefined') ? 'GET' : this.method;
			this.log += 'ajax.method:\t\t\t\t'+this.method+'\n';
			
			//preparing data		
			this.data=(this.data || '');
			this.log += 'ajax.data:\t\t\t\t'+this.data+'\n';
			
			//preparing postData	
			this.postData=(this.method=='GET') ? null : this.data;
			this.log += 'ajax.postData:\t\t\t'+this.postData+'\n';
			
			//preparing URL			                   
			this.URL=(this.method=='POST' || this.data=='') ? this.URL : ( (this.URL.indexOf('?')==-1) ? this.URL+'?'+this.data : this.URL+'&'+this.data );
			this.log += 'ajax.URL:\t\t\t\t\t'+this.URL+'\n';
			
			//creating timestamp
			this.timestamp = now.getTime();
			this.log += 'ajax.timestamp:\t\t\t'+this.timestamp+'\n';
			
			//initializing request
			this.xhr.open(this.method,this.URL,true);
			
			//set post header   
			if(this.method=='POST')
			{
				this.xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
				this.xhr.setRequestHeader("Content-length", this.postData.length);
				this.xhr.setRequestHeader("Connection", "close");
			}
			
			//disabling cache if nocache is set
			if(!typeof this.nocache || this.nocache)
			{
				this.xhr.setRequestHeader("If-Modified-Since", "Thu, 01 Jan 1970 00:00:00 GMT");
			}
			
			//targeting callback function
			if(typeof this.callback == 'function')
			{
				this.xhr.onreadystatechange = 
				function()
				{ 
					var readyState=ajax.xhr.readyState;
					var status=(readyState==4)?ajax.xhr.status:null
					ajax.log += 'ajax.xhr.readyState:\t\t'+readyState+'\n';
					ajax.log += 'ajax.xhr.status:\t\t\t'+status+'\n';
					ajax.log += 'ajax.xhr.statusText:\t\t'+ajax.xhr.statusText+'\n';
					ajax.log += 'ajax.xhr.responseText:\t\t'+ajax.xhr.responseText+'\n';
					ajax.log += 'ajax.xhr.responseXML:\t\t'+ajax.xhr.responseXML+'\n';
					if(readyState==4 && status==200)
					{
						ajax.callback(ajax,readyState,status);
					}
				};
			}
			else if(typeof this.destination == 'object')
			{
				this.xhr.onreadystatechange = 
				function()
				{ 
					var readyState=ajax.xhr.readyState;
					var status=(readyState==4)?ajax.xhr.status:null
					ajax.log += 'ajax.xhr.readyState:\t\t'+readyState+'\n';
					ajax.log += 'ajax.xhr.status:\t\t\t'+status+'\n';
					ajax.log += 'ajax.xhr.statusText:\t\t'+ajax.xhr.statusText+'\n';
					ajax.log += 'ajax.xhr.responseText:\t\t'+ajax.xhr.responseText+'\n';
					ajax.log += 'ajax.xhr.responseXML:\t\t'+ajax.xhr.responseXML+'\n';
					if(readyState==4 && status==200)
					{
						ajax.destination.innerHTML = ajax.xhr.responseText;
					}
				};
			}
			  
			//send request  
//			this.log += 'xhr.getAllResponseHeaders:\t\t'+xhr.getAllResponseHeaders()+'\n';  
			this.xhr.send(this.postData);  
			this.log += 'xhr.send()\n';
		}
		//errorhandling
		catch(e)
		{
			try{
				this.log += 'ERROR:AJAX.request()\n';
				alert(this.log);
			}
			catch(e){}
		}    
	}
	
	//return ajax object
	return ajax;
}

Anwendung:
Code:
function sendRequest(args){
	//var args = {'method':'POST','data':'','URL':'ajax.php','nocache':true,'destination':document.getElementById('x')};
	AJAX(args).request();
}
function ajax_catch(ajax,readyState,status)
{
	//readyState = ajax status
	//status = http status	
	if(readyState==4 && status==200)
	{
		insert_person(ajax.xhr.responseText);
	}
}

var pCount = 0;

function person_remove(id)
{
	var child = document.getElementById(id);
	document.getElementById("persons").removeChild(child);
}

function insert_person(responseText) 
{	
	pCount++;
	var newChild = document.createElement("div");
	var attrId = document.createAttribute("id");
	attrId.nodeValue = "p"+pCount;
	var attrClass = document.createAttribute("class");
	attrClass.nodeValue = "person";
	newChild.setAttributeNode(attrId);
	newChild.setAttributeNode(attrClass);
	newChild.innerHTML = responseText;	
	document.getElementById('persons').appendChild(newChild);
}

function person_add(type)
{
	var args = {'method':'POST','data':'action=addPerson&type='+type,'URL':'ajax.php','nocache':true,'callback':ajax_catch};
	sendRequest(args);
}
 
Moin Chris,

wenn ein Request kein responseXML liefert, dann ist dies ein Anzeichen dafür, dass die Antwort kein gültiges XML ist.
Die Fehlerursache müsstest du daher in der Antwort suchen, und nicht im Skript.
 
oh mh ich habs so versucht:
Code:
	function ajax($action) 
	{
		header("Content-type: text/xml");
		echo "<?xml version=\"1.0\" ?>\n";
		echo "<root>\n";
		echo "	<data>\n";
		switch($action)
		{
			case "addPerson":
				echo "		<innerHTML>\n";
				include TEMPLATE_PATH."step1_person.tpl";			
				echo "		<innerHTML>\n";
			break;
		}
		
		echo "	</data>\n";
		echo "</root>";
	}
aber vermutlich ist das so nicht richtig?

EDIT: irgendwie will der code highlighter hier nicht ganz....
bug?
PHP:
echo "<?xml version=\"1.0\" ?>\n";
kopie von oben -.-
 
Zuletzt bearbeitet:
Auf den 1. Blick würde ich sagen, dass das 2.
Code:
echo "        <innerHTML>\n";
den Fehler produziert, das sollte besser so aussehen:
Code:
echo "        </innerHTML>\n";

Ob es das dann schon war, kann ich nicht sagen, ohne den Inhalt von step1_person.tpl zu Kennen.

Falls es weiterhin nicht geht, poste besser die Ausgabe des PHP-Skriptes.
 
EDIT: irgendwie will der code highlighter hier nicht ganz....
bug?
PHP:
echo "<?xml version=\"1.0\" ?>\n";
kopie von oben -.-

Jo, scheint wohl nen Wurm drinnen zu sein :)

Verwende stattdessen den alternativen Highlighter :

[code=php]echo "<?xml version= \"1.0\" ?>\n";[/code]

....Ergebnis:
PHP:
echo "<?xml version= \"1.0\" ?>\n";
 
step1_person.tpl
HTML:
				<input type="hidden" name="person[][type]" value="1" />
				<div class="person_attribute">Kind</div>
				<div class="person_attribute"><input type="checkbox" name="person[][opt1]" value="true" /> mit Essen</div>
				<div class="person_attribute">Kosten:&nbsp;&nbsp; xx &euro;</div>
				<div class="person_attribute"><a class="person_delete" href="javascript:void(0);" onclick="person_remove(this.parentElement.parentElement.id)">-</a></div>

die frage da auch muss ich html speziell in xml verkapseln?
Habe das mit CDATA versucht nur ob das richtig so ist bin ich mir nicht sicher.
Das XML Fragment finde ich auch nicht so wirklich "wohlgeformt"...

EDIT:
Ah das mit der Highlighter Variante kannte ich noch nicht...
Die sollte mal im editor verlinkt werden ;)

Meine XML Ausgabe sieht so aus:
Code:
<root> 
	<data> 
		<innerHTML> 
				<input type="hidden" name="person[][type]" value="1" /> 
				<div class="person_attribute">Kind</div> 
				<div class="person_attribute"><input type="checkbox" name="person[][opt1]" value="true" /> mit Essen</div> 
				<div class="person_attribute">Kosten:&nbsp;&nbsp; xx &euro;</div> 
				<div class="person_attribute"><a class="person_delete" href="javascript:void(0);" onclick="person_remove(this.parentElement.parentElement.id)">-</a></div> 
		</innerHTML> 
	</data> 
</root>
Dabei bekomme ich folgenden Fehler:
This page contains the following errors:
error on line 9 at column 11: Extra content at the end of the document
Below is a rendering of the page up to the first error.
Ich muss also doch irgendwie den html-quelltext in der xml ordentlich einbetten.

Ausgabe:
Code:
Kind mit EssenKosten:   xx €     -     ]]>
 
Zuletzt bearbeitet:
Schreibe diese Zeile:
Code:
<div class="person_attribute">Kosten:&nbsp;&nbsp; xx &euro;</div>

mal so:
Code:
<div class="person_attribute">Kosten:   xx €</div>

Warum: &nbsp; und &euro; sind benannte Entitäten.
Diese fliegen aber nicht irgendwo herum, sondern werden in der DTD deklariert.

In einem HTML-Dokument kann man sie verwenden, weil sie dort in der DTD referenziert sind.

Dein XML hat aber keine DTD, somit sind dort diese benannten Zeichen unbekannt.
Die Unicode-Schreibweise kennt XML aber auf jeden Fall.

Du kannst dieses PHP-Skript, welches das XML zurückgeben soll, übrigens auch direkt in einigen Browsern öffnen.

Im FF wirst du dann bspw. folgendes sehen:
XML-Verarbeitungsfehler: Nicht definierte Entität......
 
Eine andere Möglichkeit den Quelltext zu kapseln geht nicht?
Würde das nur ungern auf die Art machen da die templates geändert werden können...
 
Eine andere Möglichkeit den Quelltext zu kapseln geht nicht?

Doch geht, verwende eine CDATA-Sektion, da ist es egal, was drinnen steht, weil es nicht geparst wird... es sind dann schlicht Zeichendaten.

Für deinen Fall ist das sicher das beste, denn momentan wird ja das was in <innerhtml/> steht zum Bestandteil der Knotenstruktur.
Ohne CDATA sind die Ergebnisse unabsehbar, wenn da Fremde ohne XML-Kenntnisse HTML-Code eingeben.
 
ja hab ich jetzt gemacht jetzt bekomme ich auch eine ausgabe... aber zuviel... das schliessende tag der CDATA wird mit ausgegeben...
xml:
Code:
<?xml version="1.0" ?>
<root>
	<data>
		<innerHTML>
<![CDATA[				<input type="hidden" name="person[][type]" value="1" />
				<div class="person_attribute">Kind</div>
				<div class="person_attribute"><input type="checkbox" name="person[][opt1]" value="true" /> mit Essen</div>
				<div class="person_attribute">Kosten:&nbsp;&nbsp; xx &euro;</div>
				<div class="person_attribute"><a class="person_delete" href="javascript:void(0);" onclick="person_remove(this.parentElement.parentElement.id)">-</a></div>
]]>
		</innerHTML>
	</data>
</root>

EDIT:
mh hatte noch auf text gestellt gehabt
aber jetzt ist innerHTML plötzlich wieder leer

mein javascript sieht so aus:
Javascript:
function sendRequest(args){
	//var args = {'method':'POST','data':'','URL':'ajax.php','nocache':true,'destination':document.getElementById('x')};
	AJAX(args).request();
}
function ajax_catch(ajax,readyState,status)
{
	//readyState = ajax status
	//status = http status	
	if(readyState==4 && status==200)
	{
		
		//alert(ajax.xhr.responseText);
		//alert(ajax.xhr.responseXML);
		
		insert_person(ajax.xhr.responseXML);
	}
}

var pCount = 0;

function person_remove(id)
{
	var child = document.getElementById(id);
	document.getElementById("persons").removeChild(child);
}

function insert_person(responseXML) 
{	
	
	var innerHTML = responseXML.getElementsByTagName("innerHTML")[0];
	alert(innerHTML.firstChild.nodeValue);
	
	pCount++;
	var newChild = document.createElement("div");
	var attrId = document.createAttribute("id");
	attrId.nodeValue = "p"+pCount;
	var attrClass = document.createAttribute("class");
	attrClass.nodeValue = "person";
	newChild.setAttributeNode(attrId);
	newChild.setAttributeNode(attrClass);
	newChild.innerHTML = innerHTML.firstChild.nodeValue;	
	document.getElementById('persons').appendChild(newChild);
}

function person_add(type)
{
	var args = {'method':'POST','data':'action=addPerson&type='+type,'URL':'ajax.php','nocache':true,'callback':ajax_catch};
	sendRequest(args);
}
 
Zuletzt bearbeitet:
Zurück