Avatar billede shjorth Nybegynder
19. november 2011 - 16:59 Der er 3 kommentarer og
1 løsning

Abort af ajax request

Hejsa.

Jeg har fået foræret flg kode:
xmlHttpReqObj.abort();

Det jeg forsøger at gøre er at standse en aktiv ajax request med en onclick event.
Spørgsmålet er hvordan jeg får ovenstående til at fungere.

Den Ajax kode jeg bruger ser således ud:

function Ajax(afile,adiv,arun,loader) {
var timer = null;
timer=setTimeout(function() { toggle('stuckDiv',1); update_content('stuckDiv','<a href=\'java script:void(0);\' onClick=\'Ajax("'+afile+'","'+adiv+'","'+arun+'");\'>Stuck loading ?</a>'); },3000);
var xmlHttp;

if(loader==null) {
gi("loaderdiv").style.display='inline';
}
try { xmlHttp=new XMLHttpRequest(); }
catch (e) { 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) {
    gi("loaderdiv").style.display='none';
    toggle('stuckDiv',0);
    clearTimeout(timer);
    $(gi(adiv)).fadeIn(100);
    gi(adiv).innerHTML=xmlHttp.responseText;
    if(gi(arun)!=null) {
        eval(gi(arun).innerHTML.replace(/&gt;/g,">").replace(/&lt;/g,"<").replace(/&amp;/g,"&"));
    }
    } }
    xmlHttp.open("GET",afile+"&dummy="+ new Date().getTime(),true);
    xmlHttp.send(null);
}

Onclick eventet skal altså være på denne linje:

update_content('stuckDiv','<a href=\'java script:void(0);\' onClick=\'Ajax("'+afile+'","'+adiv+'","'+arun+'");\'>Stuck loading ?</a>'); },3000);

Det kan måske være lidt kryptisk, men ellers må i meget gerne spørge, så skal jeg se om jeg kan forklare det lidt anderledes :)
Avatar billede olebole Juniormester
19. november 2011 - 17:44 #1
<ole>

Det kan du ikke rigtig, da du isolerer dit XHR-objekt bag en closure (funktionen 'Ajax'). Så kan du jo ikke tilgå objektet udenfor funktionen.

Umiddelbart ville jeg nok skrive hele koden om - så du også undgår at bruge GET, eval og at indsætte serverformaterede data med innerHTML.

/mvh
</bole>
Avatar billede shjorth Nybegynder
21. november 2011 - 19:28 #2
olebole -> Hvorfor omskrive kode..

Jeg mener hvad er det dårlige ved denne form for kode kontra den (ukendte) metode du nævner ?
Avatar billede olebole Juniormester
21. november 2011 - 20:01 #3
Undskyld, men er dit problem ikke, at du ikke kan kalde abort på XHR-objektet? Det kan du ikke, fordi du har 'spærret det inde' bag en closure. Det alene er vel et rigtig godt argument for en omskrivning.

Hvis du omskriver scriptet, så XHR-objektet kommer til at ligge som en global variabel, kan du til gengæld kun foretage én query ad gangen - hvilket betyder, du må holde ekstra styr på, hvad brugeren kan og ikke kan.

Der er intet 'ukendt' ved Ajax ... sæt dig ind i, hvad det er, så du forstår, hvorfor den kode, du har gang i, er noget skidt.

Dog kan jeg sige, at du bl.a. løber ind i cacheing problemer, hvis du bruger GET. Desuden bruger HTML-formatering på serveren 3-10 gange flere serverressourcer end XML- eller JSON-formatering. Funktionen eval er JavaScripts langsomst afviklende og ekstremt farlig i forbindelse med hacking forsøg - og endelig skal man have rigtig godt styr på JavaScript for at være sikker på, at innerHTML ikke skaber seriøse problemer.

Der er med andre ord ikke andet end rigtig gode grunde til at vælge en anden opbygning af koden  =)
Avatar billede shjorth Nybegynder
10. oktober 2012 - 20:01 #4
Du samler ikke på point, så jeg lukker :)
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