Avatar billede chrisbookwood Nybegynder
08. september 2008 - 22:01 Der er 21 kommentarer og
1 løsning

if-sætning ignorere svar fra xml request

hej,
jeg har nu brugt den sidste dag på at prøve at løse et problem der, for mig, virker meget mystisk...
Det der sker er at jeg sender en xmlHttpRequest afsted, og når readystate så er lig 4, udføre jeg en if-sætning på responseText'n... Det underlige er så bare at det ikke rigtig virker...
Jeg har følgende kode: (det skal lige siges at jeg på nuværende tidspunkt tester i Firefox 3 og Google Chrome)

var statusLogin = xmlHttp.responseText;
if(statusLogin == "3") {
...
} else {
...
}

Jeg har endvidere prøvet at smide en alert på der udskriver statusLogin, og den giver "3", men alligevel springes der bare videre til en'else'-statement. Hvis jeg så smider "eval('('+xmlHttp.responseText+')')" ind som værdi af statusLogin, så virker det i Firefox, men stadigvæk ikke i chrome - endvidere, så ser det ud til at chrome bare giver op, og hverken springer til if->statusLogin lig 3, eller else-sætningen ... den gør bare intet, hvorimod begge browsere reagere ens (springer til else-sætning) hvis der ingen eval er.

Håber nogen af jer kan give mig et godt svar på denne,  for mig, mystiske ting.
På forhånd tak.
Avatar billede montago Praktikant
09. september 2008 - 00:08 #1
Det lyder underligt !

to ting:

1. kan du smide noget mere kode op, evt hele din request kode.

2. bruger du Firebug (FF addon) ? -- du kan step-vis debugge med Firebug og se hvad værdier af næsten alle variable er mens du debugger (sæt et breakpoint i koden, tryk F10 for at hoppe til næste, F8 for at køre resten)

i Chrome virker console.log() også som i Firebug... hvor man kan udskrive ting til konsollen (ALT + Æ)
Avatar billede montago Praktikant
09. september 2008 - 00:10 #2
jeg vil anbefale at kigge på http://blog.mdk-photo.com/post/The-most-versatile-httpRequest-function.aspx

da den kan gøre dit arbejde lidt lettere (idet man isolere retur-variablen i en lille fuktion udenfor request koden)
Avatar billede olebole Juniormester
09. september 2008 - 10:23 #3
<ole>

- og hvis din request-wrapper skal være bare nogenlunde opdateret til dette årtusinde, kan du kikke på denne:
    http://www.dengodekode.dk/artikler/ajax/xmlhttprequest_wrapper.php

Hvis Chrome (som jeg ikke selv har haft tid til at teste) er bare nogenlunde tidssvarende, kan det meget vel tænkes, at det XMLHttpRequest objekt, du prøver at instantiere ikke understøttes.

Der findes et hav af tussegamle (såkaldte) Ajax-scripts på nettet, og de fleste af dem understøtter kun 'Msxml2.XMLHTTP' og 'Microsoft.XMLHTTP', som begge forlængst er afløst af nye versioner. De fleste scripts tager heller ikke hensyn til, at IE 7 er udkommet. Der er derfor al mulig grund til at vælge en mere moderne XMLHttpRequest-wrapper  =)

Hvad angår dit problem, må du lægge et link eller vise noget kode. Der florerer som sagt et hav af såkaldte Ajax-scripts, der ikke har ret meget med Ajax at gøre, så der kan være rigtig mange muligheder for fejl.

/mvh
</bole>
Avatar billede olebole Juniormester
09. september 2008 - 10:28 #4
- man kan forøvrigt ofte se, om en forfatter af et script ved noget om Ajax. Hvis det foreslås, at man kan sende en request som GET, har forfatteren formodentlig aldrig selv brugt Ajax til noget seriøst. Ajax requests sendes altid som POST  ;o)
Avatar billede montago Praktikant
09. september 2008 - 10:57 #5
Hey ole.

endnu en gang forsøger du at vise at du er noget, ved at svine andre folk til, svøbe om dig med begreber for at vise du er større og bedre end os andre.

- Hvilken del af GET / POST er det du ikke har forsået ?
- I Hvilken browser vil mit script fejle ?
- Hvilket design pattern er nemmest / hurtigst at bruge ? (ét hvor man skal skrive 4 linier koder + handler() hver gang man vil lave et request, eller ét hvor man skal skrive 1 linie kode + handler() ) ?
Avatar billede olebole Juniormester
09. september 2008 - 11:59 #6
montago >> du er for primitiv til, at jeg gider diskutere mere med dig. Foreløbig har du fornylig fået lukket en artikel og et 'spørgsmål' - og jeg formoder, som du ved, at Admin snart er så træt af dine konstante overtrædelser af E's reglement, at du mister din bruger!
Avatar billede olebole Juniormester
09. september 2008 - 12:02 #7
PS: og jeg skal nok love, at skrive helt eksplicit, hvis jeg i fremtiden har en kommentar til dig. Indtil da kan du roligt regne med, det er til andre, når jeg skriver noget her på E  =)
Avatar billede montago Praktikant
09. september 2008 - 13:34 #8
Indtil videre har det været DIG, ole, som har forsøgt at pille mig ned.

Gang på gang kommer du kun med hån og springer let og elegant over de pointer som modsiger dig.

Selv i denne nye tråd, starter du med at håne det perfekt-funktionelle og meget nemme HttpRequest pattern, som jeg har valgt at præsentere.  En smartere måde end den du kommer med, hvilket får dig til at håne mig...

du ter dig som en nidkær, ækel, offentlig ansat som ikke får respekt hverken hjemme eller på arbejde og derfor sidder her og 'disser' folks arbejde og forsøg på at få ting til at virke. -blot for at få lidt tilfredsstillelse i din tomme hverdag.
Avatar billede olebole Juniormester
09. september 2008 - 14:15 #9
Sikke dog en masse fine termer, du behersker!
Avatar billede chrisbookwood Nybegynder
09. september 2008 - 16:59 #10
Okay, så nu har jeg indtil videre prøvet med den wrapper du linker til, Montago, og nu får jeg det samme resultat i både chrome og firefox. Den modtager svaret fra serversiden helt fint, men alligevel registrere min if-sætning ikke svaret. Jeg gør således:

function checkStatus(statusLogin) { alert(statusLogin);
if(statusLogin == "3") {
} else if(statusLogin == "1") {
...
} else {
...
}
}

jeg har prøvet at debugge lidt med alert'n i starten af funktionen, og den udskriver godt nok 1 hvis jeg skriver kodeord rigtigt, og 3 hvis jeg ikke gør, men lige gyldigt hvad jeg skriver, er det 'else' sætningen der bliver taget i brug... Jeg har prøvet at kigge lidt rundt med firebug, og den sender dataerne rigtigt og svaret der modtages er også i vinkel, men problemet er der stadigvæk.
Avatar billede montago Praktikant
09. september 2008 - 17:24 #11
dét jeg tænker lidt, er at beskeden du får tilbage, indeholder flere tegn end du tror...

prøv at alerte længden på statusLogin og se om den er 1

1. du kan trimme statusLogin inden du tester

2. konvertere den til int: (parseInt(statusLogin) == 3) eller 'gange' (statusLogin*1 == 3)

3. bruge statusLogin.indexOf("3") > -1
Avatar billede olebole Juniormester
09. september 2008 - 19:24 #12
chrisbookwood >> montago ønsker som vanligt ikke at forstå, hvad der bliver skrevet. Min wrapper skal ingenlunde erstatte hans - blot en del af det  =)

Forklaringen på, hvorfor min wrapper er skrevet, som den er:

Når wrapperen læses af browseren, testes én gang på, hvad browseren understøtter. Derefter kan et XMLHttpRequest objekt i alle browsere instantieres med:
    var oHttp = new XMLHttpRequest();

- som er den kommende standard og idag understøttes af FF, Opera og IE7+.

I modsætning til de fleste andre XMLHttp-scripts, testes der som sagt kun én gang på, hvad browseren understøtter. Ingen if-sætninger afvikles ved hver instantiering. Det ville blot være overflødig redundans, som jo ikke er ønskelig i nogen kode.

Der spørges først på, om browseren i forvejen understøtter XMLHttpRequest. Gør den det, sker der intet.
Er det derimod en IE6 eller derunder, testes for hvilken version og progID af MSXML, PC'en understøtter. Det har ikke noget med browseren - men med styresystemet - at gøre.

MSXML er i tidens løb kommet en del forskellige versioner og med forskelligt progID. MS anbefaler, at man bruger MSXML2.XMLHTTP.6.0, som er den nyeste version, som rigtig mange XP-brugere har installeret - og som er standard i Vista.
Der er en del forskelle fra tidligere versioner - bl.a, at default sproget er XPath i MSXML2.XMLHTTP.6.0, hvilket betyder, man ikke længere skal sætte SelectionLanguage som en property på objektet, hvis man ønsker at bruge XPath som tilgang til XML-DOM'en. Derudover er der lidt sikkerhedsforskelle på versionerne.

MSXML2.XMLHTTP.4.0 og 5.0 var der en del uheldige issues med, så dem anbefaler MS, man springer over. Derfor anbefaler de, man falder tilbage på MSXML2.XMLHTTP.3.0, hvis 6.0 ikke er installeret.

Er MSXML2.XMLHTTP.3.0 installeret på maskinen, peger også MSXML2.XMLHTTP på version 3 objektet, og MS anbefaler, at man ikke instantierer objekter med progIDs under 3.0.

En version, der egentlig godt kunne undværes, er Microsoft.XMLHTTP. Den kom med Windows98, så kun, hvis du ønsker at understøtte gamle IE5.X'ere under Win98, behøver man at bruge den. På den anden side var de, så vidt jeg husker, helt nede i JScript 5.0, hvilket ca. svarede til JavaScript 1.3 - og så er spørgsmålet, hvor meget af de scripts, vi i dag bruger, overhovedet fungerer  ;o)

Hvis udviklingen fortsætter, går der næppe mange år, før vi ikke længere behøver understøtte IE6. Til den tid smider du bare wrapperen ud af dine dokumenter. Alle dine Ajax-scripts vil stadig fungere på samme måde.

Ønsker du således at bruge montagos funktion, kan du gøre det sådan (forudsat, du skriver min wrapper i toppen af dokumentet):

function LoadURL(action,url,postbody,delegateReturn, isXML)
{
    var xmlhttp = new XMLHttpRequest();

    if ( xmlhttp )
    {
        xmlhttp.onreadystatechange = function(){
            if (xmlhttp.readyState==4){
                if (xmlhttp.status==200){
                    if(delegateReturn != null)
                    {
                        if(isXML){    delegateReturn( xmlhttp.responseXML );}
                        else{        delegateReturn( xmlhttp.responseText );}
                    }
                }else{
                    alert("Error: " + xmlhttp.status + "\n\nURL: "+URL);
                }
            }
        };
        try{
            xmlhttp.open(action,url, true);
            xmlhttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded; charset=utf-8");
            xmlhttp.send(postbody);
        }catch(e){
            alert("xmlhttp error: \n" + e.message);
        }
    }else{
        alert("Your browser does not support XMLHTTP.");
    }
}
Avatar billede montago Praktikant
09. september 2008 - 20:03 #13
wuhu teamwork ... og endelig en passende forklaring på hvorfor min metode ikke var skudsikker ! :-)

takker !
Avatar billede olebole Juniormester
09. september 2008 - 20:33 #14
- og så bør der også ryddes op, hvad ikke alle browsere er lige venlige til:

            if (xmlhttp.readyState==4){
                if (xmlhttp.status==200){
                    if(delegateReturn != null)
                    {
                        if(isXML){    delegateReturn( xmlhttp.responseXML );}
                        else{        delegateReturn( xmlhttp.responseText );}
                    }
                }else{
                    alert("Error: " + xmlhttp.status + "\n\nURL: "+URL);
                }
                xmlhttp = null;
            }
Avatar billede chrisbookwood Nybegynder
09. september 2008 - 20:36 #15
wtf ... hvor blev den, ellers så lange post, jeg lige skrev af ? -.-
Avatar billede chrisbookwood Nybegynder
09. september 2008 - 20:39 #16
Okay ... så jeg fik det til at virke, heldigvis. Det vidste sig at længden på strengen var 2, så et eller andet sted har der sneget sig noget uventet ind. Ved hjælp af indexOf og substr fik jeg fjernet alt andet end det ønskede tal fra strengen, så nu virker det ubeklageligt!
Endvidere har jeg leget lidt ud fra det link du sendte, ole, og det er jo perfekt! Når det så også sættes sammen med Montago's eksempel, virker det drømmende nemt.!
Avatar billede olebole Juniormester
09. september 2008 - 20:47 #17
En lille, fiks funktion, der fjerner evt. whitespace i enderne af en streng:

function trim(s) {
    return s.replace(/^\s?(.*?)\s?$/, "$1");
}

- men du skulle nok forsøge at løse problemet på serveren. Det er vist mere langsigtet  ;o)
Avatar billede montago Praktikant
09. september 2008 - 20:53 #18
Det dælme nice at mig og ole for en gangs skyld kan fremstille noget sammen...


til Ole:

Jeg må ærligt bekende at jeg aldrig har gået særlig meget op i hvilket XMLHTTP jeg brugte i hvilken browser. Det script jeg har nu, er kopieret fra en gammel version af W3schools - som jeg har brugt og kopiere lige siden, idet jeg aldrig har haft problemer med det.

W3Schools nyeste script er også reduceret til :

xmlhttp=null;
if (window.XMLHttpRequest)
{ // code for all new browsers
    xmlhttp=new XMLHttpRequest();
}
else if (window.ActiveXObject)
{// code for IE5 and IE6
    xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}

men uden nærmere forklaringer...
Avatar billede montago Praktikant
09. september 2008 - 20:57 #19
Et lille tip, hvis man søger den hurtigste trimmer ;-)

//Worlds fastest JS trim - thanks to http://blog.stevenlevithan.com/archives/faster-trim-javascript

String.prototype.trim = function()
{
  var str = this.replace(/^\s+/, '');
  for (var i = str.length - 1; i >= 0; i--){
    if (/\S/.test(str.charAt(i))){
      str = str.substring(0, i + 1);
      break;
    }
  }
  return str;
}
Avatar billede olebole Juniormester
09. september 2008 - 20:59 #20
montago >> fornøjelsen er så ganske din!
Avatar billede chrisbookwood Nybegynder
09. september 2008 - 21:07 #21
Lol, jeg har lige fundet problemet og kan nu kører applikationen uden nogen substr hacks eller noget som helst. Når jeg kiggede på php filen i browseren, hverken i IE, Chrome eller FF, så der ikke ud til at være andet end et tegn, men hvis jeg kiggede i kilden, var der noget der lignede '-' foran tallet. Det sjove var, at i chrome og ie så det sådan her ud: -3, men i FF var det mere sådan smeltet oven i hinanden. Jeg kunne sagtens markere tegnet, men hvis jeg kopierede det ind i et tekstprogram, var det kun tallet der kom frem, men editoren sagde der var 4 tegn, men jeg kunne kun se tallet - ingen mellemrum eller noget... Jeg løste problemet ved at slette dokumentet og flytte koden ind i et nyt dokument.
Mystisk Mystisk
Avatar billede chrisbookwood Nybegynder
01. oktober 2008 - 15:13 #22
Hmm, ja, så tror jeg bare jeg selv lukker tråden...
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester