webForumDet fria alternativet

[object Error] i IE - fx tolkar rätt

11 svar · 1 688 visningar · startad av wally_91

wally_91Medlem sedan feb. 2006511 inlägg
#1

Hej alla!

Jag har ett problem med IE. I forum.js har jag en koll som kollar om det sista inlägget (last_post) matchar det senaste inlägget i databasen (lastpost). Om lastpost är större än last_post betyder det att det finns nya inlägg och handleServerResponse() kallas. Detta är markerat i fet.

I fx funkar detta perfekt (ej kollat opera) men i IE så får jag bara felet

Error reading the response: [object Error]

Jag vet att fx och IE tolkar XML-svar olika men hur ska jag lösa detta?
Länk för dem som vill titta hur det ser ut:
https://www.guida.nu/nytt/visa_alla/ och klicka på test-thread.

forum.js

/* Adressen till XML-dokumentet där vi hämtar inläggen */
//var adress = "http://www.guida.nu/nytt/visa_alla/ajax.php?threadID=";
//var bild_url = "http://www.guida.nu/nytt/visa_alla/";
var bild_url = "";
var adress = "ajax.php?threadID=";

var xmlResponse2, xmlRoot2;
var lastpost;
var notify = document.getElementById("notify");
/* the XMLHTTP object för att samarbeta med servern */
var xmlHttp = createXmlHttpRequestObject();

function createXmlHttpRequestObject()
{
//Håller XMLHTTPRequest object
var xmlHttp;
try
{
xmlHttp = new XMLHttpRequest();
}
catch(e)
{
//anta IE6 eller äldre
var XmlHttpVersions = new Array("MSXML2.XMLHTTP.6.0", "MSXML2.XMLHTTP.5.0", "MSXML2.XMLHTTP.4.0", "MSXML2.XMLHTTP.3.0", "MSXML2.XMLHTTP", "Microsoft.XMLHTTP");

//prova varje XmlHttp version tills en funkar
for (var i = 0; i<XmlHttpVersions.length && !xmlHttp; i++)
{
try
{
//Försök skapa en XMLHttpRequest object
xmlHttp = new ActiveXObject(XmlHttpVersions[i]);
}
catch (e){}
}
}
//returnera det skapade objektet eller visa felmeddelande
if(!xmlHttp)
alert("Error creating the XMLHttpRequest object");
else
return xmlHttp;
}

function getnewposts(threadID){

if(xmlHttp)
{
try
{
 xmlHttp.open("GET", adress + encodeURIComponent(threadID) + "&newpost=" + encodeURIComponent(last_post));
xmlHttp.onreadystatechange = handleRequestStatusChange;  //Hantera svar
xmlHttp.send(null); //skicka inget
}
catch(e){}
}
}

function handleRequestStatusChange(){
 var target = document.getElementById("ajax_forum_start");
// var loader = document.getElementById("ajax_loader");
 var notify = document.getElementById("notify");
if(xmlHttp.readyState == 4)
{
notify.innerHTML = '';
//loader.innerHTML = '';
if(xmlHttp.status == 200 )
{
[B]xmlResponse2 = xmlHttp.responseXML;
xmlRoot2 = xmlResponse2.documentElement;
//rada upp... allt

//forumsdata
lastpostArray = xmlRoot2.getElementsByTagName("lastpost");
lastpost = lastpostArray.item(0).firstChild.data;
	if(lastpost > last_post){
		try
		{
		handleServerResponse();
		}
		catch(e)
		{
		alert("Error reading the response: " + e.toString());
		}[/B]
	}else if(lastpost == last_post){
        notify.innerHTML = "Inga nya inlägg!";
        
		}
}
	else
	alert("Error fetching the data:\n" + xmlHttp.statusText + "\n" + xmlHttp.status);
}
/*else if(xmlHttp.readyState == 1 || xmlHttp.readyState == 2 || xmlHttp.readyState == 3)
{
	loader.innerHTML = "<img src=\"" + bild_url + "images/load2.gif\" alt=\"Laddar\" style=\"border:none;\">";
}
*/

}

function handleServerResponse(){
/* [...] */

//Gör så att det senaste inlägget är last_post
last_post = lastpost;
}

Index.php

<script type="text/javascript" language="JavaScript">last_post = 5; //skrivs ut m.h.a. .$last_posts['postid']. (PHP)</script>
wally_91Medlem sedan feb. 2006511 inlägg
#2

*bump*

wally_91Medlem sedan feb. 2006511 inlägg
#3

*bump*

Peter SMedlem sedan dec. 20025 483 inlägg
#4

Vad får du med

catch(e){ alert(e.name + " / " + e.message); }

?

wally_91Medlem sedan feb. 2006511 inlägg
#5

Hmm. Var ska jag lägga till det?

Peter SMedlem sedan dec. 20025 483 inlägg
#6

I stället för ditt nuvarande catchuttryck i det fetstilta. :)

wally_91Medlem sedan feb. 2006511 inlägg
#7

Då får jag

TypeError / Object krävs

Peter SMedlem sedan dec. 20025 483 inlägg
#8

Lägg in alert()s på

var xmlResponse = xmlHttp.responseXML;
var xmlRoot = xmlResponse.documentElement;

...och se om de innehåller det du vill.

wally_91Medlem sedan feb. 2006511 inlägg
#9

Nu får jag

[object]

[object]

coderMedlem sedan mars 200741 inlägg
#10

Vilken webbsida och vad ska jag göra för att få fram det fel du får?

Rent allmänt är den här typen av konstruktioner ganska farliga

lastpostArray = xmlRoot2.getElementsByTagName("lastpost");
lastpost = lastpostArray.item(0).firstChild.data;
	if(lastpost > last_post)

...

Jag skulle gå fram lite mer försiktigt med if-satser och felmeddelanden åtminståne i en debugversion och kontrollera att objekten finns överhuvudtaget innan jag börjar kräva data från objektet.

wally_91Medlem sedan feb. 2006511 inlägg
#11

Länk: https://www.guida.nu/nytt/visa_alla/ och tryck på "test thread".

För mig så har det inte funkat med någon version av IE.

Nu funkar dessutom inte en väldigt enkel AJAX funktion som funkar i fx.

function addpost(postid){
if(!xmlHttp)
alert("No XMLHttpRequest object created! Please update to a more modern browser like firefox.\n You can get it at www.getfirefox.com");
else{
	xmlHttp.open("GET", "makepost.php?threadID=" + encodeURIComponent(postid));
	xmlHttp.onreadystatechange = handlemakenewpost;
	xmlHttp.send(null);
	}
}

function handlemakenewpost(){
	if(xmlHttp.readyState == 4){
		if(xmlHttp.status == 200){
		    if(xmlHttp.responseText == "Ok")
			alert("Ditt inlägg skapades!\nProva nu att hämta nya inlägg. Det gör du längst ner!");
		    else
		    alert("Fel");
		}else
		alert("Something got wrong!\n" + xmlHttp.statusText);
	}
}

coder skrev:

Rent allmänt är den här typen av konstruktioner ganska farliga

Varför då och hur ska jag göra det säkrare? Några typeof-kollar?

coderMedlem sedan mars 200741 inlägg
#12

wally_91 skrev:

Länk: https://www.guida.nu/nytt/visa_alla/ och tryck på "test thread".
För mig så har det inte funkat med någon version av IE.

Det fel jag får där är "Rad 40, tecken 2, identifierare, sträng eller tal förväntas".

wally_91 skrev:

Varför då och hur ska jag göra det säkrare? Några typeof-kollar?

Därför att man lätt råkar ut för det du råkat ut för. :)

if (xmlRoot2)
{
  lastpostArray = xmlRoot2.getElementsByTagName("lastpost");
  if (lastpostArray)
  {
    lastpost = lastpostArray.item(0).firstChild.data;
  }
  else
  {
    alert("lastpostArray finns inte")
  }
}
else
{
  alert("xmlRoot2 finns inte")
}

Typ, sådär ungefär. Övertydligt. Återkoppling är A och O för att snabbt begripa vad som inte fungerar. Sen kan man ju alltid plocka bort detta senare.

Edit: Nu tror jag att felet ligger i funktionen handleServerResponse() så det är nog den du ska koncentrera dig på. Där någonstans använder du objekt som inte existerar.

134 ms totalt · 3 externa anrop · v20260731065814-full.fb544a5a
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
129 ms — hämta tråd, inlägg och bilagor (db)