Avatar billede well_r Nybegynder
18. august 2008 - 00:11 Der er 5 kommentarer og
1 løsning

XMLHttpRequest - readystate?

Hey
jeg prøver at opdatere en tabel i en webshop via XMLHttpRequest..
det virker skam også fint, men bare ikke i IE.. (dvs testet i FF og virker perfekt)
der siger den at dataen, som kræves for at fuldføre handlingen, er ikke tilgængelige endnu..
har både prøvet med at udsætte den og få js til at sove lidt.. men INTET hjælper!

<script type="text/javascript">
var IE = false;
if (navigator.appName == "Microsoft Internet Explorer")
    IE=true;
var timeout;
var http;
// to make sure that we create the right object if browser is IE BEFORE VERSION 7 or other
    try{
        http = new XMLHttpRequest();
    } catch (e){
        http = new ActiveXObject("Microsoft.XMLHTTP");
    }

var eve;
var adr;

function sendRequest(action) {
        http.open("GET", action);
        http.send();
}

function emptyShoppingCart(){
        eve = "action=emptyCart";
        adr = 'appPort.php';
        sendAction();
        reloadCart();
}
function putInShoppingCart(){
    var val = 0;

    for( i = 0; i < document.lort.itemid.length; i++ )
    {
    if( document.lort.itemid[i].checked == true )
        val = document.lort.itemid[i].value;
    }
    if (val > 0){
        eve = "action=addToCart&variantid="+val+"&amount=1";
        adr = 'appPort.php';
        sendAction();
        reloadCart();
    }
}
function updateItemAmount(val,amount,index){
        if (amount > 0){
            eve = "action=updateItemAmount&variantid="+val+"&amount="+amount;
        adr = 'appPort.php';
        sendAction();
            reloadCart();   
        } else {
            document.getElementById("cartshow").deleteRow((index+1));
            eve = "action=removeFromCart&variantid="+val;
            adr = 'appPort.php';
            sendAction();
            reloadCart();
        }
}
function reloadCart(){
    http.open("GET","http://<?=getenv("SERVER_NAME");?>/webshop_dev/appPort.php?action=reload");
    document.getElementById('rightMenu').innerHTML = http.responseText;
}
function sendAction(){
    if (http.readyState == 0 || http.readyState == 4) {
        sendRequest("http://<?=getenv("SERVER_NAME");?>/webshop_dev/"+adr+"?"+eve);
    } else {
        window.clearTimeout(timeout);
        timeout = window.setTimeout(sendAction, 500);
    }
}
</script>

Koden skulle gerne forklare sig selv..
det skal så også lige siges at jeg ikke har arbejdet så forfærdeligt meget med det!
har desuden været på nettet efter denne fejl..men kan ikke umiddelbart finde noget..

tak på forhånd

wel
Avatar billede w13 Novice
18. august 2008 - 10:48 #1
Du kan ikke hente http.responseText ligeså snart, du har udført kaldet. Du skal bruge onreadystatechange så det først bliver gjort, når den er klar:

http.onreadystatechange=function(){
    if(http.readyState==4){
        if(http.status==200){
            alert(http.responseText);
        }else{
            alert("Kaldet kunne ikke udføres!\n\nDer opstod en HTTP-fejl: "+http.status);
        }
    }
}

Når readyState er lig med 4, betyder det at kaldet er udført. Der tjekkes da, om HTTP-status er "200", dvs. "Ok", eller om der opstod en fejl.
Avatar billede w13 Novice
20. august 2008 - 11:31 #2
Kommet videre?
Avatar billede well_r Nybegynder
20. august 2008 - 12:07 #3
desværre ikke..eller dvs .. jeg har fundet ud af at grunden til at jeg ikke kan bruge onreadystate er fordi at jeg laver TO http-requests..

dvs..når jeg kommer til andet kald skal jeg enten oprette et nyt objekt eller noget..
for ellers vil onreadystate blive kaldt når første http kald er færdigt.

men løste det ved at gøer det til et kald..
så du får point..
Avatar billede w13 Novice
20. august 2008 - 12:08 #4
Tak for point.

Normalt når man har 2 kald, vil man jo vente med at kalde det andet, til onreadystate er blevet "affyret".
Avatar billede well_r Nybegynder
20. august 2008 - 13:25 #5
det er selvfølgelig rigtigt..men det virker nu.. og gudskelov for det (js er ikke liiiiiiiige min stærke side)... både i FF og IE.. har endnu ikke testet øvrige browsere..
Avatar billede olebole Juniormester
24. august 2008 - 16:00 #6
<ole>

Man kan gøre mange ting - og personligt ville jeg normalt konstruere et objekt, hvori jeg instantierer et XMLHttpRequest objekt. Så er 'skidtet' pakket ind og kan ikke generes af andre requests. Det kræver dog, man er vandt til at OOP'e  ;o)

/mvh
</bole>
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

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