Gli utilizzatori di jQuery avranno sicuramente notato l’impossibilità di effettuare chiamate ajax nel metodo unload della pagina. O meglio, su firefox questa cosa è possibile mentre sui browser webkit, come safari e chrome, non lo è a causa di un comportamento di webkit che chiude prima la pagina e poi esegue le chiamate ajax.
Faccio un esempio prima di procedere. Mettiamo di voler effettuare un lock di un semaforo all’ingresso di una pagina e voler poi fare l’unlock all’uscita della pagina. Si potrebbe pensare di scrivere qualcosa del genere:
$(window).bind( load ,
function(){
$.get("PATH_SITE/setLock/");
});
$(window).bind( unload ,
function(){
$.get("PATH_SITE/setUnlock/");
});
Tutto questo su Firefox funzionerebbe senza problemi. Su safari e chrome no. Come detto prima il problema sta nel fatto che la chiamata asingrona di unlock non avrebbe tempo di essere eseguita perché la pagina è già stata abbandonata nel momento dell’invocazione del metodo unload.
Il problema, a quanto pare, è ben noto e in rete se ne parla molto (qui su jquery, qui su stackoverflow) senza soluzione.
La soluzione è questa:
$(window).bind( load ,
function(){
$.ajax({
type: "GET",
url: "PATH_SITE/setLock/",
dataType: "html",
async: false,
});
}
);
$(window).bind( unload ,
function(){
$.ajax({
type: "GET",
url: "PATH_SITE/unsetLock/",
dataType: "html",
async: false,
});
}
);
Anche in questo caso si tratta di due chiamate GET invocate sugli stessi metodi “load” e “unload” con la differenza che utilizzando il metodo $.ajax di jQuery si ha la possibilità di specificare ulteriori parametri. Il parametro che qui ci interessa è:
async: false
In questo modo si disattiva la chiamata asincrona e il browser non ricaricherà la pagina prima di aver completato la chiamata ajax
Ora il vostro script dovrebbe funzionare anche su Safari e Chrome.
Popularity: unranked [?]






