2016-08-05 83 views
1

我试图在加载数据表时显示等待的gif。我只是在进入我的$(element).each()循环之前调用$(element).show(),该循环显示使用数据表的所有子网格(即DisplayInnerTable())。在调用JQuery之前,不会显示等待的gif。每个

看来我已经将问题缩小到.each()方法。如果我删除.each()里面的所有代码,那么wait gif仍然不会显示,并且是的,我还删除了.hide()。如果我在.each()之前放置了一个中断点,则会显示wait gif。似乎是一个时间问题,如.each()正在发生如此之快wait.gifdiv没有时间呈现。尽管如此,为什么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 =“装载机-WAIT - ani“? – RIanGillis

+0

你有没有试过在'.show()'上使用回调函数? –

+0

您在相同的代码执行例程中显示并隐藏加载gif。中间不会出现渲染。这就是为什么它不会出现。 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你会阻止浏览器,直到所有请求的反应变量已经sended。直到您的代码到达您的单击回调结束时,浏览器才会执行任何呈现。

因此,你需要请求数据异步和所有数据加载后,你必须隐藏你的加载gif。我假设你使用jQuery的ajax方法,所以你可以使用返回的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:真的,果然显示了等待的gif,但也如预期的那样,网格不会呈现。 – Robert