Jak dzwonić.ajaxStart () na konkretnych wywołaniach ajax

Mam kilka wywołań ajax na dokumencie witryny, które wyświetlają lub ukrywają pasek postępu w zależności od stanu ajax

  $(document).ajaxStart(function(){ 
        $('#ajaxProgress').show(); 
    });
  $(document).ajaxStop(function(){ 
        $('#ajaxProgress').hide(); 
    });

Chciałbym zasadniczo overwirte te metody w innych częściach strony, gdzie wiele szybkich małych połączeń ajax są wykonane i nie trzeba pasek postępu pojawiały się i out. Próbuję je dołączyć lub wstawić do innych $.getJSON i $.połączenia ajax. Próbowałem ich łańcuchować, ale najwyraźniej nie jest to dobre.

$.getJSON().ajaxStart(function(){ 'kill preloader'});
Author: kevzettler, 2009-07-28

10 answers

2018 Uwaga: Ta odpowiedź jest przestarzała; możesz zaproponować edycję tej odpowiedzi, która będzie działać.

Możesz powiązać ajaxStart i ajaxStop używając niestandardowej przestrzeni nazw:

$(document).bind("ajaxStart.mine", function() {
    $('#ajaxProgress').show();
});

$(document).bind("ajaxStop.mine", function() {
    $('#ajaxProgress').hide();
});

Następnie, w innych częściach strony będziesz tymczasowo odpiąć je przed twój .wywołania json:

$(document).unbind(".mine");

Pomysł zaczerpnąłem z tutaj podczas poszukiwania odpowiedzi.

EDIT: nie miałem czasu go przetestować, niestety.

 34
Author: montrealist,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-10-05 15:13:14

Jeśli umieścisz to w swojej funkcji, która obsługuje akcję ajax, będzie ona wiązać się tylko wtedy, gdy jest to właściwe:

$('#yourDiv')
    .ajaxStart(function(){
        $("ResultsDiv").hide();
        $(this).show();
    })
    .ajaxStop(function(){
        $(this).hide();
        $(this).unbind("ajaxStart");
    });
 15
Author: Jason Rikard,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-16 02:36:47

W obiekcie options znajduje się atrybut .ajax() przyjmuje wywołanie global .

Jeśli ustawione na false , nie wywoła zdarzenia ajaxStart dla wywołania.

    $.ajax({
        url: "google.com",
        type: "GET",
        dataType: "json",
        cache: false,
        global: false, 
        success: function (data) {
 12
Author: Hasnat Safder,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-10 09:24:00

Ponadto, jeśli chcesz wyłączyć wywołania .ajaxStart() i .ajaxStop(), możesz ustawić opcję global na false w zapytaniach .ajax();)

Zobacz więcej tutaj: jak dzwonić .ajaxStart() na konkretnych wywołaniach ajax

 7
Author: GxiGloN,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:02:34

Użyj lokalnych zdarzeń Ajax

                success: function (jQxhr, errorCode, errorThrown) {
                    alert("Error : " + errorThrown);
                },
                beforeSend: function () {
                    $("#loading-image").show();
                },
                complete: function () {
                    $("#loading-image").hide();
                }
 5
Author: Ramya Muthukumar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-09 01:32:06

Niestety, ajaxStart event nie posiada żadnych dodatkowych informacji, których możesz użyć, aby zdecydować, czy chcesz pokazać animację, czy nie.

W każdym razie, mam jeden pomysł. W metodzie ajaxStart, dlaczego nie rozpocząć animacji po powiedzmy 200 milisekundach? Jeśli żądania ajax zostaną zakończone w ciągu 200 milisekund, nie zostanie wyświetlona Żadna animacja, w przeciwnym razie zostanie wyświetlona animacja. Kod może wyglądać mniej więcej tak:
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);
    }
 );
 3
Author: SolutionYogi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-28 01:46:12

Użyj funkcji beforeSend lub complete callback w wywołaniu ajax w ten sposób..... Przykład na żywo jest tutaj https://stackoverflow.com/a/34940340/5361795

Source ShoutingCode

 2
Author: Zigri2612,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:54:07

Mam rozwiązanie. Ustawiłem globalną zmienną js o nazwie showloader (domyślnie ustawioną jako false). W każdej z funkcji, które chcesz pokazać loader wystarczy ustawić go na true przed wykonaniem połączenia ajax.

function doAjaxThing()
{
    showloader=true;
    $.ajax({yaddayadda});
}

Wtedy mam następujące w sekcji głowy;

$(document).ajaxStart(function()
{
    if (showloader)
    {
        $('.loadingholder').fadeIn(200);
    }
});    

$(document).ajaxComplete(function() 
{
    $('.loadingholder').fadeOut(200);
    showloader=false;
});
 1
Author: Ollie Brooke,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-21 04:14:25

Użyj ajaxSend i ajaxComplete, jeśli chcesz interspektować żądanie przed podjęciem decyzji, co zrobić. Zobacz moją odpowiedź tutaj: https://stackoverflow.com/a/15763341/117268

 0
Author: Emil Stenström,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:46:34
<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.");
});
Po prostu przejrzyj ten przykład, masz jakiś pomysł.Gdy użytkownik kliknie element z klasą Local i zostanie wysłane żądanie Ajax, zostanie wyświetlony komunikat dziennika.
 0
Author: Praveen04,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-11 11:58:04