За последние 24 часа нас посетили 22286 программистов и 1029 роботов. Сейчас ищут 654 программиста ...

Правильно ли я понял работу примера с JSON? (прошу прокомментировать)

Тема в разделе "PHP для новичков", создана пользователем JonK, 20 сен 2022.

  1. JonK

    JonK Новичок

    С нами с:
    31 окт 2021
    Сообщения:
    16
    Симпатии:
    0
    Доброго времени суток!

    Прошу прокомментировать правильно ли я понял работу примера, который описан в книге по PHP (тема про JSON-формат):

    есть три файла: json_index.php, json_index.js и json_answer.php

    код json_index.php:
    Код (Text):
    1. <!DOCTYPE html>
    2. <html lang="ru">
    3. <head>
    4.   <title>Передача JSON-данных</title>
    5.   <meta charset='utf-8'>
    6.   <script src="//code.jquery.com/jquery-1.11.3.min.js"></script>
    7.   <script src="/json_index.js"></script>
    8. </head>
    9. <body>
    10.   <p id='js-hello'>Здравствуйте!</p>
    11.   <form action="/json_answer.php" method="GET">
    12.   <p>Имя: <input type="text" name="name" value="" /></p>
    13.   <p>Фамилия: <input type="text" name="family" value="" /></p>
    14.   <p><input type="submit" value="Представиться"><p>
    15.   </form>
    16. </body>
    17. </html>
    код json_index.js:
    Код (Text):
    1. // Назначаем обработчики, только после полной загрузки  документа
    2. $(function(){
    3.   // Обработчик нажатия на кнопку submit
    4.   $('input[type=submit]').on('click', function(e){
    5.     // Предотвращаем обычное поведение элемента
    6.     e.preventDefault();
    7.     // Формируем JSON из полей формы
    8.     var json = {
    9.       name: $('input[name=name]').val(),
    10.       family:  $('input[name=family]').val()
    11.     }
    12.     // Отправляем асинхронный POST-запрос по адресу
    13.     // указанному в атрибуте action формы
    14.     $.ajax({
    15.       url: $('form').prop('action'),
    16.       method: 'POST',
    17.       data: 'json=' + JSON.stringify(json)
    18.     })
    19.     // В случае успешного получения ответа от сервера
    20.     .done(function(msg){
    21.       // Заменяем надпись Здравствуйте в поле p#is-hello
    22.       $('#js-hello').html(msg);
    23.     });
    24.   });
    25. });
    код json_answer.php:
    Код (Text):
    1. <?php
    2.   // Преобразуем JSON-данные в массив
    3.   $arr = json_decode($_POST['json'], true);
    4.   // Объединяем содержимое в строку
    5.   $name = trim(implode(" ", $arr));
    6.  
    7.   $result = "Здравствуйте";
    8.   if(!empty($name))
    9.     $result .= ", $name";
    10.   $result .= "!";
    11.  
    12.   // Отдаем результат
    13.   echo htmlspecialchars($result);
    14. ?>
    Правильно ли я понимаю, что это работает так:

    1. когда мы заходим на json_index.php то открывается форма + сразу подключаются скрипты сode.jquery.com/jquery-1.11.3.min.js и json_index.js

    2. после того как мы заполним поля Имя и Фамилия (например Иван Иванов), и нажмем кнопу "Представиться", то именно в этот момент управление перехватит скрипт json_index.js

    3. после перехвата управления json_index.js отменяет обычное поведение, которое обычно происходит при нажатии (т.е. отправку данных в action="/json_answer.php" не происходит на этом этапе, даже не смотря на то что кнопку нажали)

    4. далее json_index.js формируем JSON из полей формы

    5. далее отправляет этот JSON в action="/json_answer.php"

    6. в json_answer.php JSON переводится в нужную нам строку: "Здравствуйте, Иван Иванов!"

    7. далее в json_answer.php строка с содержимым "Здравствуйте, Иван Иванов!" печатается с помощью echo в поток в поток в скрипт json_index.js (тут не совсем понял)

    8. а, json_index.js проверяет: есть ли положительный ответ от сервера (в момент обращения к json_answer.php) и если да, то json_index.js заменяет в json_index.php содержимое между тегами <p id='js-hello'> </p> на то что напечатано в предыдущем 7-м пункте
     
  2. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.822
    Симпатии:
    736
    Адрес:
    Татарстан
    А где вопрос?
     
    lamac0 нравится это.
  3. JonK

    JonK Новичок

    С нами с:
    31 окт 2021
    Сообщения:
    16
    Симпатии:
    0
    как тут работает код PHP мне понятно. но с JS сталкиваюсь в первые и поэтому есть такие вопросы:

    function(msg) - в данном случае это код ответа от json_answer.php при обращении к нему скрипта, и этот код ответа равен тому что бы мы увидели если б json_answer.php напечатал бы нам в браузер echo htmlspecialchars($result), но он не печатает нам в браузер, а как бы печатает скрипту (в скрипт json_index.js)

    $('#js-hello').html(msg) - в данном случае означает что надо заменить содержимое тега <p id='js-hello'> ... </p> в открытой странице json_index.php, на то что было получено из json_answer.php (т.е. на htmlspecialchars($result)), без перезагрузки страницы json_index.php

    Верно ли я понял работу function(msg) и $('#js-hello').html(msg) ?
     
  4. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.553
    Симпатии:
    1.754
    Скрипту на пыхе глубоко по-барабану, кто его вызывает: браузер из-за ввода пользователя, браузер через жабаскрипт или какой-нибудь CURL. Скрипт пыха отрабатывает, выводит свою строчку в свой вывод, как обычно. А вот поскольку на стороне браузера был вызов аяксом, браузер уже передаёт управление обратно.

    Когда-то статейку про это писал себе в блог: https://kramerblog.net/post/1
     
  5. JonK

    JonK Новичок

    С нами с:
    31 окт 2021
    Сообщения:
    16
    Симпатии:
    0
    так понимаю аяксом был вызван из браузера скрипт json_answer.php. А что имеется ввиду "браузер уже передаёт управление обратно"? обратно кому/чему?
     
  6. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.553
    Симпатии:
    1.754
    Твоему жабаскрипту