mmofacts.com

Xmldok has no properties

gepostet vor 17 Jahre, 9 Monate von kevka
Halo ich versuche gerade meine erste Seite mit Ajax.
Alles funktioniert, nur wenn ich die Daten empfange bekomme ich von firebug die Meldung: xmldok has no properties
hier ist meine "handleResponse" Funktion:

function handleResponse()
{
xmldok = resObjekt.responseXML;
if(resObjekt.readyState == 4)
{
document.getElementById(xmldok.getElementById("id")+'_'+xmldok.getElementById("method")).innerHTML = xmldok.getElementById("text");
}
}
Wahrscheinlich liegt der Fehler daran, da ich die XML-Datei "redakteure.php" und nicht "redakteure.xml" genannt habe. Erst hatte ich als Dateiendung .XML, dann jedoch hat der Server mir den PHP-Code nicht mehr verarbeitet.
"redakteure.php":

echo"
";
echo $_GET["id"];
echo"
";
echo $_GET["method"];
echo"
";
include('../module/zugriff.inc.php');//Zugriff-Daten werden geladen
$sql1 = "SELECT * FROM redakteure WHERE id='" . $_GET["id"] ."'";
$result2 = mysql_query($sql1);
$row = @mysql_fetch_assoc($result2);
$text = nl2br($row["beschreibung"]);
if($_GET["length"] == "short")
{
//Text kuerzen
if (strlen($text) > 100)
{
$text = substr($text, 0, 100);
$text .= "...(mehr)";
}
// /Ende/ Text kuerzen
}
else
{
$text .= "...(weniger)";
}
echo $text;
echo"
";
?>
MfG Kevka
gepostet vor 17 Jahre, 9 Monate von Klaus
"resObjekt" muss doch ein Parameter der Funktion sein, wo soll es sonst herkommen?
gepostet vor 17 Jahre, 9 Monate von kevka
Hier noch die send funktion aus meiner JS-Datei:

function send(id,textlength,method)
{
resObjekt.open('get', '/php_scripts/redakteure.php?id='+id+'&length='+textlength+'&method='+method, true);
resObjekt.onreadystatechange = handleResponse;
resObjekt.send(null);
}
gepostet vor 17 Jahre, 9 Monate von Drezil
Original von kevka

function handleResponse()
{
xmldok = resObjekt.responseXML;
if(resObjekt.readyState == 4)
{
document.getElementById(xmldok.getElementById("id")+'_'+xmldok.getElementById("method")).innerHTML = xmldok.getElementById("text");
}
}

muss das nicht sowas wie:

xmldok = resObject.responseText;
heissen?
ansonsten:
- ist resObjekt noch (richtig?) definiert?
wenn du schon firebug hast, setz da doch nen breakpoint und debugge vernünftig .. dann siehst du auch, was wo drin steht ..
EDIT:
alternativ meine lösung:

/* // global xmlhttprequest object
var xmlHttp = new Array();
/**
* instantiates a new xmlhttprequest object
*
* @return xmlhttprequest object or false
*/
function getXMLRequester( )
{
var xmlHttp = false;

// try to create a new instance of the xmlhttprequest object
try
{
// Internet Explorer
if( window.ActiveXObject )
{
for( var i = 5; i; i-- )
{
try
{
// loading of a newer version of msxml dll (msxml3 - msxml5) failed
// use fallback solution
// old style msxml version independent, deprecated
if( i == 2 )
{
xmlHttp = new ActiveXObject( "Microsoft.XMLHTTP" );
}
// try to use the latest msxml dll
else
{

xmlHttp = new ActiveXObject( "Msxml2.XMLHTTP." + i + ".0" );
}
break;
}
catch( excNotLoadable )
{
xmlHttp = false;
}
}
}
// Mozilla, Opera und Safari
else if( window.XMLHttpRequest )
{
xmlHttp = new XMLHttpRequest();
}
}
// loading of xmlhttp object failed
catch( excNotLoadable )
{
xmlHttp = false;
}
return xmlHttp ;
}
function sendGetRequest(url, callbackFunction) {
sendGetRequest(url, callbackFunction, null);
}
function sendGetRequest(url, callbackFunction, param) {
intID = xmlHttp.length;
xmlHttp[intID] = getXMLRequester();
xmlHttp[intID].open('GET', url,true);
if (param != null)
xmlHttp[intID].onreadystatechange=new Function( "", callbackFunction+"(" + intID + param + ")" );
else
xmlHttp[intID].onreadystatechange=new Function( "", callbackFunction+"(" + intID + ")" );
xmlHttp[intID].send(null);
return true;
}
/* ]]> */
zum vewenden reicht dann ein:

sendGetRequest('ajax/naviFleetNearPlanet.php?pid='+data, 'showFleetsNearPlanet', ',0,"divMouseSubSubSubmenu"');
und eine beispielauswertung ist:

function showFleetsNearPlanet(id,route,domObjName) {
if (xmlHttp[id].readyState==4) {
debug('
processing request '+id);
str = xmlHttp[id].responseText;
jetzt = new Date();
[.............]
xmlHttp[id] = null;
jetzt2 = new Date();
debug('processing done. request '+id+' Duration: '+(jetzt2.getTime()-jetzt.getTime())+'ms');
so kann ich auch mehrere requests parallel starten.. gibt sicher elegantere lösungen, aber diese läuft (bei mir) im ff2.0 sowie im ie7 ohne probs ..
gepostet vor 17 Jahre, 9 Monate von exe
header("Content-Type: text/xml");
?>

vor dem senden der Antwort angeben. Viele Browser geben nur ein XML-Dokument zurück wenn das auch anhand des Content-Types erkennbar war.
gepostet vor 17 Jahre, 9 Monate von kevka
Nein, das muss xmldok = resObjekt.responseXML; heißen, da ich sonst nicht mir .getElementById darauf zugreifen kann.
Ich habe den großen Teil des Quellcodes aus meinem Ajaxbuch, und dort ist es genau so. Der Fehler muss wohl eher am per php erzeugten XML Dokument mit .php Endung liegen. Ich habe vorher schon gegoogelt und dort wurde oft was von Mime-Typen und Headern gesprochen, ich habe aber keine Ahnung wie ich das jetzt genau machen soll.
MfG Kevka
gepostet vor 17 Jahre, 9 Monate von knalli
Ne Drezil, das ist schon richtig. Ajax heißt eigentlich ja auch Transport von XML-Daten, deshalb ist responseXML als Zeichen für die Rückgabe eines XML-Strings (bzw. Objekts) schon richtig. responseText gibt tatsächlich nur einen Text zurück, das kann zum Beispiel sinnvoll sein, wenn man eben kein XML hat (zB reinen JS-Code).
Kaputtes XML mit responseXML zu verarbeiten dürfte auch nicht funktionieren - ob das einen Fehler wirft, weiß ich aber auch nicht.
@OP
Wenn du schon mit Firebug arbeitest (das ist löblich ), dann nutze doch auch die Möglichkeiten! Du kannst den Ajaxcall nachverfolgen. Schaue nach, was Firebug zu der gewählten Verbindung als Parameter und als Response angibt. Wenn dort nichts steht, dann ist scheinbar wirklich nichts angekommen.
Dann noch eins: State 4 war doch "alles okay", wieso fragst du vorher schon den response ab? Ist das nicht unlogisch?
Der Fehler selber müsste man eigentlich auch abfangen können.. nämlich eine Überprüfung, ob xmldok gesetzt ist.
Die Headerzeile würde ich um den Charset erweitern, weil sich vor allem mit XML-Daten dort Probleme häufen. Arbeitest du beispielsweise grundsätzlich mit UTF-8, dann setze das auch in PHP. Arbeitest du grundsätzlich mit dem ISO, dann schreibe es..

header('content-type: text/xml; charset=utf-8;');
--
edit: Der oben genannte Content-Type ist ein MIME-Type. Es zeigt an, WAS das Dokument für eins ist. Es soll Betriebssysteme geben, die anhand der MIME-Typs von Dateien schon wissen, womit man das Dokument öffnen muss, ohne Dateiendung
gepostet vor 17 Jahre, 9 Monate von Drezil
mach mal:

function handleResponse()
{
if(resObjekt.readyState == 4)
{
xmldok = resObjekt.responseXML;
document.getElementById(xmldok.getElementById("id")+'_'+xmldok.getElementById("method")).innerHTML = xmldok.getElementById("text");
}
}
sonst wird xmldok doch im verlaufe des requests bis zu 4x ge/ersetzt
ansonsten wie gesagt: wenn du schon sagst, dass du nen debugger hast, dann nutze ihn auch ..
gepostet vor 17 Jahre, 9 Monate von blum
Bei Problemen mit Ajaxrequests würde ich generell eine erstellen und da den responseText zur überprüfung reinschreiben.
Damit tust du Dich bei der Fehlersuche leichter.

Auf diese Diskussion antworten