Ajax-запросы в цикле обновления div после каждого запроса, не работающего в IE8 - PullRequest
2 голосов
/ 25 июля 2010

У меня есть цикл, в котором я делаю запросы Ajax xmlhttp. Это происходит внутри функции, вызванной событием window.onload.

Ajax-вызовы выполняются с async = false, потому что они должны выполняться в определенном порядке, который зависит от выполнения каждого шага, прежде чем может произойти следующий.

С каждым последующим запросом в цикле я обновляю div с помощью xmlhttp.responseText.

Firefox обновляет между вызовами по желанию.

IE нет. Когда цикл начинается, div заполняется содержимым предварительного цикла. Когда цикл завершается, div заполняется первым обновлением, которое происходит вне цикла.

Может кто-нибудь помочь, пожалуйста?

Два попытки решения: 1. Добавление случайной строки в конец строки запроса GET, чтобы обеспечить уникальный URL 2. Отправка методом POST

Не повезло ни с одним.

Спасибо.

Код ...

<script type="text/javascript">
function order_process() {
    var err;
    var queue_id = "<?= implode(':',$plans[$_REQUEST['order_queue_id']]); ?>".split(':');               // Queue ID
    var queue_ax = "<?= implode(':',array_keys($plans[$_REQUEST['order_queue_id']])); ?>".split(':');   // Queue Action
    i = 0;
    for (step in queue_id) {

        // The DIV contents that display during each loop iteration
        document.getElementById("barber_pole").innerHTML='\
            <center>\
            <table style="align:left" border="0" cellpacing="1" cellpadding="1">\
                <tr><td><B>Processing Order</B><span style="float:right;">Step ' + (i + 1) + '/' + queue_id.length + '</span></td></tr>\
                <tr><td style="background-color:#FFFFFF;height:1.5px"></td></tr>\
                <tr><td height="20" style="text-align:center">' + queue_ax[i] + '...</td></tr>\
                <tr><td height="20"><IMG SRC="../../_include/images/barber_pole.gif" style="vertical-align: middle;"></td></tr>\
            </table>\
            </center>';

        xmlhttp = ajax_request(); // Create request object
        xmlhttp.onreadystatechange=function () {
            if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
                1;
            }
        }

        var url = '../../../api/order_process.php?api_login=' + "<?=$api_login?>" + '&api_pass=' + "<?=$api_pass?>" + "&order_id=<?= $_REQUEST['order_id']?>" + '&order_action_id=' + queue_id[step] + '&timeid=' + Math.random();
        xmlhttp.open("GET",url,false);
        xmlhttp.send();

        // If the response includes the string 'failed' exit the loop and render error error message
        if (xmlhttp.responseText.split(',')[0] == 'failed') {
            err = queue_ax[i] == 'Registering Domain'
                ? "<h1 class=\"landing-title\">"  + fname + ', ' + "<?=$feedback[domain_register][title]?>"      + "</h1><DIV class='landing-body'><?=$feedback[domain_register][body]?></DIV>"
                : queue_ax[i] == 'Provisioning cPanel Account'
                ? "<h1 class=\"landing-title\">"  + fname + ', ' + "<?=$feedback[cpanel_provision][title]?>"     + "</h1><DIV class='landing-body'><?=$feedback[cpanel_provision][body]?></DIV>"
                : queue_ax[i] == 'Credit Card Fraud Protection'
                ? "<h1 class=\"landing-title\">"  + fname + ', ' + "<?=$feedback[maxmind_minfraud][title]?>"     + "</h1><DIV class='landing-body'><?=$feedback[maxmind_minfraud][body]?>\"" + xmlhttp.responseText + '"</DIV>'
                : queue_ax[i] == 'Verifying Payment'
                ? "<h1 class=\"landing-title\">"  + fname + ', ' + "<?=$feedback[verify_payment][title]?>"       + "</h1><DIV class='landing-body'><?=$feedback[verify_payment][body]?>\""   + xmlhttp.responseText + '"</DIV>'
                : xmlhttp.responseText == 'failed,'
                ? "<h1 class=\"landing-title\">"  + fname + ', ' + "<?=$feedback[gen_err][title]?>"              + "</h1><DIV class='landing-body'><?=$feedback[gen_err][body]?></DIV>"
                : "<h1 class=\"landing-title\">"  + fname + ', ' + "<?=$feedback[gen_err][title]?>"              + "</h1><DIV class='landing-body'><?=$feedback[gen_err][body]?>\""          + xmlhttp.responseText + '"</DIV>';
            break;
        }
        i++;
    }

    if (err) {
        document.getElementById("landing-pres").innerHTML = err;
        Cufon.replace('.landing-title');
    } else {
        document.getElementById("barber_pole").innerHTML = "<?= $thank[$_REQUEST['order_queue_id']][1] ?>";
    }
}
window.onload=order_process;
</script>

1 Ответ

0 голосов
/ 31 мая 2012

async = false не рекомендуется [третий параметр в xmlhttp.open («GET», url, false);], и мы не должны писать функцию onreadystatechange, если мы используем async = false [Кроме того, вы ничего не делаете вэта функция].Пожалуйста, обратитесь http://www.w3schools.com/ajax/ajax_xmlhttprequest_send.asp

Вот хороший способ собрать / подготовить весь HTML один раз и обновить ваш div "barber_pole" следующим образом ..

<script type="text/javascript">
function order_process()
{
  var err;
  var queue_ids  = "<?php echo implode(':',$plans[$_REQUEST['order_queue_id']]); ?>";                // Queue IDs separated by ':'
  var queue_axns = "<?php echo implode(':',array_keys($plans[$_REQUEST['order_queue_id']])); ?>";    // Queue Actions separated by ':'

  var xmlhttp = ajax_request(); // Create request object
  var url = '../../../api/order_process.php?api_login=' + "<?=$api_login?>" + '&api_pass=' + "<?=$api_pass?>" + "&order_id=<?= $_REQUEST['order_id']?>" + '&order_action_ids=' + encodeURIComponent(queue_ids)  + '&order_actions=' + encodeURIComponent(queue_axns) + '&timeid=' + Math.random();

  xmlhttp.onreadystatechange = function ()
  {
    if (xmlhttp.readyState == 4)
    {
      document.getElementById("barber_pole").innerHTML = xmlhttp.responseText;;
    }
    else
    {
      document.getElementById("barber_pole").innerHTML = "Processing..";
    }
  }
  xmlhttp.open("GET", url, true);
  xmlhttp.send();
}
window.onload=order_process;
</script>

в файле order_process.php ...

<?php

//Checking whether logged in or not blah blah..


$action_ids = $_REQUEST['order_action_ids'];
$order_actions = $_REQUEST['order_actions'];

$actions_ids_array = explode(":", $action_ids);
$order_actions_array = explode(":", $order_actions);

$strHTML = '';
for($cnt=0; $cnt < count($actions_ids_array); $cnt++ )
{
  $each_action_id = $actions_ids_array[$cnt];
  $each_action    = $order_actions[$cnt];

  //Process each action collect $fname and $status value and generate HTML

  //blah blah..

  $strHTML .= "<h1 class=\"landing-title\">" . $fname . $status .  "</h1>";
}

echo $strHTML;
exit;
...