За последние 24 часа нас посетили 16915 программистов и 1180 роботов. Сейчас ищут 1582 программиста ...

Многократная отправка с формы

Тема в разделе "JavaScript и AJAX", создана пользователем Vladd55, 10 апр 2023.

  1. Vladd55

    Vladd55 Новичок

    С нами с:
    11 дек 2021
    Сообщения:
    88
    Симпатии:
    1
    Добрый день!

    Стоит задача: иметь на странице форму отправки информации на сервер. При этом после отправки форма не должная закрываться, чтобы с нее можно было сделать отправление несколько раз.

    В качестве прототипа я нашел в сети вот такую простую конструкцию.

    Код (Text):
    1. <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
    2.  
    3. <form id="feedback-form" action="">
    4.     <input type="text" name="name" required placeholder="Ваше имя">
    5.     <input type="tel" name="phone" required placeholder="Ваш телефон">
    6.     <textarea name="text" placeholder="Ваш текст"></textarea>
    7.     <input type="submit" name="submit" value="Отправить">
    8. </form>
    9.  
    10. <script>
    11. $(document).ready(function () {
    12.     $("form").submit(function () {
    13.         // Получение ID формы
    14.         var formID = $(this).attr('id');
    15.         // Добавление решётки к имени ID
    16.         var formNm = $('#' + formID);
    17.         $.ajax({
    18.             type: "POST",
    19.             url: '/send.php',
    20.             data: formNm.serialize(),
    21.             beforeSend: function () {
    22.                 // Вывод текста в процессе отправки
    23.                 $(formNm).html('<p style="text-align:center">Отправка...</p>');
    24.             },
    25.             success: function (data) {
    26.                 // Вывод текста результата отправки
    27.                 $(formNm).html('<p style="text-align:center">'+data+'</p>');
    28.             },
    29.             error: function (jqXHR, text, error) {
    30.                 // Вывод текста ошибки отправки
    31.                 $(formNm).html(error);
    32.             }
    33.         });
    34.         return false;
    35.     });
    36. });
    37. </script>
    В качестве обработчика используется файл send.php
    PHP:
    1.     $message = 'Имя: ' . $_POST['name'] . ' ';
    2.     $message .= 'Телефон: ' . $_POST['phone'] . ' ';
    3.     $message .= 'Текст: ' . $_POST['text'] . ' ';
    4.  
    5.     file_put_contents('1-newText.txt', $message);
    6.  
    7.     echo "Сообщение отправлено!";
    Форма работает, но после передачи она исчезает. Не знаю, как оставить ее на экране для повторного использования. При этом чтобы набранные символы оставались в окнах.
     
    #1 Vladd55, 10 апр 2023
    Последнее редактирование: 10 апр 2023
  2. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.852
    Симпатии:
    746
    Адрес:
    Татарстан
    не выводить сообщение ВМЕСТО формы отправки.... или вообще не выводить.... или выводить но в определенный блок формы - который не влияет на саму форму... например под ней, над ней, в всплывающем окне
     
  3. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.829
    Симпатии:
    651
    Там вместо всей формы выводится сообщение с сервера:
    Пиши сообщение в отдельный блок.
     
  4. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.102
    Симпатии:
    1.243
    Адрес:
    там-сям
    Всё правильно выше написали, добавлю оффтопик: раз форма останется, добавь дизейбл на кнопку отправки, чтобы случайно не отправить повторно пока обрабатывается предыдущий запрос. Юзеры любят дабл-клик ))) А когда вернется ответ - убирай дизейбл кнопки.
     
  5. Vladd55

    Vladd55 Новичок

    С нами с:
    11 дек 2021
    Сообщения:
    88
    Симпатии:
    1
    Вообще не выводить сообщение - это не так просто. Если я из обработчика убираю
    PHP:
    1. echo "Сообщение отправлено!";
    то форма все равно исчезает, просто вместо нее пустая страница.
     
  6. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.788
    Симпатии:
    1.328
    Адрес:
    Лень
    HTML:
    1. <form id="feedback-form" action="/send.php" method="post">
    2.     <input type="text" name="name" required placeholder="Ваше имя">
    3.     <input type="tel" name="phone" required placeholder="Ваш телефон">
    4.     <textarea name="text" placeholder="Ваш текст"></textarea>
    5.     <input type="submit" name="submit" value="Отправить">
    6. </form>
    PHP:
    1. $( document ).ready( function ()
    2. {
    3.     'use strict';
    4.    
    5.     function send( url, method, formData = {} )
    6.     {
    7.         return $.ajax(
    8.         {
    9.             url: url,
    10.             type: method,
    11.             contentType: false,
    12.             processData: false,
    13.             data: formData,
    14.             dataType: 'JSON'
    15.         } );
    16.     }
    17.    
    18.     $( document ).on( 'submit', '#feedback-form', function ( event )
    19.     {
    20.         e.preventDefault();
    21.        
    22.         var obj = new FormData( event.get(0) );
    23.        
    24.         send( event.attr( 'action' ), event.attr( 'method' ), obj )
    25.             .done( function ( response )
    26.             {
    27.                 alert( "success" );
    28.             } )
    29.             .fail( function ()
    30.             {
    31.                 alert( "error" );
    32.             } );
    33.     } )
    34. } );
    --- Добавлено ---
    https://api.jquery.com/jquery.ajax/
    --- Добавлено ---
    в ответ ожидает json строку КАК ПОДАБАЕТСЯ ВЕЗДЕ
     
  7. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.829
    Симпатии:
    651
    Mля, тебе кто-то писал что-то убирать из обработчика? Нужно клиентский обработчик ответа править. И см., там форма затирается еще и «Отправкой...» ;)
    --- Добавлено ---
    Хотя такой «обработчик» надо нафиг снести. Типичный г/код :D

    Это заглушка. «Попрошайки» с форумов часто принимают такой код за чистую монету и втыкают его в прод.
     
  8. Vladd55

    Vladd55 Новичок

    С нами с:
    11 дек 2021
    Сообщения:
    88
    Симпатии:
    1
    Так это я написал для простоты настройки. В реале база используется, но здесь она ни к чему.
     
  9. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.102
    Симпатии:
    1.243
    Адрес:
    там-сям
    @Vladd55 будь внимательней! тебе указывают конкретно в чем проблема - ты выводишь ответ вместо формы. А мог бы как-то отдельно, в нужном div-е. Если тебе этот момент непонятен, переспроси. Проблема не в обработчике на стороне сервера. )))

    Как мимнимум, чтобы понять что происходит, замени

    Код (Text):
    1. $(formNm).html(пох что)
    на

    Код (Text):
    1. alert(пох что)
    Попробуй, пойми как это просто и прослезись. Подумай. Ещё раз подумай. А потом попробуй:

    Код (Text):
    1. $(другое место на странице).html(пох что)
     
  10. Vladd55

    Vladd55 Новичок

    С нами с:
    11 дек 2021
    Сообщения:
    88
    Симпатии:
    1
    Идея ясна, идея хорошая, так даже интересно, спасибо!

    HTML:
    1. <div id="svn"></div>
    Код (Javascript):
    1.                 // Вывод текста в процессе отправки
    2.                 $("#svn").html('<p style="text-align:center">Отправка...</p>');
    3.             },
    4.             success: function (data) {
    5.                 // Вывод текста результата отправки
    6.                 $("#svn").html('<p style="text-align:center">'+data+'</p>');
    7.             },
    8.             error: function (jqXHR, text, error) {
    9.                 // Вывод текста ошибки отправки
    10.                 $("#svn").html(error);
    11.             }
    Теперь буду думать, как поступить, если форм будет две или больше, и чтобы сообщение выводилось возле каждой из них.
     
    artoodetoo нравится это.
  11. Vladd55

    Vladd55 Новичок

    С нами с:
    11 дек 2021
    Сообщения:
    88
    Симпатии:
    1
    Для нескольких форм идея такая.

    Формы имеют разные ID, а DIVы для вывода сообщений имеют впереди названия букву s
    HTML:
    1. <form id="feed" action="">
    2.     <input type="text" name="name" required placeholder="Ваше имя">
    3.     <input type="tel" name="phone" required placeholder="Ваш телефон">
    4.     <input type="hidden" name="id-form" value="first">
    5.     <textarea name="text" placeholder="Ваш текст"></textarea>
    6.     <input type="submit" name="submit" value="Отправить">
    7. </form>
    8.  
    9. <div id="sfeed"></div>
    10.  
    11. <form id="leed" action="">
    12.     <input type="text" name="name" required placeholder="Ваше имя">
    13.     <input type="tel" name="phone" required placeholder="Ваш телефон">
    14.     <input type="hidden" name="id-form" value="dva">
    15.     <textarea name="text" placeholder="Ваш текст"></textarea>
    16.     <input type="submit" name="submit" value="Отправить">
    17. </form>
    18.  
    19. <div id="sleed"></div>
    Соответственно, в скрипте добавляем эту букву s:
    Код (Javascript):
    1. var formNm = $('#s' + formID);
    "Сообщение отправлено!" выводится каждое в свой ДИВ. Но данные в $_POST не передаются. Что, в общем-то, и понятно - я вывожу данные из несуществующих форм.
    Но решение где-то рядом...
     
  12. Vladd55

    Vladd55 Новичок

    С нами с:
    11 дек 2021
    Сообщения:
    88
    Симпатии:
    1
    Решение найдено, спасибо!
     
  13. Sail

    Sail Старожил

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

    Vladd55 Новичок

    С нами с:
    11 дек 2021
    Сообщения:
    88
    Симпатии:
    1
    Спасибо, постараюсь учесть и постепенно освоить эти правила.
    Хотя еще недавно принцип был совершенно иной: имена как можно короче и CSS без комментариев. Типа as1, as2 и т.п. Сегодня, иной раз, обозначения весят слишком много.
    HTML:
    1. <input type="checkbox" class="form-check-input-zero form-validate-actualite-simbol-state" name="rules-en-disk-zero" value="1" id="form_register_rules_simbol_region">
     
  15. don.bidon

    don.bidon Активный пользователь

    С нами с:
    28 мар 2021
    Сообщения:
    912
    Симпатии:
    143
    Тогда в твоей каше никто не захочет разбираться.