2013-03-02 74 views
0

我想使用AJAX和PHP多次更新浏览器结果。使ajax调用倍数来更新最终用户的结果

这里的代码将调用一个getDest.php文件来检索所有将被追加到一个名为results的div ID的html文件,并且大约有21个城市。我想逐一展示每个城市,而不是一次展示所有城市。

我已经尝试了许多不同的方法,任何帮助表示赞赏。

<script> 
function hideContainer() { 
    jQuery('.city_container').hide(); 
}; 
function showContainer() { 
    jQuery('.citywrapper').hover(function() { 
    jQuery(this).find('.city_container').show(); 
    }, 
    function() { 
    jQuery('.city_container').hide(); 
    }); 
}; 
</script> 

<script> 
$.ajax({ 
    type: "GET", 
    url: "getDest.php" 
}).done(function(html) { 
    $("#results").append(html); 
    hideContainer(); 
    showContainer(); 
}); 
</script> 

getDest.php

<div class="citywrapper">city1 <div class="city_container">descript1</div></div> 
<div class="citywrapper">city2 <div class="city_container">descript2</div></div> 
<div class="citywrapper">city3 <div class="city_container">descript3</div></div> 
<div class="citywrapper">city4 <div class="city_container">descript4</div></div> 
<div class="citywrapper">city5 <div class="city_container">descript5</div></div> 
<div class="citywrapper">city6 <div class="city_container">descript6</div></div> 
.... 
+0

为了理解你的想法:你加载你的整个内容并且想要显示第一个描述1,在另一个特定时间(秒,分钟,...)描述2之后,在另一个第二描述3之后......等等? – Eich 2013-03-02 23:48:15

+0

是的,你是对的da_re – led 2013-03-02 23:54:14

回答

2

什么这样的事情?如果你的ajax调用一次返回所有的HTML,我无法想象你为什么要多次拨打电话。

我在评论中添加了解释到底发生了什么,以防你不太熟悉jQuery。

<script> 
    $.ajax({ 
    type: "GET", 
    url: "getDest.php", 
    success: function(html) { 

     // Wrap the raw html into a jquery object 
     var elements = $(html); 

     // Loop through each top-level element in jquery object. 
     $.each(elements, function(i, el) { 

     setTimeout(function() { 

      // el points to the element at position i in jquery object 'elements' 
      $('#results').append(el); 

     // Each element takes one more second to append than the previous one 
     }, i * 1000); 
     } 
    } 
    }); 
</script> 

而不是只追加,您随时都可以用“显示:无”追加要素做一个整洁的动画CSS属性,然后显示了与jQuery的动画,例如它“el.slideDown()”或“el.fadeIn()”。

如果你希望它是在一秒钟以上结果之间被追加,只是为了交换

i * 1000 

i * seconds_in_between * 1000 

你应该考虑它是否对你很重要的前面元素在下一个之前完成显示 - 因为这将影响所需的时间。

此外,为了最佳实践,请在“成功”功能旁边加入“错误”功能,以防万一请求失败。你不希望用户点击很多次才发现没有任何事情发生 - 一定要让他们知道失败的原因。例如。 “无法加载城市列表。”

祝你好运!

+0

感谢莫妮卡的快速反应,但这个脚本似乎显示所有的城市一次没有setTimeout函数,但与setTimeout函数,它将只显示数组元素中的最后一个元素.. 。任何想法?我真的很喜欢这种方法。 – led 2013-03-03 01:05:27

+1

嗨!对不起,以前没看到这个。当你将setTimeout放在for循环中时,你有没有这个问题?我在REPL试过这个,它似乎对我来说工作正常。如果你仍然希望实现这个解决方案,我会进一步研究它:) - 我认为问题是'我'在超时回调发生之前已经到达循环的末尾,然后'我'是最后一个元素。我想你可以通过将每个后续超时放入前一个超时的成功函数中来递归执行此操作。 – 2013-03-12 17:19:52

+0

我认为你是对的,我仍然希望实施这种方法。这似乎很有趣。你能告诉我更多的代码吗?你如何递归调用成功函数中的超时函数?我很想学习你的方法。非常感谢。 – led 2013-03-14 15:27:00

1

我在JSFiddle上为您创建了一个code snippet。这里主要部分:

$(".city_container").each(function(index) { 
    var cityContainer = this; 
    setTimeout(function(){ 
     $(cityContainer).slideDown(); 
    }, index * 2000); 
}); 

后您添加内容到DOM可以用each在每一个项目进行迭代。然后为每个项目设置超时(,单位ms)。超时后,该项目将被显示。你也可以使用show()或其他任何东西来代替slideDown()做显示内容:)。

+0

这很好,我可以请一个slideright()效果吗?我很新的JQuery ..感谢伟大的演示。 – led 2013-03-03 01:06:07

+0

jQuery没有'slideRight'方法。但是你可以使用['animate'](http://api.jquery.com/animate/)方法来完成这个:)。我更新了[JSFiddle(点击我)](http://jsfiddle.net/gnMTX/1/)。 – Eich 2013-03-03 01:20:05

+0

如果您不想要空白空间,您可以添加CSS属性'height' - > [另一个JSFiddle](http://jsfiddle.net/jJbbT/)。 – Eich 2013-03-03 01:22:25

相关问题