Php 在循环中运行多个Ajax任务时如何强制DOM刷新

Php 在循环中运行多个Ajax任务时如何强制DOM刷新,php,ajax,dom,Php,Ajax,Dom,我有一个向客户发送电子邮件的页面。它在页面底部有一个send all按钮,可以方便地一次发送所有电子邮件。问题是它工作不好或者根本不工作。它要么没有重新绘制页面,要么没有处理所有Ajax调用 这是JavaScript function ajaxemail(element,name,email,bonus) { if (window.XMLHttpRequest) {// code for IE7+, Firefox, Chrome, Opera, Safari x

我有一个向客户发送电子邮件的页面。它在页面底部有一个
send all
按钮,可以方便地一次发送所有电子邮件。问题是它工作不好或者根本不工作。它要么没有重新绘制页面,要么没有处理所有Ajax调用

这是JavaScript

function ajaxemail(element,name,email,bonus)
{
    if (window.XMLHttpRequest)
    {// code for IE7+, Firefox, Chrome, Opera, Safari
        xmlhttp=new XMLHttpRequest();
    }
    else
    {// code for IE6, IE5
        xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
    }

    xmlhttp.onreadystatechange=function()
    {
        if (xmlhttp.readyState==4 && xmlhttp.status==200)
        {

            document.getElementById(element).innerHTML= xmlhttp.responseText
            //document.getElementById(element).style.display = 'none'
            //document.getElementById(element).style.display = 'block'
            //alert(xmlhttp.responseText)
        }
    }
    xmlhttp.open("POST",<?php echo "\"$_SERVER[PHP_SELF]\"";?>,true);
    xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
    xmlhttp.send("emailto=true&name="+name+"&email="+email+"&bonus="+bonus);
}


function sendall(info)
{
    document.getElementById('sendallmails').disabled = true
    document.getElementById('sendallmails').value = 'Sending mails...'

    length = info.length

    for( i=0; i < length; i++)
    {
        ajaxemail(info[i][0],info[i][1],info[i][2],info[i][3])

    }

}
失败不在函数
ajaxemail()
调用的页面中,因为当一次调用一次或一次调用一次时,该函数可以正常工作。当被循环调用时,它不工作。它似乎完成了循环中的最后一个或两个项目。。。或者,如果我做了一些强迫浏览器重新绘制的事情(比如调整大小),它可能会在这两者之间做一些事情

如果我添加一个警报作为测试循环执行是否至少正常的一种方法,那么它会在每次迭代中成功地运行Ajax调用(但是我必须在许多警报上按
ok

在循环的每一次迭代中,我都需要以某种方式强制刷新浏览器DOM。页面的响应性变差并不重要(但更希望它不会完全无响应)


我正在使用最新的Firefox进行测试(在FF中运行后,将在其他浏览器中进行测试)

这里的问题是,您使用的异步请求带有一个保存Ajax调用的全局变量。在循环的每次迭代中,您基本上都会覆盖以前的调用。您需要使用一个库,该库不使用全局变量进行Ajax调用

最好使用jQuery、Dojo、YUI或其他支持Ajax请求的JavaScript框架

另一种选择是使用数组来保持通话。基本的想法是不做任何事情

var ind = xmlhttp.push(new XMLHttpRequest()) - 1;


有道理。如果你说不出我是ajax新手。我现在还不会使用库,因为我正在学习它,我想先学习如何使用它,然后再使用为我使用的库。下次我在编写代码(工作时)时,我会给你第二个选择我决定马上试试。我写了一个包含20个ajax调用的快速虚拟页面。添加您建议的修改就成功了,所以我知道当我编辑真正的代码时这会起作用。再次感谢您的帮助。
var ind = xmlhttp.push(new XMLHttpRequest()) - 1;
xmlhttp[ind].onreadystatechange ...
xmlhttp[ind].open ...