Подтвердить что ты не робот

Показать загрузку страницы Spinner on Ajax Call в jQuery Mobile

Я использую $.ajax(), чтобы заполнить список в мобильном веб-приложении. То, что я хотел бы сделать, - это показать, что при загрузке этого списка выполняется разворот мобильной загрузки jQuery, когда этот вызов выполняется и исчезает после заполнения списка. Текущая версия JQM использует $.mobile.showPageLoadingMsg() и $.mobile.hidePageLoadingMsg() для отображения и скрытия счетчика загрузки соответственно. Я не могу понять, где именно разместить эти утверждения, чтобы получить правильный результат. Кажется, что это должно быть довольно простой задачей, я просто не смог найти ничего об этом точном сценарии.

Здесь вызов ajax внутри функции pagecreate:

$('#main').live('pagecreate', function(event) {
        $.ajax({
            url: //url
            dataType: 'json',
            headers: //headers
            success: function(data) {
                for(i = 0; i < data.length; i++) {
                    $('#courses').append('<li>' + data[i].name + '<ul id="course' + data[i].id + '"></ul>' + '<span class="ui-li-count">' + data[i].evaluatedUserIds.length + '</span></li>');
                    $('#course' + data[i].id).listview();
                    for(j = 0; j < data[i].evaluatedUserIds.length; j++) {
                        $('#course' + data[i].id).append('<li><a href="">' + data[i].evaluatedUserIds[j] + '</a></li>');
                    }
                    $('#course' + data[i].id).listview('refresh');
                }
                $('#courses').listview('refresh');
            }
        });
    });
4b9b3361

Ответ 1

Несколько человек спросили об обходном пути, который я закончил, поэтому я решил поделиться этим. Это ничего особенно элегантного или сложного, но, похоже, это сработало. Я не использовал фреймворк с момента выпуска официального 1.0, так что это, возможно, было решено в обновлении. По существу, я поместил вызов $.mobile.showPageLoadingMsg() в функцию pageshow, но завернул его в предложение if, которое запускает только первый раз, когда отображается страница:

var mainloaded = false;

$('#main').live('pageshow', function(event) {   //Workaround to show page loading on initial page load
    if(!mainloaded) {
    $.mobile.showPageLoadingMsg();
    }
});

$('#main').live('pagecreate', function(event) { 
    $.ajax({
        url: //url
        dataType: //datatype,
        headers: //headers
        success: function(data) {
            //
            //...loading stuff
            //
            $.mobile.hidePageLoadingMsg();
            mainloaded = true;
        }
        //
        //...handle error, etc.
        //
    });
});

Ответ 2

Вы можете использовать события beforeSend и complete $.ajax для вызова $.mobile.showPageLoadingMsg и $.mobile.hidePageLoadingMsg. Будет выглядеть так:

$('#main').live('pagecreate', function(event) {
        $.ajax({
            beforeSend: function() { $.mobile.showPageLoadingMsg(); }, //Show spinner
            complete: function() { $.mobile.hidePageLoadingMsg() }, //Hide spinner
            url: //url
            dataType: 'json',
            headers: //headers
            success: function(data) {
                //...
            }
        });
    });

Ответ 3

Прежде чем JQM 1.2:

$(document).ajaxStart(function() {
    $.mobile.showPageLoadingMsg();
});

$(document).ajaxStop(function() {
    $.mobile.hidePageLoadingMsg();
});

Так как JQM 1.2:

$(document).ajaxStart(function() {
    $.mobile.loading('show');
});

$(document).ajaxStop(function() {
    $.mobile.loading('hide');
});

http://api.jquerymobile.com/page-loading/

Ответ 4

Это немного поздно... но вам нужно:

  • Вызов $.mobile.showPageLoadingMsg() перед вызовом AJAX.
  • Сделайте вызов AJAX. Вызов должен быть отправлен асинхронно (поместите async: true в свой вызов).
  • Добавьте $.mobile.hidePageLoadingMsg() в вашу success() функцию.

Ответ 5

$(document).ajaxSend(function() {
    $.mobile.loading( 'show');
});
$(document).ajaxComplete(function() {
    $.mobile.loading( 'hide');
});

Ответ 6

Вы должны сделать $. mobile.showPageLoadingMsg() непосредственно перед вызовом ajax и $. mobile.hidePageLoadingMsg() в блоке успеха (или сбоя), чтобы он уходит, как только результат возвращается.

Я никогда не использовал jQuery mobile, но он должен работать так же, как показывать/скрывать регулярное обратное изображение.

Ответ 7

Или самый простой способ - поместить его глобально как разделение беспокойства -

Поместите ниже код в представление мастера/макета

   <script type="text/javascript">

    $(document).bind('mobileinit', function () {
        //Loader settings
        $.mobile.loader.prototype.options.text = "Loading..";
        $.mobile.loader.prototype.options.textVisible = true;
        $.mobile.loader.prototype.options.theme = "b";
        $.mobile.loader.prototype.options.textonly = false; 
    }); 

    $(document).on({
        ajaxSend: function () { $.mobile.showPageLoadingMsg(); },
        ajaxStart: function () { $.mobile.showPageLoadingMsg(); },
        ajaxStop: function () { $.mobile.hidePageLoadingMsg(); },
        ajaxError: function () { $.mobile.hidePageLoadingMsg(); }
    });

</script> 

Изменить: используйте вместо этого, если вы нацеливаете последнюю версию JQM ( > 1.2):

  • .
  • $mobile.loading( 'шоу'); .
  • $mobile.loading( 'скрыть');

Ответ 8

Проблема здесь в том, что вызов $.ajax() происходит в потоке управления обработчика события (вызывающего).

Очень простой способ отделить запрос ajax от этого потока управления - позволить setTimeout() вызывать эту функцию для вас, например:

setTimeout(function(){$.ajax( ... )}, 1);

Затем вы можете использовать события "beforeSend" и "complete" $.ajax(), как указано выше, и быть уверенными, что ваш счетчик появляется.