Hej,
Resultatet av följande PHP-kod skriver jag ut i en alertruta:
if(sizeof($error) >= 1){
echo "Ett fel uppstod" . "\n";
for($i = 0; $i <= (sizeof($error) - 1); $i++){
echo " - " . $error[$i] . "\n";
}
}
Problemet är att i Internet Explorer 7 kommer allt på en lång rad. Det fungerar klockrent i Firefox och Opera, där blir det radbrytningar som det ska.
Har testat att byta " till ' samt att skriva ut \\n, men det blir ingen skillnad. Är det en bugg i IE7 och hur löser jag det?
spangoMedlem sedan juni 20008 205 inlägg Hur ser den genererade koden ut?
tydal skrev:
Prova \r\n
Nepp, blir samma resultat.
spango skrev:
Hur ser den genererade koden ut?
Ett fel uppstod - Ange ditt användarnamn - Ange ditt lösenord
\n strippas alltså bort helt. Konstigt nog så funkar det i Opera och Firefox, så det känns inte som att det har med escape att göra.
prova följande:
if(sizeof($error) >= 1){
echo "Ett fel uppstod" . "\\n";
for($i = 0; $i <= (sizeof($error) - 1); $i++){
echo " - " . $error[$i] . "\n";
}
}
Alltså dubbla \. Bara \n skrivs av PHP ut som en radbrytning. Det kanske FF tacksamt tuggar i sig medan IE spottar ut. \\ blir till ett \ så att vad webbläsaren ser är \n som i en js-sträng blir till en radbrytning.
Edit: Läste inte ordentligt.
nitro2k01 skrev:
Edit: Läste inte ordentligt.
Det sjuka är att när jag kör dubbla, så skrivs \n ut i boxen:
Ett fel uppstod\n - Ange ditt användarnamn - Ange ditt lösenord
Hur man än vänder och vrider på det bör det ju bli en radbrytning i det fallet.
Har testat nu att skriva ut samma data i en textarea, och där står exakt samma sak som i alertrutan.
Kan tillägga att det här är en response från Ajax, om det gör någon skillnad?
Har testat att sätta content-type i dokumentet, men det blir ingen skillnad.
Gissningsvis ligger problement i din ajax-kod. Dubbelt \ ska du bara ha om strängen ska evalueras som en sträng, typ:
alert("<?PHP echo "Meddelande\nBlablabla"; ?>");
Problemet är kanske att radbrytningen ignoreras i XML-koden. Byt ut \n mot <br /> och se om det funkar.
När jag byter ut \n mot <br /> så blir det:
Ett fel uppstod<BR>- Ange ditt användarnamn<BR>- Ange ditt lösenord<BR>
Är det inte konsigt att <br /> skrivs ut som <BR>?
Inte konstigt, men dumt. Det beror på IE's sätt att tolka HTML. Ett liknande problem diskuterades nyligen här. Det går ev att lösa genom att använda en annan doctype eller annan mime-typ för dokumentet. Men det löser inte ditt problem eftersom det då skulle stå <br /> istället flr <BR>.
Jag rekommenderar att du kör med dubbelt \ och sen lägger till följande rad i din javascript-funktion.
str = str.replace(/\\n/i, "\n");
Det är en smått ful lösning men den fungerar iaf. Jag har ingen aning om hur man gör detta på "rätt" sätt med IE.
Nu har jag ett nytt fel, som bara uppenbarar sig i explorer.
Har den här funktionen, som hanterar återställning av lösenord:
function cbResetPasswd (response){
result = response.split("|");
status = parseInt(result[0]);
if(status == 200){
alert("Ditt nya lösenord har skickats till den e-postadress du angav.\n");
showLogin();
}else if(status == 201){
alert("Ditt nya lösenord kunde inte skickas.\nFörsök igen eller kontakta oss.\n");
showLogin();
}else{
message = "An error occurred:\n";
for(i = 1; i <= result.length - 1; i++){
message += " - " + result[i ] + "\n";
}
showLayer("site-overall");
showLayer("passwd-recovery-form");
hideLayer("site-loading");
alert(message);
}
}
Det funkar så att en php sida skickar en response till funktionen ovan i form av:
200|Success
201|Failed
500|Felmeddelande 1|Felmeddelande 2|osv
...
Sen splittar jag strängen med | och kollar vad statuskoden är.
Om jag kör alert på response får jag 200|Success och kör jag en alert på result[0] får jag 200, men ifsatsen ovan resulterar i else.
Vad kan det bero på?
MickeA.com skrev:
Nu har jag ett nytt fel, som bara uppenbarar sig i explorer.
Vilken överraskning... :p
function cbResetPasswd (response){
[b]alert("-" + response + "-");[/b]
result = response.split("|");
status = parseInt(result[0]);
if(status == 200){
alert("Ditt nya lösenord har skickats till den e-postadress du angav.\n");
showLogin();
}else if(status == 201){
alert("Ditt nya lösenord kunde inte skickas.\nFörsök igen eller kontakta oss.\n");
showLogin();
}else{
[b]alert("-" + status + "-");[/b]
message = "An error occurred:\n";
for(i = 1; i <= result.length - 1; i++){
message += " - " + result[i ] + "\n";
}
showLayer("site-overall");
showLayer("passwd-recovery-form");
hideLayer("site-loading");
alert(message);
}
}
Det funkar så att en php sida skickar en response till funktionen ovan i form av:
200|Success
201|Failed
500|Felmeddelande 1|Felmeddelande 2|osv
...
Pröva att lägg till de raderna, precis som de står och se vad du får tillbaka. Min bästa gissning är att du av någon anledning får ett nyradstecken eller annat skräp i början av raden.
Skumt, alert(status); var tom i Explorer.
Nu gjorde jag såhär:
var result = response.split("|");
var status = parseInt(result[0]);
Då funkar det även där, vilket är bra.
Men hur kan det komma sig att variabeln status inte sätts korrekt om jag kör utan var?
MickeA.com skrev:
Men hur kan det komma sig att variabeln status inte sätts korrekt om jag kör utan var?
Nu kom jag äntligen på det. status refererar till window.status som säkert ställer till det på något sätt. Så är det i allmänhet. Skulle du ha skrivit foo = 42; och foo inte skulle vara definierat någon annanstans, så sätter du egentligen window.foo. Och just med status skapar det uppenbarligen problem.
När du använder var, deklarerar du en lokal variabel, och får inte den krocken. Allmänt tips: I regel bör man alltid deklarera lokala variabler med var, även/särskilt i for-slingor. Annars kan man få namn-krockar med skumma buggar som följd.
for(var i=0; i<bar.length; i++){/* rätt */}
for(i=0; i<bar.length; i++){/* fel */}
Jasså, det är så det ligger till.
Tack för tipset!