Comment appeler.ajaxStart () sur des appels ajax spécifiques
j'ai quelques appels ajax sur le document d'un site qui affiche ou Cache une barre de progression en fonction du statut ajax
$(document).ajaxStart(function(){
$('#ajaxProgress').show();
});
$(document).ajaxStop(function(){
$('#ajaxProgress').hide();
});
je voudrais fondamentalement overwirte ces méthodes sur d'autres parties du site où beaucoup de petits appels ajax rapides sont faits et n'ont pas besoin de la barre de progrès popping in et out. J'essaie de les attacher ou de les insérer dans d'autres $.getJSON et $.les appels ajax. J'ai essayé de chaînage, mais apparemment ce n'est pas bon.
$.getJSON().ajaxStart(function(){ 'kill preloader'});
10 réponses
2018 REMARQUE: Cette réponse est obsolète; n'hésitez pas à proposer une modification de cette réponse qui va travailler.
vous pouvez lier ajaxStart et ajaxStop en utilisant l'espace de noms personnalisé:
$(document).bind("ajaxStart.mine", function() {
$('#ajaxProgress').show();
});
$(document).bind("ajaxStop.mine", function() {
$('#ajaxProgress').hide();
});
Puis, dans d'autres parties du site, vous serez temporairement déliaison avant votre .json appelle:
$(document).unbind(".mine");
a Eu l'idée de ici lors de la recherche pour une réponse.
EDIT: Je n'ai pas eu le temps de le tester, hélas.
si vous mettez ceci dans votre fonction qui gère une action ajax, il ne se liera que si nécessaire:
$('#yourDiv')
.ajaxStart(function(){
$("ResultsDiv").hide();
$(this).show();
})
.ajaxStop(function(){
$(this).hide();
$(this).unbind("ajaxStart");
});
il y a un attribut dans l'objet options .ajax() prend appelé global .
Si false , il ne sera pas déclencher le ajaxStart événement de l'appel.
$.ajax({
url: "google.com",
type: "GET",
dataType: "json",
cache: false,
global: false,
success: function (data) {
en outre, si vous voulez désactiver appels à .ajaxStart()
et .ajaxStop()
, vous pouvez définir global
option à false
dans vos .ajax()
requêtes ;)
voir plus ici: comment téléphoner .ajaxStart () sur des appels spécifiques ajax
utiliser des événements Ajax à portée locale
success: function (jQxhr, errorCode, errorThrown) {
alert("Error : " + errorThrown);
},
beforeSend: function () {
$("#loading-image").show();
},
complete: function () {
$("#loading-image").hide();
}
malheureusement, l'événement ajaxStart n'a pas d'informations supplémentaires que vous pouvez utiliser pour décider de montrer l'animation ou non.
en tout cas, j'ai une idée. Dans votre méthode ajaxStart, pourquoi ne pas démarrer l'animation après 200 millisecondes? Si les requêtes ajax sont complètes en 200 millisecondes, vous ne montrez aucune animation, sinon vous montrez l'animation. Le Code peut ressembler à quelque chose comme:
var animationController = function animationController()
{
var timeout = null;
var delayBy = 200; //Number of milliseconds to wait before ajax animation starts.
var pub = {};
var actualAnimationStart = function actualAnimationStart()
{
$('#ajaxProgress').show();
};
var actualAnimationStop = function actualAnimationStop()
{
$('#ajaxProgress').hide();
};
pub.startAnimation = function animationController$startAnimation()
{
timeout = setTimeout(actualAnimationStart, delayBy);
};
pub.stopAnimation = function animationController$stopAnimation()
{
//If ajax call finishes before the timeout occurs, we wouldn't have
//shown any animation.
clearTimeout(timeout);
actualAnimationStop();
}
return pub;
}();
$(document).ready(
function()
{
$(document).ajaxStart(animationController.startAnimation);
$(document).ajaxStop(animationController.stopAnimation);
}
);
utilisez les fonctions beforeSend ou complete callback dans les appels ajax comme ceci..... L'exemple en direct est ici https://stackoverflow.com/a/34940340/5361795
Source ShoutingCode
j'ai une solution. J'ai défini une variable js globale appelée showloader (définie comme false par défaut). Dans n'importe laquelle des fonctions que vous voulez montrer le chargeur vient de le régler à true avant de faire l'appel ajax.
function doAjaxThing()
{
showloader=true;
$.ajax({yaddayadda});
}
alors j'ai ce qui suit dans ma section de tête;
$(document).ajaxStart(function()
{
if (showloader)
{
$('.loadingholder').fadeIn(200);
}
});
$(document).ajaxComplete(function()
{
$('.loadingholder').fadeOut(200);
showloader=false;
});
utilisez ajaxSend et ajaxComplete si vous voulez interspecter la requête avant de décider quoi faire. Voir ma réponse ici: https://stackoverflow.com/a/15763341/117268
<div class="Local">Trigger</div>
<div class="result"></div>
<div class="log"></div>
$(document).ajaxStart(function() {
$( "log" )text( "Trigger Fire successfully." );
});
$( ".local" ).click(function() {
$( ".result" ).load("c:/refresh.html.");
});
il suffit de passer par cet exemple vous obtenez une idée.Lorsque l'utilisateur clique sur l'élément avec class Local et que la requête Ajax est envoyée, le message de log s'affiche.