2011-03-23 71 views
2

我有一个页面videos.php,它通过Ajax加载视频源。在php ajax页面video_feed_ajax.php中,它通过一个数组查看每个视频的对象。然而,目前我写JS的方式,只有当它的完整加载(当它遍历整个数组时)才显示video_feed_ajax.php。 - >有没有办法显示video_feed_ajax.php每次它通过循环,所以视频显示,因为它循环而不是在最后?PHP/JS Ajax - 通过数组循环显示PHP页面

xmlhttp.onreadystatechange=stateChangedUsersAddVideoFeed; 
xmlhttp.open("GET",url,true); 
xmlhttp.send(null); 

function stateChangedUsersAddVideoFeed() 
{ 
    document.getElementById("add_video_feed").innerHTML=xmlhttp.responseText; 
    document.getElementById('add_video_feed_load_img').style.display='none'; 
} 

回答

1

可能调用你的循环中的PHP函数flush立即发送回显标记。

但是,如果你的循环正在采取足够长的时间造成滋扰有必须与它的东西错了 - 除非你只是想逐步加载的视觉效果,在这种情况下,你应该简单动画,接到全响应后。流几码就没有意义了。

1

有每次经过循环时间显示video_feed_ajax.php的方式,使视频显示为它遍历代替:

适用的我JS的部分只是在最后?

我要解释这意味着:

有什么办法来处理来自查询的数据,因为它从服务器回来,而不是一次处理整个文档?

在这个特定情况下,答案“可能不是”。

你在这里写裸ajax,并且盲目地假设任何 readyState变化将对你有利。 (这是不好的做法,你有没有考虑过使用像jQuery这样的现代Javascript库?)

The issue at hand is what those readyStates are,以及它们何时被触发。状态如下:

0:未发送:对象存在。
1:已打开:该对象正在发出HTTP请求。
2:收到标题:请求已完成并返回了HTTP标头。
3:正在加载:正在传送和处理HTTP请求正文。
4:完成:HTTP请求主体已完全加载。

不同的浏览器处理0,1和2的方式不同,所以让我们假装它们不存在。

现在,规范说,the response should be partially populated as it's made available,但你的代码只有在状态改变时才会触发。你只会看到两种状态变化:加载或完成。这意味着你现有的代码永远不会看到部分文件!

现在,我的直觉是,你可以设置一个setTimeout当readyState加载,然后不断轮询响应,看看有什么变化,但这是行不通的。 As documented in this previous question here on SO,一些浏览器不实现加载readyState!这意味着你的代码只能永远可靠地看到完成readyState。

总之,你不能这样做...没有一些帮助。

HTML5的努力提出了一项名为Server-Side Events的新技术。它旨在完成您要在此处执行的操作:将单独的数据块一次一个地背对背地发送,并独立处理它们。在Chrome和Opera中有本地实现,当浏览器没有实现它时有there's a jQuery plugin to emulate the interface。他们想把它放到Firefox 4中,但它们不能完全切断。我只知道这种技术存在,并不是说它的工作原理是适合你的目的。

1

我结合了你的两个答案。我将flush()添加到我的PHP循环的末尾,并将我的JS代码更改为以下内容。它可能不是100%可靠的,但它是我拥有的最佳解决方案。多谢你们!

if (xmlhttp.readyState==3) 
{ 
    document.getElementById("add_video_feed").innerHTML=xmlhttp.responseText; 
} 
if (xmlhttp.readyState==4) 
{ 
    document.getElementById('add_video_feed_load_img').style.display='none'; 
}