एक jQuery AJAX कॉल के लिए एक लोडिंग संकेतक लागू करें


88

मेरे पास एक बूटस्ट्रैप मोडल है जो एक लिंक से लॉन्च किया गया है। लगभग 3 सेकंड के लिए यह सिर्फ खाली बैठता है, जबकि AJAX क्वेरी डेटाबेस से डेटा प्राप्त करता है। मैं किसी प्रकार के लोडिंग इंडिकेटर को कैसे लागू कर सकता हूं? क्या ट्विटर बूटस्ट्रैप डिफ़ॉल्ट रूप से यह कार्यक्षमता प्रदान करता है?

EDIT: मोडल के लिए JS कोड

<script type="text/javascript">
  $('#myModal').modal('hide');
  $('div.divBox a').click(function(){
    var vendor = $(this).text();
    $('#myModal').off('show');
    $('#myModal').on('show', function(){             
      $.ajax({
        type: "GET",
        url: "ip.php",
        data: "id=" + vendor,
        success: function(html){
          $("#modal-body").html(html);
          $(".modal-header h3").html(vendor);
          $('.countstable1').dataTable({
            "sDom": "T<'row-fluid'<'span6'l><'span6'f>r>t<'row-fluid'<'span6'i><'span6'p>>",
            "sPaginationType": "bootstrap",
            "oLanguage": {
              "sLengthMenu": "_MENU_ records per page"
            },
            "aaSorting":[[0, "desc"]],
            "iDisplayLength": 10,
            "oTableTools": {
              "sSwfPath": "swf/copy_csv_xls_pdf.swf",
              "aButtons": ["csv", "pdf"]
            }
          });
        }
      });
    });
  });
  $('#myModal').on('hide', function () {
    $("#modal-body").empty();
  });
</script>

जवाबों:


40

मैं अनुमान लगा रहा हूं कि आप मॉडल लोड करने के लिए jQuery.get या कुछ अन्य jQuery के ajax फ़ंक्शन का उपयोग कर रहे हैं। आप अजाक्स कॉल से पहले संकेतक दिखा सकते हैं, और अजाक्स पूरा होने पर इसे छिपा सकते हैं। कुछ इस तरह

$('#indicator').show();
$('#someModal').get(anUrl, someData, function() { $('#indicator').hide(); });

164

मैंने इस समस्या को इस उदाहरण के बाद हल किया:

यह उदाहरण jQuery जावास्क्रिप्ट लाइब्रेरी का उपयोग करता है।

सबसे पहले, AjaxLoad साइट का उपयोग करके एक Ajax आइकन बनाएं ।
फिर अपने HTML में निम्न जोड़ें:

<img src="/images/loading.gif" id="loading-indicator" style="display:none" />

और आपकी सीएसएस फ़ाइल के लिए निम्नलिखित:

#loading-indicator {
  position: absolute;
  left: 10px;
  top: 10px;
}

अंत में, आपको jax प्रदान करने वाली अजाक्स घटनाओं में हुक करने की आवश्यकता है; जब अजाक्स अनुरोध शुरू होता है, और जब यह समाप्त होता है, तो एक घटना के लिए एक हैंडलर:

$(document).ajaxSend(function(event, request, settings) {
    $('#loading-indicator').show();
});

$(document).ajaxComplete(function(event, request, settings) {
    $('#loading-indicator').hide();
});

यह समाधान निम्नलिखित लिंक से है। अजाक्स अनुरोध प्रसंस्करण के दौरान एक एनिमेटेड आइकन कैसे प्रदर्शित करें


+1 "केवल एक बार करें" हुकिंग तंत्र के लिए। लेकिन एक निश्चित लोडिंग इंडिकेटर उन मॉडल्स के लिए बहुत अच्छा नहीं है, जिनमें आमतौर पर एक ओवरले होता है जो लोडिंग इंडिकेटर को आंशिक रूप से छिपा देगा ... लोडिंग इंडिकेटर को उस स्थिति में मोडल के अंदर रखना बेहतर होगा, जैसे कि टाइटल बार में। या हो सकता है कि संकेतक में एक उच्च जेड-इंडेक्स जोड़ दें ताकि यह ओवरले के ऊपर दिखाई दे?
पियरे हेनरी

3
अरे, सब ... इस उत्तर पर आधारित एक डेमो देखें ।
पॉल वर्गास

बस उन लिपियों को रखना याद रखें जो JQuery स्क्रिप्ट के संदर्भ में हैं। पेज के अंदर प्लेसमेंट के रिवर्स ऑर्डर की वजह से मैं सिर्फ एक घंटा बिताता हूं।
ग्रेग जेड।

ऐसा लगता है कि ajaxStart()और ajaxStop()@Jaristi जवाब के अनुसार एक बेहतर समाधान होगा क्योंकि ये आग केवल एक बार AJAX बैच के अनुसार: stackoverflow.com/questions/3735877/…
SharpC

30

JQuery का उपयोग करके एक वैश्विक कॉन्फ़िगरेशन है। यह कोड प्रत्येक वैश्विक एजैक्स अनुरोध पर चलता है।

<div id='ajax_loader' style="position: fixed; left: 50%; top: 50%; display: none;">
    <img src="themes/img/ajax-loader.gif"></img>
</div>

<script type="text/javascript">
    jQuery(function ($){
        $(document).ajaxStop(function(){
            $("#ajax_loader").hide();
         });
         $(document).ajaxStart(function(){
             $("#ajax_loader").show();
         });    
    });    
</script>

यहाँ एक डेमो है: http://jsfiddle.net/sd01fdcm/


1
यह बहुत अच्छी तरह से काम करता है लेकिन उन साइटों के लिए एक जेड-इंडेक्स सीएसएस जोड़ना नहीं भूलता है जो मोडल का उपयोग करते हैं।
डेइस विसेंटिन

1
इसके पास @leansy उत्तर की तुलना में अधिक वोट होने चाहिए क्योंकि यह सही ढंग से उपयोग करता है .ajaxStart()और ajaxStop()जो AJAX बैच के अनुसार एक बार फायर करता है : stackoverflow.com/questions/3735877/…
शार्पसी

14

एक लोडिंग इंडिकेटर बस एक एनिमेटेड इमेज (.gif) है जिसे तब तक प्रदर्शित किया जाता है जब तक कि AJAX अनुरोध पर पूरा होने वाला इवेंट नहीं कहा जाता है। http://ajaxload.info/ लोडिंग छवियों को उत्पन्न करने के लिए कई विकल्प प्रदान करता है जिन्हें आप अपने मॉडल्स पर ओवरले कर सकते हैं। मेरे ज्ञान के लिए, बूटस्ट्रैप अंतर्निहित कार्यक्षमता प्रदान नहीं करता है।


6

इस तरह से मुझे इसे लोड करने वाली दूरस्थ सामग्री के साथ काम करना पड़ा, जिसे ताज़ा करना होगा:

$(document).ready(function () {
    var loadingContent = '<div class="modal-header"><h1>Processing...</h1></div><div class="modal-body"><div class="progress progress-striped active"><div class="bar" style="width: 100%;"></div></div></div>';

    // This is need so the content gets replaced correctly.
    $("#myModal").on("show.bs.modal", function (e) {
        $(this).find(".modal-content").html(loadingContent);        
        var link = $(e.relatedTarget);
        $(this).find(".modal-content").load(link.attr("href"));
    });    

    $("#myModal2").on("hide.bs.modal", function (e) {
        $(this).removeData('bs.modal');
    });
});

मूल रूप से, लोडिंग संदेश के साथ लोड करते समय बस मोडल सामग्री को बदलें। एक बार लोडिंग समाप्त होने के बाद सामग्री को बदल दिया जाएगा।


3

इस तरह से मुझे एक ग्लिफ़िकॉन द्वारा लोडिंग संकेतक का एहसास हुआ:

<!DOCTYPE html>
<html>

<head>
    <title>Demo</title>

    <link rel="stylesheet" href="https://ajax.aspnetcdn.com/ajax/bootstrap/3.3.6/css/bootstrap.min.css">
    <script src="https://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.12.4.min.js"></script>
    <script src="https://ajax.aspnetcdn.com/ajax/bootstrap/3.3.6/bootstrap.min.js"></script>

    <style>
        .gly-ani {
          animation: ani 2s infinite linear;
        }
        @keyframes ani {
          0% {
            transform: rotate(0deg);
          }
          100% {
            transform: rotate(359deg);
          }
        }
    </style>  
</head>

<body>
<div class="container">

    <span class="glyphicon glyphicon-refresh gly-ani" style="font-size:40px;"></span>

</div>
</body>

</html>
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.