2013-08-28 78 views
0

我正在构建一个带有大量Ajax调用的Web应用程序,我正在使用它来将所有内容注入到我的Web应用程序中。显示ajax微调,隐藏页面渲染,直到所有ajax调用完成?

我希望能找到一种方法来隐藏页面,并显示了ajax微调,直到所有的Ajax调用完成...和/或整个应用程序被加载,然后显示该网站。

否则用户可以浏览的是A.可能不能完全正确地呈现或B.将是中期导航时,该网站刷新首页满载时的页面。

我碰到一个解决方案的胆量,但不知道如何实现。或者把两者结合起来... 学院项目从亲,但这些看起来前途无量那么远,

https://stackoverflow.com/a/14038050

$(document).ajaxStop(function() { 
     // $.active == 0 
    }); 

https://stackoverflow.com/a/12313138/2676129

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

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

如何可能我得到这个工作?我的Ajax调用跨越多个.js文件(应用程序的不同部分)

非常感谢您的帮助引用!

编辑:例如Ajax调用使用

$.ajax(
     { 
      url: "http://myurl", 
      type: 'get', 
      dataType: 'jsonp', 
      success: function(data) 
      { 
       if (data.result == 'success') 
       { 
        var previousPageID = ""; 
        var currentPageID = ""; 
        $.each(data.data, function(key, data)     //scans through each Lv1 Category, creates a button and page and links thems. 
        { 
         var divLabel = data.label; 
         var pageID = currentPageID + data.label.replace(/\s/g, ""); 
         $('#contentPage').append(generateButtons(pageID, divLabel));              //generates a normal button for a category from CMS and generates the relevant page to link to. 
         var previousPageID = currentPageID; 
         generateNextPage(data, previousPageID); 
        }); 
        $("#Page").trigger("create");            //once html is injected into home <div> applies jquery mobile styling and effects (enhance) 
       } 
      } 
     }); 

回答

5

只是想指出一个简单的解决方案,但尚未生效。 您将需要将此加载div附加到您的页面。

<div id="loading"></div> 

之后,我们确保当ajax调用分别开始和停止时,这个div将被显示或隐藏。

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

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

最后,添加以下的CSS,以确保在div将全屏显示像阻塞UI元素(这表明页面加载的东西的/不是微调)。

#loading { 
    width: 100%; 
    height: 100%; 
    position: fixed; 
    top: 0; 
    left: 0; 
    background-color: rgba(0,0,0,.5); 
    -webkit-transition: all .5s ease; 
    z-index: 1000; 
    display:none; 
} 

Demo JSFIDDLE here

+0

如果ajax没有通过jQuery触发,这个方法是否会起作用? –

+0

@FrozenFlame if你不想使用jQuery来替换确定ajax调用何时开始或结束的部分。你如何做ajax调用(xmlhttprequests)? – nmargaritis

2

一种方法是将显示您加载动画为初始&网页页面加载的一部分。

然后,等待你的优秀Ajax调用达到零,一旦出现这种情况,隐藏加载动画。

您的文档准备将类似于:

$(document).ready(function() { 
    $('#spinner').addClass('spin'); 

    function stopSpinner() { 
     $('#loading').addClass('hide'); 
     $('#loading').one('webkitTransitionEnd', function() { 
      $('#loading').hide(); 
     }); 
    } 

    $(document).ajaxStop(function() { 
     // $.active == 0 
     stopSpinner(); 
    }); 
}); 

您的标记将有这样的事情在体内最后一个元素:

<div id="loading"> 
    <div id="spinner"></div> 
</div> 

使用样式是这样的:

#loading { 
    position: absolute; 
    top: 0; 
    left: 0; 
    right: 0; 
    bottom: 0; 
    background-color: rgba(0,0,0,.5); 
    -webkit-transition: all .5s ease; 
    z-index: 1000; 
} 

#loading.hide { 
    opacity: 0; 
} 

#spinner { 
    position: absolute; 
    width: 100px; 
    height: 100px; 
    top: 50%; 
    left: 50%; 
    margin-top: -50px; 
    margin-left: -50px; 
    background-color: yellow; 
    -webkit-transition: all 1000s linear; 
} 

#spinner.spin { 
    -webkit-transform: rotate(100000deg); 
} 

的很长的过渡时间和大转动是否有来模拟一个永远的怡敏信。你也可以用CSS3动画,动画GIF或其他替代它来获得你想要的效果。

Demo fiddle(注:它只是使用的setTimeout伪造回调隐藏装载机)

+0

您好感谢回去我和服用时间。将它放入原样进行测试,按照小提琴显示“微调器”,但遗憾的是从未隐藏所有ajax完成 – alhimself

+0

我自己没有使用$ .ajaxStop,但是从文档中它应该可以工作。还有一个额外的说明:“如果在全局选项设置为false的情况下调用$ .ajax()或$ .ajaxSetup(),那么.ajaxStop()方法不会触发。”我不知道这是否适用于您的代码。 – dc5

+0

这里有一个[更新的小提琴](http://jsfiddle.net/Luj5m/3/),它与一个杰出的ajax调用一起工作。它将jsfiddle.net加载到结果div中。警报显示未完成请求的数量。 – dc5