За последние 24 часа нас посетил 141771 программист и 6122 робота. Сейчас ищет 2161 программист ...

оценка сайту

Тема в разделе "Прочее", создана пользователем school9, 20 дек 2011.

  1. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.870
    Симпатии:
    955
    test.php
    Код (PHP):
    1. <?php
    2. if( isset( $_GET['ajax'] ) )
    3. {
    4.     sleep(rand(1,3));
    5.     echo $_GET['ajax'];
    6.     exit;
    7. }
    8.  
    9. ?><html><head>
    10.     <title>ru.php.37214-1</title>
    11.     <script language="javascript" src="./jquery-1.7.1.min.js" type="text/javascript"></script>
    12.     <script language="javascript" src="./ajax.js" type="text/javascript"></script>
    13. </head><body>
    14.     [url="#"]press me[/url]
    15.     <div id="jrn">fillme</div>
    16. </body></html>
    ajax.js
    Код (Text):
    1. function ajax_get(i)
    2. {
    3.     rt = '';
    4.     $.ajax({
    5.         url: './test.php?ajax='+i,
    6.         type: 'GET',
    7.         async: false,
    8.         cache: false,
    9.         timeout: 10000,
    10.        
    11.         success: function(data){
    12.             rt = data;
    13.         }
    14.     });
    15.     return rt;
    16. }
    17.  
    18.  
    19. function ajax()
    20. {
    21.     $("#btn").html('wait...');
    22.     $("#jrn").css('color','grey');
    23.    
    24.     $("#jrn").html(ajax_get(1));
    25.     $("#jrn").html(ajax_get(2));
    26.     $("#jrn").html(ajax_get(3));
    27.     $("#jrn").html(ajax_get(4));
    28.     $("#jrn").html(ajax_get(5));
    29.    
    30.     $("#jrn").css('color','red');
    31.     $("#btn").html('press me');
    32.     return false;
    33. }
    тынц-онлайн
    одновременно только один запрос к серверу.
    у всех все нормально, хром продолжает думать до победного.
     
  2. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.372
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Ну, есть предположение, примерно такое: когда свойству innerHTML некоторого объекта присваивается новое значение - то присвоение-то происходит сразу, но отрисовка его на экране происходит отдельно после изменения значения этого свойства. Видимо, гуглохром пытается одновременно выполнять дальнейший JavaScript-код и заниматься перерисовкой картинки после изменения innerHTML. Однако запросы синхронные, то есть во время запроса браузер полностью блокируется. И, в том числе, блокируется функция, которая перерисовывает картинку. В итоге получается, что между запросами - свойство innerHTML у объекта изменилось, но на экране мы этого не видем. Поставь после каждого такого

    Код (Text):
    1. $("#jrn").html(ajax_get(Х));
    вызов ещё какой-либо функции, останавливающей выполнение JavaScript. Например, alert(); :

    Код (Text):
    1. $("#jrn").html(ajax_get(1));
    2. alert(document.getElementById('jrn').innerHTML);
    3. $("#jrn").html(ajax_get(2));
    4. alert(document.getElementById('jrn').innerHTML);
    5. $("#jrn").html(ajax_get(3));
    6. alert(document.getElementById('jrn').innerHTML);
    7. $("#jrn").html(ajax_get(4));
    8. alert(document.getElementById('jrn').innerHTML);
    9. $("#jrn").html(ajax_get(5));
    Тут ты увидешь, что если не блокировать работу браузера синхронными запросами сразу друг за другом - то он успеет всё на экране перерисовать.

    В других браузерах, видимо, после изменения innerHTML сразу происходит перерисовка и пока она не произойдёт дальнейшие инструкции JavaScript не выполняются. Либо же синхронные запросы в них не блокируют "перерисовщик".

    Но это лишь предположение, конечно.

    Как выход из ситуации - не юзать синхронные запросы, а использовать асинхронные. Но код, естественно, при этом должен существенно измениться.