За последние 24 часа нас посетил 16631 программист и 1599 роботов. Сейчас ищут 1329 программистов ...

Подряд два AJAX-вызова, ответ приходит только от одного. Почему и как обойти?

Тема в разделе "JavaScript и AJAX", создана пользователем SpikePHP, 4 дек 2017.

  1. SpikePHP

    SpikePHP Активный пользователь

    С нами с:
    6 май 2015
    Сообщения:
    130
    Симпатии:
    23
    В диве лежит картинка. У <div> и у <a> разные ID, каждый с обработчиком клика. Если кликнуть по картинке, то вызывается обработчик для <a> и для <div>, и в таком случае должны отправиться два запроса и получить должны мы два ответа. Но приходит ответ только для <div>
    HTML:
    HTML:
    1. <div id="ttt1"> <a id="ttt2"> <img src="/template/images/control/image.png"></a> </div>
    JS:
    Код (Javascript):
    1. $('#ttt1').click(function (ev){
    2.     test1();
    3. });
    4. $('#ttt2').click(function (ev){
    5.     test2();
    6. });
    7.  
    8. function test1() {
    9.     xmlhttp.onreadystatechange=function()
    10.     {
    11.         if (xmlhttp.readyState==4 && xmlhttp.status==200){
    12.             var itext = xmlhttp.responseText;
    13.             alert (itext);
    14.         }  
    15.     }
    16.     xmlhttp.open("POST",  "/marker/test1", true);
    17.     xmlhttp.setRequestHeader ( "Content-type", "application/x-www-form-urlencoded" );
    18.     xmlhttp.send();
    19. }
    20.  
    21.  
    22. function test2() {
    23.     xmlhttp.onreadystatechange=function()
    24.     {
    25.         if (xmlhttp.readyState==4 && xmlhttp.status==200){
    26.             var itext = xmlhttp.responseText;
    27.             alert (itext);
    28.         }  
    29.     }
    30.     xmlhttp.open("POST",  "/marker/test2", true);
    31.     xmlhttp.setRequestHeader ( "Content-type", "application/x-www-form-urlencoded" );
    32.     xmlhttp.send();
    33. }
     
  2. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.593
    Симпатии:
    362
    @SpikePHP, для начала попробуйте два разных объекта XMLHttpRequest();
    Например, в начале функций test1 и test2 добавьте: var xmlhttp = new XMLHttpRequest();
     
    SpikePHP нравится это.
  3. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.593
    Симпатии:
    362
    и добавьте ещё xmlhttp.setRequestHeader ( "X-Requested-With", "XMLHttpRequest" );
     
  4. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.861
    Симпатии:
    751
    Адрес:
    Татарстан
    ребят... нельзя использовать одинаковые идентификаторы..... либо ид меняйте, либо делайте класс и отслеживайте его , либо еше какие то аттрибуты
    какая куча одинаковых ид не была бы в документе, отрабатываться всегда будет только первый, ибо браузер знает что ид уникальный и больше таких не будет
     
  5. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.593
    Симпатии:
    362
    @ADSoft, истину глаголете! Только к данному случаю она отношения не имеет :rolleyes:
     
  6. SpikePHP

    SpikePHP Активный пользователь

    С нами с:
    6 май 2015
    Сообщения:
    130
    Симпатии:
    23
    @Sail, спасибо! Недоглядел, что у меня переменные не объявлены. Получалось, что без объявления они были глобальными и на одну и ту же переменную приходили ответы?

    А зачем эти заголовки добавлять?

    Спасибо еще раз!
     
  7. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.593
    Симпатии:
    362
    Чтобы в обработчике можно было добавить что-нибудь подобное:
    PHP:
    1. if(empty($_SERVER['HTTP_X_REQUESTED_WITH'])
    2.     || strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) !== 'xmlhttprequest')
    3. {
    4.     exit('Not ajax request');
    5. }
     
    SpikePHP нравится это.
  8. SpikePHP

    SpikePHP Активный пользователь

    С нами с:
    6 май 2015
    Сообщения:
    130
    Симпатии:
    23
    @Sail, как интересно. Заставляет задуматься.

    Потому как у меня нет этой проверки...
    У меня есть проверка лишь админ ли пользователь?(Если не админ, то ajax-запрос не обрабатывается)

    Какие в таком случае у меня дыры в безопасности открыты?
     
  9. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.593
    Симпатии:
    362