javascript - Hur får jag min jQuery att inte köra <a href> förrän efter ett lyckat ajax-post?
Jag försöker uppdatera databasen och skicka användarens webbläsare till en annan sida med ett klick.
HTML ser ut så här:
<a id='updateLiveProgress' style='width:118px;' href='~link~'>Click here</a>
Javascripten ser ut så här:
$("#updateLiveProgress").live("click", function(e){
var ajaxlink = "~ajaxlink~"
$.post(ajaxlink, function(data, e){
return true;
});
});
När användaren klickar på länken ska databasen uppdateras via ajax-länken och sedan kommer sidan som returneras att bero på ajax-databasuppdateringarna. Problemet är att det verkar som om sidan laddas innan ajax har avslutat uppdateringen av databasen. Jag försöker skicka klickhändelsen vidare till ajax med e för att förhindra att länken körs tills efter att ajax-anropet är klart, men det verkar inte fungera.
Finns det ett bättre sätt för mig att uppnå detta?
Svar #1
Prova att göra detta:
$("#updateLiveProgress").live("click", function(e){
e.preventDefault();
var href = this.href;
var ajaxlink = "~ajaxlink~"
$.post(ajaxlink, function(data, e){
window.location = href;
});
return false;
});
Från och med jQuery 1.7 gör detta (använd .on istället för .live):
$("#updateLiveProgress").on("click", function(e){
e.preventDefault();
var href = this.href;
var ajaxlink = "~ajaxlink~"
$.post(ajaxlink, function(data, e){
window.location = href;
});
return false;
});
Svar #2
Detta är det inneboende beteendet hos Ajax, faktiskt är det vad A står för: asynkront. Ajax-anropet skickas, och klickfunktionen returnerar innan ajax-förfrågan har kommit tillbaka. Du har 2 alternativ:
Gör ajax-anropet synkront. Jag skulle inte rekommendera detta.
Följ länken manuellt när AJAX-anropet returnerar:
$("#updateLiveProgress").live("click", function(e){ var ajaxlink = "~ajaxlink~" $.post(ajaxlink, function(data, e){ window.location.href = ajaxlink; // or something similar }); return false; // this keeps the link from being followed });
