2016-08-05 3 views
1

Я пытаюсь получить gif gg для отображения, пока мои данные загружаются. Я просто звоню $(element).show() непосредственно перед входом в мой цикл $(element).each(), который отображает все дочерние сетки (то есть DisplayInnerTable()) с использованием данных.Wait gif не будет отображаться непосредственно перед вызовом JQuery .each

Кажется, я сузил проблему до метода .each(). Если я удалю весь код внутри .each(), gid wait пока не отобразится, и да, я также удалю .hide(). Если я установил точку останова непосредственно перед .each(), отобразится экран gif ожидания. Кажется, это проблема с синхронизацией, например, .each() происходит так быстро, что wait.gif внутри div не имеет времени на визуализацию. И хотя на этой ноте, почему Javascript-поток предотвращал манипулирование элементами html?

Я нашел похожие статьи, но никто из них не ответил на эту конкретную проблему. Большинство других статей рекомендуют использовать setTimeout(). хорошо, я пробовал это всеми возможными способами, не повезло. Любая помощь, подсказки или подсказки будут высоко оценены.

Вот мои фрагменты кода:

$(document).ready(function() 
    { 
    $('#expand-all').on('click', function() { 
     $("#loader-wait-ani").show(); 
     ExpandAllChildGrids(); 
    }); 

    function ExpandAllChildGrids() 
    { 
     var tr; 
     $('#result-table tbody tr').each(function (value, index) { 
      tr = $(this).closest('tr'); 
      var row = outerTable.row(tr); 
      userId = row.cell(tr, 1).data(); 

     DisplayInnerTable(userId, row, tr); 
     }); 
     $('#expand-all-img').attr('src', '/Images/minus.gif'); 
     $("#loader-wait-ani").hide(); 
    } 
}); 

Вот мой HTML:

<div style="width:100%; margin: 0 auto; text-align:center;"> 
     <div id="loader-wait-ani" class="modal" style="display: none; z-index: 300;"> 
      <img src="~/Images/waitbar.gif" alt="Pleae Wait..." width="250" height="20" /> 
     </div> 
    </div> 
+0

У вас есть несколько ID = "Загрузчик-Подожди ani "? – RIanGillis

+0

Вы пытались использовать функцию обратного вызова на '.show()'? –

+0

Вы показываете и скрываете gid загрузки в той же самой процедуре выполнения кода. Между ними не будет рендеринга. Вот почему он не появится. Что делает функция DisplayInnerTable внутри? Есть ли какой-нибудь асинхронный код внутри 'DisplayInnerTable', который заполняет ячейки? –

ответ

1

Попробуйте это. Это обратный вызов на show() и обратный вызов на DisplayInnerTable()

$(document).ready(function() 
    { 
    $('#expand-all').on('click', function() { 
     $("#loader-wait-ani").show("fast", function(){ 
      ExpandAllChildGrids(); 
     }); 
    }); 

    function ExpandAllChildGrids() 
    { 
     var tr; 
     callDisplayInner(hideLoader); 
     $('#expand-all-img').attr('src', '/Images/minus.gif'); 

    } 
}); 

function hideLoader(){ 
     $("#loader-wait-ani").hide(); 
} 

function callDisplayInner(hideLoader){ 
     $('#result-table tbody tr').each(function (value, index) { 
      tr = $(this).closest('tr'); 
      var row = outerTable.row(tr); 
      userId = row.cell(tr, 1).data(); 

     DisplayInnerTable(userId, row, tr); 
     }); 
     hideLoader(); 
} 
+0

Это скроет загрузчик gif, как только закончится первый запрос. Так что это не лучшее решение, если один запрос занимает гораздо больше времени, чем другие. –

+0

@ t.niese Да, у меня было это с неправильной функцией. обновлено до того, что я думаю, будет работать? –

+1

Возможно, это может сработать, если запросы не являются асинхронными, но вы должны предположить, что окно браузера полностью зависает, останавливая все, включая анимацию gif. В любом случае, если время запроса требует индикатора загрузки, тогда запрос синхронизации является действительно плохим. Кроме того, 'async: false' устарел после jQuery 1.8 и не должен использоваться. –

1

Использование async: false в каждом цикле вы будете блокировать браузер до тех пор, Reponses для всех запросов не было отослано. Браузер не будет делать рендеринга, пока ваш код не достигнет конца вашего обратного вызова по клику.

С учетом этого вам нужно будет запросить данные async и после того, как все данные будут загружены, вам нужно скрыть свой загрузочный gif. Я предполагаю, что вы используете метод ajax для jQuery, чтобы вы могли использовать возвращаемый Defere для отслеживания ваших запросов.

Некоторые вещи так:

function DisplayInnerTable(userId, row, tr, callback) { 
    //return the Defered object of the jQuery request 
    return $.ajax('/request/to/url'); 
} 


$(document).ready(function() { 
    $('#expand-all').on('click', function() { 
    $("#loader-wait-ani").show(); 
    ExpandAllChildGrids(); 
    }); 


    function ExpandAllChildGrids() { 
    var tr; 
    var allRequests = []; 
    $('#result-table tbody tr').each(function(value, index) { 
     tr = $(this).closest('tr'); 
     var row = outerTable.row(tr); 
     userId = row.cell(tr, 1).data(); 

     //collect all Deferes in an array 
     allRequests.push(DisplayInnerTable(userId, row, tr)); 
    }); 


    $.when.apply($, allRequests) 
     .then(function() { 
     // will be executed when all requests are finished 
     $('#expand-all-img').attr('src', '/Images/minus.gif'); 
     $("#loader-wait-ani").hide(); 
     }) 
    } 
}); 

Вот некоторые связанные информация:

+0

Ваше решение, безусловно, похоже на правильный путь, но, к сожалению, использование Datatables, как я его разработал, сетки не будут отображаться, если у меня есть async: true - в противном случае ваше решение будет работать. Я установил async: true и, конечно, отобразился gif wait, но также, как и ожидалось, сетки не будут отображаться. – Robert

Смежные вопросы