Avatar billede elskermad.dk Nybegynder
03. januar 2007 - 13:19 Der er 22 kommentarer og
1 løsning

JSON virker ikke for mig

Hej Eksperter!

I forbindelse med den nye artiklen her på eksperten om JSON skulle jeg da lige prøve det, men det virker ikke for mig...

Den siger at json ikke er defineret:

function tjekbrugernavn(brugernavn) {
    var xmlhttp;
   
    if (window.XMLHttpRequest) {
        xmlhttp = new XMLHttpRequest();
    }
    else if (window.ActiveXObject) {
        xmlhttp = new ActiveXObject('Microsoft.XMLHTTP');
    }
   
    xmlhttp.open('GET','/brugernavnstatus.php?brugernavn=' + brugernavn,true);
   
    xmlhttp.onreadystatechange = function() {
        if(xmlhttp.readyState == 4) {
            var json = eval(xmlhttp.responseText);
        }
    }
   
    xmlhttp.send(null);
   
    return json.frit;
}

brugernavnstatus.php udskriver:
{"frit":false}

Hvad gør jeg forkert?
Avatar billede mclemens Nybegynder
03. januar 2007 - 14:16 #1
<script type="text/javascript">

var json={};

function tjekbrugernavn(brugernavn) {
    var xmlhttp;
 
    if (window.XMLHttpRequest) {
        xmlhttp = new XMLHttpRequest();
    }
    else if (window.ActiveXObject) {
        xmlhttp = new ActiveXObject('Microsoft.XMLHTTP');
    }
 
    xmlhttp.open('GET','/brugernavnstatus.php?brugernavn=' + brugernavn,true);
 
    xmlhttp.onreadystatechange = function() {
        if(xmlhttp.readyState == 4) {
            eval("json="+xmlhttp.responseText);
        }
    }
 
    xmlhttp.send(null);
 
    return json.frit;

}

</script>

{"frit":false};
Avatar billede mclemens Nybegynder
03. januar 2007 - 14:18 #2
Eksempel:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="content-type" content="text/html; charset=iso-8859-1"><title>Ingen titel</title><meta name="robots" content="index, follow">

<script type="text/javascript">

var json;

function tjekbrugernavn(brugernavn) {
    var xmlhttp;
 
    if (window.XMLHttpRequest) {
        xmlhttp = new XMLHttpRequest();
    }
    else if (window.ActiveXObject) {
        xmlhttp = new ActiveXObject('Microsoft.XMLHTTP');
    }
 
    xmlhttp.open('GET','test.txt',true);
 
    xmlhttp.onreadystatechange = function() {
        if(xmlhttp.readyState == 4) {
            eval("json="+xmlhttp.responseText);
        }
    }
 
    xmlhttp.send(null);
 


    return json.frit;

}

b=tjekbrugernavn(1);
alert(b);

</script>

</head><body>

</body></html>



og test.txt:

{"frit":false};
Avatar billede mclemens Nybegynder
03. januar 2007 - 14:18 #3
"Den siger at json ikke er defineret:
Hvad gør jeg forkert?"

Du glemte at definere json globalt og din eval manglede lidt justering
Avatar billede mclemens Nybegynder
03. januar 2007 - 14:22 #4
Det med fejlen på eval ses
måske nemmere med eksemplet her:

<script type="text/javascript">
var json=eval('{"test":false}');
alert("første alert:"+json.test);
</script>

<script type="text/javascript">
eval('var json='+'{"test":false}');
alert("anden alert:"+json.test);
</script>
Avatar billede mclemens Nybegynder
03. januar 2007 - 14:24 #5
Kaster et svar, hvis det kunne bruges
( er på vej ud af døren ... )
Avatar billede elskermad.dk Nybegynder
03. januar 2007 - 14:32 #6
den siger at frit ikke er defineret nu:

function tjekbrugernavn(brugernavn) {
    var xmlhttp;
    var json;
   
    if (window.XMLHttpRequest) {
        xmlhttp = new XMLHttpRequest();
    }
    else if (window.ActiveXObject) {
        xmlhttp = new ActiveXObject('Microsoft.XMLHTTP');
    }
   
    xmlhttp.open('GET','brugernavnstatus.php?brugernavn=' + brugernavn,true);
   
    xmlhttp.onreadystatechange = function() {
        if (xmlhttp.readyState == 4) {
            eval('json = ' + xmlhttp.responseText);
        }
    }
   
    xmlhttp.send(null);
   
    alert( json.frit);
}
Avatar billede elskermad.dk Nybegynder
03. januar 2007 - 15:15 #7
hvis man alerter xmlhttp.responseText ser værdien korrekt ud, så jeg kan ikke gennemskue hvad der er galt
Avatar billede elskermad.dk Nybegynder
03. januar 2007 - 15:17 #8
jeg har også forsøgt at deklarerer json globalt uden for funktionerne
Avatar billede windcape Praktikant
03. januar 2007 - 15:17 #9
hehe , det der er forkert er dine closures ikke din json :-)
Avatar billede windcape Praktikant
03. januar 2007 - 15:19 #10
Problemet er at du laver din alert() før din eval overhovedet bliver kørt.
Avatar billede windcape Praktikant
03. januar 2007 - 15:25 #11
dette her virker f.eks. fint :-)

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
  <head>
    <title></title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
    <script type="text/javascript">
      function checkBrugernavn(brugernavn) {
          var xmlhttp;
          var json;
          if(window.XMLHttpRequest) {
              xmlhttp = new XMLHttpRequest();
          } else if (window.ActiveXObject) {
              xmlhttp = new ActiveXObject('Microsoft.XMLHTTP');
          }
          xmlhttp.open('GET','brugernavnstatus.php?brugernavn=' + brugernavn,true);
          xmlhttp.onreadystatechange = function() {
              if(xmlhttp.readyState == 4) {
                  json = eval('(' + xmlhttp.responseText + ')');
              }
          }
          xmlhttp.send(null);
          setTimeout(function() {
              alert(json);
          },2000);
      }
     
      window.onload = function() {
          checkBrugernavn('foobar');
      }
    </script>
  </head>
  <body>
    <div></div>
  </body>
</html>
Avatar billede windcape Praktikant
03. januar 2007 - 15:27 #12
btw. så er http://www.twilightuniverse.com/projects/sack/ et dejligt "ajax" tool til at udføre XmlHttpRequests :-)
Avatar billede elskermad.dk Nybegynder
03. januar 2007 - 15:38 #13
Hej windcape :o)

Jeg har nogenlunde fået det til at virke, dog ikke altid...

Min kode så sådan her ud nu:
var json = {};

function brugernavnoptaget(brugernavn) {
    var xmlhttp;
   
    if (window.XMLHttpRequest) {
        xmlhttp = new XMLHttpRequest();
    }
    else if (window.ActiveXObject) {
        xmlhttp = new ActiveXObject('Microsoft.XMLHTTP');
    }
   
    xmlhttp.open('GET','/brugernavnstatus.php?brugernavn=' + brugernavn,true);
   
    xmlhttp.onreadystatechange = function() {
        if (xmlhttp.readyState == 4) {
            eval('json = ' + xmlhttp.responseText);
        }
    }
   
    xmlhttp.send(null);
   
    return json.frit;
}

function validate(f) {
    var optaget = brugernavnoptaget(f.brugernavn.value);
   
    if (optaget == true) {
        alert('Brugernavnet er ikke ledigt');
        f.brugernavn.select();
        return false
    }
   
    return true
}

Det er ikke menigen der skal alert-bokse ind i selve hentningen, var kun til debugning - men som det er nu er det lidt tilfældigt om den synes brugernavnet er optaget

PS. fjerner lige min kommentar i din artikel - er jo ikke nødvendig nu jeg har fået svar
Avatar billede windcape Praktikant
03. januar 2007 - 15:44 #14
Du bør stadig tilføje en timer, da det afhænger af hvor hurtig din server er om du før et svar eller ej.

Men i teorien kan du ikke rigtig have en funktion som laver "return" af data fra et xmlhttprequest, men du er nød til at validerer direkte i dit onchange event.

function checkUsername(brugernavn) {
    var xmlhttp;
    if (window.XMLHttpRequest) {
        xmlhttp = new XMLHttpRequest();
    }
    else if (window.ActiveXObject) {
        xmlhttp = new ActiveXObject('Microsoft.XMLHTTP');
    }
    xmlhttp.open('GET','/brugernavnstatus.php?brugernavn=' + brugernavn,true);
    xmlhttp.onreadystatechange = function() {
        if(xmlhttp.readyState == 4) {
            var result = eval ('(' + xmlhttp.responseText + ')');
            isValid(result.frit);
        }
    }
    xmlhttp.send(null);
}

function isValid(valid) {
    if(!valid) {
        alert('Brugernavnet er ikke ledigt');
        f.brugernavn.select();
    }
}

function validate(f) {
    var optaget = brugernavnoptaget(f.brugernavn.value);
}
Avatar billede windcape Praktikant
03. januar 2007 - 15:45 #15
Og din kommentar er god nok, til hvis andre skulle stille samme spørgsmål :-)
Avatar billede elskermad.dk Nybegynder
03. januar 2007 - 15:50 #16
huha, det her AJAX er noget besværligt noget...

hvordan stopper jeg min submit hvis brugernavnet ikke er ledigt og jeg ikke kan returnere data? validate bliver først kørt når formularen submittes
Avatar billede windcape Praktikant
03. januar 2007 - 15:55 #17
Hvis du bruger et timer som jeg viste tidligere kan du godt. Men jeg vil ikke ligefrem anbefale at du bruger AJAX til at validerer felter med onsubmit, lad din serverside kode gøre det.

Husk at javascript kan disables og modificeres, serverside kode kan ikke.

Hvis du gerne vil validere dit brugernavn, så gør det on-the-fly:

<input type="text" name="brugernavn" onblur="validateUser(this.value)"/> , og så lad validateUser f.eks. vise en simley eller besked ved siden af din <input>.
Avatar billede elskermad.dk Nybegynder
03. januar 2007 - 15:59 #18
okay ja det var selvfølgelig også en mulighed, det prøver jeg lige :)
Avatar billede elskermad.dk Nybegynder
03. januar 2007 - 16:06 #19
det virker ved at køre det on-the-fly, dog skal jeg stadig deklarerer json uden for funktionerne og køre eval sådan her: eval('var json = ' + xmlhttp.responseText);

smid du lige også et svar :)
Avatar billede windcape Praktikant
03. januar 2007 - 17:37 #20
hvis i skal bruge eval('var json = ' + xmlhttp.responseText); så er det jeres JSON som har fejl.

eval('var json = ' + xmlhttp.responseText); ville sætte json lig med den direkte text, istedet for json = det evaluerede object, dvs. i vil få et extra scope på, hvilket ikke er optimalt :-)
Avatar billede mclemens Nybegynder
03. januar 2007 - 18:01 #21
Det virker også fint hos mig nu,
Jeg skulle bare lige fjerne ;
tilsidst efter objectet ...



<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="content-type" content="text/html; charset=iso-8859-1"><title>Ingen titel</title><meta name="robots" content="index, follow">

<script type="text/javascript">

function tjekbrugernavn(brugernavn) {

var xmlhttp;
if(window.XMLHttpRequest) {
    xmlhttp = new XMLHttpRequest();
} else if (window.ActiveXObject) {
    xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.open('GET','test.txt',true);
xmlhttp.onreadystatechange = function() {
    if(xmlhttp.readyState == 4) {
        // HER ER VORES JSON STRING
        var result = xmlhttp.responseText;
        // VED AT BRUGE eval() PARSER VI SÅ JSON strengen til et Javascript object
        var json = eval("(" + result +")");

  alert(json.frit);


    }
}
xmlhttp.send(null);

}

tjekbrugernavn(1)

</script>

</head><body>

</body></html>


test.txt
{"frit":false}
( før var det {"frit":false}; )
Avatar billede mclemens Nybegynder
03. januar 2007 - 18:12 #22
Elskermad.dk accepter lige windcape's svar og afvis mit
- mit ; efterobjectet gjorde fejlen efter at
det med global json var lavet ...
Avatar billede windcape Praktikant
03. januar 2007 - 19:52 #23
\o/
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