J'ai une page qui envoie des courriels aux clients. Il a un bouton send all
au bas de la page pour fournir la commodité de pouvoir envoyer tous les emails à la fois. Le problème est que cela fonctionne mal ou pas du tout. Il ne redessine pas la page ou ne parvient pas à traiter tous les appels Ajax.Comment forcer une actualisation DOM lors de l'exécution de plusieurs tâches Ajax dans une boucle
est ici le 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])
}
}
Et si ça aide, voici où le tableau est construit info
puis la fonction appelée ...
echo "<script>\nvar email_info_array = new Array()\n";
$j = 0;
while($row = mssql_fetch_row($rs))
{
echo "email_info_array[$j] = new Array('sendlink$j','$row[1]','$row[2]','$row[4]')\n";
++$j;
}
echo "</script>\n\n";
echo "<input type=\"button\" name=\"sendallmails\" id=\"sendallmails\" value=\"Send all Mails\" onclick=\"javascript:sendall(email_info_array)\">\n";
L'ISN échec » t dans la page appelée par la fonction ajaxemail()
parce que cela fonctionne bien lorsqu'il est appelé une fois ou un à la fois. C'est lorsqu'il est appelé par la boucle que cela ne fonctionne pas. Il semble faire le dernier ou les deux derniers éléments dans la boucle ... ou il peut faire un peu entre les deux si je fais quelque chose qui oblige le navigateur à redessiner (comme le redimensionner).
Si j'ajoute une alerte comme un moyen de tester que l'exécution de la boucle est au moins de travail, il exécute avec succès l'appel Ajax à chaque itération (mais je dois appuyer ok
sur de nombreuses alertes!
je dois d'une manière ou d'une autre, rafraîchir le navigateur DOM à chaque itération de la boucle, peu importe si la page devient moins réactive (mais ne deviendra pas totalement insensible)
tester dans d'autres navigateurs une fois que je l'ai travailler en FF)
sens. Au cas où vous ne pourriez pas dire que je suis nouveau à ajax. Je n'utiliserai pas encore une bibliothèque parce que je l'apprends et je veux apprendre à le faire avant d'utiliser une bibliothèque qui le fait pour moi. Je vais essayer votre deuxième option la prochaine fois que je travaille sur le code (au travail) – MrVimes
A décidé de l'essayer tout de suite. J'ai écrit une page factice rapide qui incorpore 20 appels ajax. Ajoutant à votre suggestion de modification a fait l'affaire, donc je sais que cela fonctionnera quand je modifie le code réel. Alors merci encore pour votre aide. – MrVimes