Avatar billede mik28 Seniormester
19. marts 2008 - 11:16 Der er 22 kommentarer og
1 løsning

AJAX problem

Hej Eksperter,

Jeg har en ajax ting som i princippet ser så ledes ud:

function minFunktion()


    var xmlHttp;
 
  try
  {    // Firefox, Opera 8.0+, Safari
  xmlHttp=new XMLHttpRequest();
  }
  catch (e)
    {   
  // Internet Explorer
 
  try
    {     
    xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
    }
    catch (e)
      {     
      try
    {       
    xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
    }
    catch (e)
    {       
    alert("Your browser does not support AJAX!");
    return false;
    }     
    }   
    }
    xmlHttp.onreadystatechange=function()
      {
     
      if(xmlHttp.readyState==4)
        {
                var test = xmlHttp.responseText.replace(/^\s+|\s+$/g,"");
                             
                if (test=="BLA"){
                        alert("BLA");
                    }
        }
      }
         
    xmlHttp.open("GET","/Der_for_filen_er",true);
    xmlHttp.send(null);
}

Problemet er bare at det ikke virker i vise browsere (nyeste version firefox f.x) Det virker fint i IE, hvorfor?
Avatar billede mik28 Seniormester
19. marts 2008 - 11:17 #1
Det virker også i Mozilla 1.7.2
Avatar billede olebole Juniormester
19. marts 2008 - 21:42 #2
<ole>

Hvad betyder: "Problemet er bare at det ikke virker"?

Hvad sker der?
Hvad sker der ikke?
Får du fejl (tjek error-konsollen i FF)?
Hvis du får fejl, hvad siger de så?

/mvh
</bole>
Avatar billede olebole Juniormester
19. marts 2008 - 21:44 #3
Derudover har jeg skrevet en artikel, der beskriver, hvordan du laver en crossbrowser wrapper for XMLHttpRequest objektet:
    http://www.dengodekode.dk/artikler/ajax/xmlhttprequest_wrapper.php
Avatar billede olebole Juniormester
19. marts 2008 - 21:46 #4
- tjek evt. også denne tråd:
    http://www.eksperten.dk/spm/817625
Avatar billede mik28 Seniormester
20. marts 2008 - 08:52 #5
Uha, jeg skal vist lige tage et grundigt kig på min kode. Jeg har flere ajax funktioner som alle er bygget op på den måde, men det er så vidt jeg kan læse mig til slet ikke nødvendigt. Er det rigtigt forstået at jeg i min js fil bare kan skrive

(function(){if(window.XMLHttpRequest)return;var o=null,s,
a=["MSXML2.XMLHTTP.5.0","MSXML2.XMLHTTP.4.0","MSXML2.XMLHTTP.3.0","Msxml2.XMLHTTP","Microsoft.XMLHTTP"];
for(var i=0,j=a.length;i<j;s=a[i],i++){try{if(o=new ActiveXObject(s))break}
catch(e){}}window.XMLHttpRequest=o?function(){return new ActiveXObject(s)}:null;o=null})()

function minFunktion()
{
var oHttp = new XMLHttpRequest();
oHttp.open("post", "http://www.domain.dk/page.php", true);
oHttp.onreadystatechange = function(){ myCallBack(oHttp) };
oHttp.send("id=123&noget=andet");
}

function minFunktion1()
{
var oHttp = new XMLHttpRequest();
oHttp.open("post", "http://www.domain1.dk/page.php", true);
oHttp.onreadystatechange = function(){ myCallBack(oHttp) };
oHttp.send("id=321&noget=tredie");
}
Avatar billede mik28 Seniormester
20. marts 2008 - 09:21 #6
Jeg får iøvrigt ikke nogen fejl i min kode. Det viser sig i første omgang slet ikke at være ajax den er gal med, men at jeg ikke tillod cookies i den pågældende browser. Jeg er dog MEGET interesseret i at få min kode optimeret. Det som jeg ikke forstår nu er hvordan jeg i f.x minFunktion udfører noget hvis readyState==4
Avatar billede mik28 Seniormester
20. marts 2008 - 11:16 #7
Hmmmm. Så vidt jeg kan se efter jeg har tænkt mig om så mangler jeg jo bare denne her del. Jeg forstår dog stadig ikke det med (function

function myCallBack(oHttp) {
    if (oHttp.readyState<4) return;

  // Gør noget fornuftigt med responsen her (kode udeladt)

  // - og dræb derefter objektet
    oHttp = null;
}
Avatar billede mik28 Seniormester
20. marts 2008 - 13:34 #8
Jeg behøver vel i virkeligheden ikke den myCallBack funktion. Kan jeg gøre det som den gør i minFunktion :-) eller??
Avatar billede mik28 Seniormester
20. marts 2008 - 14:47 #9
Det er fordi minFunktion og minFunktion1 jo skal gøre forskellige ting :-)
Avatar billede olebole Juniormester
20. marts 2008 - 16:28 #10
I virkeligheden er der vel ikke nogen grund til at have flere funktioner. I mit indlæg ( http://www.eksperten.dk/spm/817625#rid7015554 ) viser jeg, jvordan du kan sende et objekt med variabler til en funktion, der afvikler Ajax-kaldet.

På serveren sender du bare en ekstra variabel med, som forklarer callback-funktionen, hvad den skal gøre. Hvordan det skal gøres, afhænger af den kontekst i hvilken, du skal bruge scriptet
Avatar billede mik28 Seniormester
26. marts 2008 - 07:31 #11
Jeg kan ikke rigtigt få det til at virke. Det er som om værdierne jeg ønsker at poste ikke kommer med

function minLogin(a,b)
{
var oHttp = new XMLHttpRequest();
oHttp.open("post", "/densomreturnererXML.jsp", true);
oHttp.onreadystatechange = function(){ myCallBack(oHttp) };
oHttp.send("VAR="+a+"&VAR1="+b);
}
Avatar billede mik28 Seniormester
26. marts 2008 - 07:47 #12
Charles (debuging proxy) siger at værdierne bliver postet. Der må være et eller andet galt med den jsp side som henter xml'en. Det virker som sagt fint hvis jeg bruger get
Avatar billede mik28 Seniormester
26. marts 2008 - 07:56 #13
Nu har jeg prøvet at lave en form som poster, og det virker fint. Jeg fatter minus :-(
Avatar billede mik28 Seniormester
26. marts 2008 - 08:01 #14
Min myCallBack ser således ud

function myCallBack(oHttp) {
if (oHttp.readyState<4) return;
       
var xmlDoc=oHttp.responseXML.documentElement;
       
if(xmlDoc.getElementsByTagName("login_ok")[0].childNodes[0].nodeValue=="T"){
SÆT NOGLE COOKIES OG ANDET SJOV
}
else{
alert("Please come again");
}
oHttp = null;
}
Avatar billede mik28 Seniormester
26. marts 2008 - 10:24 #15
HJÆLP :-)
Avatar billede olebole Juniormester
26. marts 2008 - 17:06 #16
Du sætter ikke en content-type request-header, inden du afsender request'en. Kik i de eksempler, jeg linker til højere oppe
Avatar billede mik28 Seniormester
26. marts 2008 - 17:41 #17
Okay.

oHttp.setRequestHeader("Content-Type", "text/xml");

Jeg forstår det ikke helt
Avatar billede mik28 Seniormester
26. marts 2008 - 18:02 #18
function minLogin(a,b)
{

var oHttp = new XMLHttpRequest();
oHttp.open("post", "/densomreturnererXML.jsp", true);
oHttp.setRequestHeader("Content-Type", "text/xml");
oHttp.onreadystatechange = function(){ myCallBack(oHttp) };
oHttp.send("VAR="+a+"&VAR1="+b);
}
Avatar billede mik28 Seniormester
26. marts 2008 - 18:12 #19
Du er en ond ond mand :-)

oHttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded; charset=utf-8");

Det er bare så COOL. Tusinde tak for hjælpen
Avatar billede olebole Juniormester
26. marts 2008 - 20:20 #20
- serveren er vandt til GET-forespørgsler på alle mulige måder - fra alle mulige steder og klienter. Dem håndterer den gerne og villigt.

POST-forespørgsler kommer derimod normalt fra en form, så derfor skal man gøre eksplicit opmærksom på, at det er dén rolle, man gerne ser sin script-kode spille  ;o)
Avatar billede olebole Juniormester
26. marts 2008 - 20:23 #21
- og jeg er ked af, hvis du har kopieret koden fra et af mine eksempler!  :o|

HTTP-feltnavne er case sensitive, så der skal stå 'Content-Type' - ikke 'Content-type'. Så vidt jeg ved, skaber det ikke problemer ... men du (*host-host* jeg *host-host*) bør alligevel skrive det korrekt  ;D
Avatar billede mik28 Seniormester
27. marts 2008 - 05:24 #22
Jeg tog det herfra http://www.eksperten.dk/spm/817625 (22:28:30). Jeg retter det selvfølgelig så det er korrekt. Endnu engang tak for hjælpen
Avatar billede olebole Juniormester
27. marts 2008 - 22:12 #23
Selvtak - og tak for points  ;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