Avatar billede shjorth Nybegynder
19. oktober 2011 - 18:38 Der er 11 kommentarer og
1 løsning

Undersøg om AJAX er stoppet med JS

Hejsa

Mange forskellige sider benytter sig af ajax til at indlæse sider osv.
Jeg har ofte set at mange af dem har en smart funktion der kommer frem 2 til 3 sekunder efter et tryk på et link, hvor der eksempelvis står "Page stopped? Try refreshing" og så et link hvor man kan forsøge at loade siden igen.

Er der nogen der ved hvordan dettte gøres ?

Det er noget med at sende en div afsted efter 2 sek, med samme link som det der blev trykket på, og så ellers fjerne den hvis siden bliver loaded inden linket blev trykket.

På forhånd tak
Avatar billede olebole Juniormester
19. oktober 2011 - 18:47 #1
<ole>

Der er forskellige implementeringer af XHR objektet. Nogle har events som ontimeout, onerror og onabort - andre har ikke.

Du kan selv lave en timer, som - hvis den løber ud, inden responsen er modtaget - angiver timeout for kaldet

/mvh
</bole>
Avatar billede jokkejensen Novice
19. oktober 2011 - 19:04 #2
jeg bruger jquery, så ved ikke om det overhovedet har nogen interesse, men bruger du et af de mere fornuftige javascipt biblioteker, får du sådanne foræret:

Globalt kan du så:
http://api.jquery.com/category/ajax/global-ajax-event-handlers/

Der bliver du fordret med parametre indeholdende alt det information du skulle have brug for, altså

$.ajaxError(function(e, jqxhr, settings, exception)
8
giver dig alle muligheder for at dykke ned og behandle fejl og timeouts, ex helt ned på hvert eneste ajax kald:

$.ajax({
statusCode: {
403: function() {
//Denne havde brugeren ikke rettigheder til
},
404: function() {
//Denne findes ikke
} //osv
}
});


Men umiddelbart er der et eksempel her:
http://api.jquery.com/ajaxError/#entry-examples , der skriver de til et element med id="msg" hver gang der sker en fejl.

Jeg kender ikke til nogen hjemmesider der efter 2 sekunder viser en besked om at der er fejl prøv at reloade. Det virker for mig tåbeligt. Fang fejl og informer brugeren herom, ik at det går langsomt.

Men ellers bruger du bare

.ajaxStart() til at starte din timer
og
.ajaxEnd() til at stoppe

/J
Avatar billede jokkejensen Novice
19. oktober 2011 - 19:05 #3
fik vist vrøvlet lidt der :/
Avatar billede shjorth Nybegynder
19. oktober 2011 - 19:25 #4
Hej, tak for svar.

Jeg fik lavet mig en lidt anden løsning her, men mangler noget du måske kan hjælpe med.

I AJAX koden indsatte jeg:

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

Som altså kommer frem efter x sekunder.

MEN, hvis "Stuck loading" så klikkes, så er det jo lidt essentielt jeg stopper det igangværende ajax kald inden det nye starter.
Kender du til en funktion jeg kan bruge der ?

AJAX koden ser således ud:

function Ajax(afile,adiv,arun,loader) {

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

var xmlHttp;
$('#FB_HiddenContainer iframe.FB_RECEIVER_DOM').remove();

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';
    $(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);
}

På forhånd tak
Avatar billede jokkejensen Novice
19. oktober 2011 - 20:05 #5
slet ikke testet, men forstår ikke helt alt dit kode, er det ikke mere simplere at samle det sådan her:

function Ajax(afile, adiv, arun, loader) {
    $('#FB_HiddenContainer iframe.FB_RECEIVER_DOM').remove();
    $.ajax({
        url: afile + "&dummy=" + new Date().getTime(),
        success: function (data) {
            $(adiv).fadeIn(100);
            $(adiv).html(data);
        }, error: function () {
            update_content('stuckDiv', '<a href=\'java script:void(0);\' onClick=\'Ajax("' + afile + '","' + adiv + '","' + arun + '");\'>Stuck loading ?</a>');
        }
    });

}

Det er slet ikke testet, men det er da i det mindste til at arbejde videre på.

Formoder at afile er url, adiv er det element det skal hentes til, arun fatter jeg ikke - tjek dit output så det er korrekt escaped fra server.
og gi = document.getElementById ?

du kan tilføje:

beforesend: function(){

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

Hvis du kommer til at savne den farer frem hvert halve sekund :)

/J
Avatar billede jokkejensen Novice
19. oktober 2011 - 20:07 #6
.. beforeSend :
Avatar billede jokkejensen Novice
19. oktober 2011 - 20:14 #7
og den her:

statusCode: {
            403: function () {
                for (i = 0; i < 100; i++)
                    alert("nænænænænæ det må du ikke !!")
            },
            404: function () {
                alert("Obbs, siden findes ikke, gå til forside ?")
            },
            408: function () {
                alert("Der er sku noget galt med endten dit eller vores kabel :/ . der er sket en REEL timeout og íkke bare gået ½ sekund før du fik loaded de billeder og andet")
            },
            500: function () {
                alert("Eeek mit kode fejlede, jeg gemmer lige fejlen i en database og tjekker fejlen ved lejlighed, gå til forside el prøv igen ?")
            }
        }
Avatar billede shjorth Nybegynder
19. oktober 2011 - 20:21 #8
Hej igen.

Ja gi = document.getElementById :)

arun er js. Måden jeg kører JS på en ajax loaded side er ved at smide den med i Ajax koden, og kalde den med eval(). (Sikkert drøn forkert, men ved ikke lige hvordan jeg ellers skulle gøre det)
Avatar billede jokkejensen Novice
19. oktober 2011 - 20:50 #9
jQuery.getScript( "sti" [, success(data, textStatus)] )
Avatar billede heinzdmx Nybegynder
19. oktober 2011 - 21:01 #10
Men at et XMLHttpRequest object (som jQuery ajax er et interface for) indeholde en abort() funktion der annulere din request.
Avatar billede shjorth Nybegynder
19. oktober 2011 - 21:25 #11
Nu nævner du abort.

Men hvorledes kan jeg "abort" requesten når det ikke er en variabel ?
Avatar billede heinzdmx Nybegynder
19. oktober 2011 - 21:53 #12
Du opretter referencen xmlHttp, denne kan du kalde abort på.

I jQuery laver du bare din oprettelse af ajax til et objekt.


xmlobject = $.ajax({
....
        }
    });
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