Удалить форму перед отправкой

У меня есть страница, которая загружает разделы через AJAX

Например:

<!-- Email Section -->
<div id=\"email-container\" class=\"body-container hidden\">

</div>

<!-- Users Section -->
<div id=\"user\" class=\"body-container hidden\">

</div>

<!-- File-Upload Section -->
<div id = "upload-container" class = "body-container hidden">

</div>

Когда пользователь нажимает на ссылку, «старый» раздел исчезает, а появляется «новый». «Новый» раздел загружается и перезаписывает любые данные, которые могли быть там раньше ...

function showSection(section, link) {
    $(".body-container").addClass('hidden');
        $("#" + section + "-container").removeClass('hidden');
        $(".menu-item").removeClass('current-menu-item');
        $("#" + link).addClass('current-menu-item');

        var jqxhr = $.get("./sections/" + section)
            .done(function (response) {
                $("#" + section + "-container").html(response);
            })
            .fail(function () { 
                // blah  
            });

В разделе загрузки у меня есть форма, и она отправляется через AJAX.

$(document).on('submit', '#upload', function() {
    var form_data = new FormData(this);

    $.ajax({
        url: 'upload.php', 
        cache: false,
        contentType: false,
        processData: false,
        data: form_data,
        type: 'post',
        success: function(response){
            // do stuff with response. Don't care if it fails for now
        }
    });

    return false;
});

Моя проблема в том, что если я загружаю эту страницу загрузки более одного раза, создается более одной формы, и поэтому одна и та же информация отправляется и загружается несколько раз.

Как я могу удалить старые формы, которые были созданы ранее, чтобы только ОДНА форма отправлялась каждый раз, когда пользователь нажимает «отправить», независимо от того, сколько раз был загружен раздел?

Заранее спасибо.

Это именно то, что он делает: $("#" + section + "-container").html(response); Он заменяет существующий HTML в этом элементе новым HTML. Вы можете это проверить? Дважды «загрузить» раздел «загрузка». Какой именно HTML-код возвращался с сервера каждый раз? Каково конечное состояние DOM после каждого из них? Что в конечном итоге содержит каждый AJAX POST из формы отправки?

David 29.11.2018 19:07

Если мне чего-то не хватает, да, он каждый раз заменяет HTML. Допустим, на загруженной странице есть пустая текстовая область, и я помещаю что-то в эту текстовую область, а затем щелкаю ссылку, чтобы «перезагрузить» страницу. Весь текст уходит. В основном, раздел начинается с нуля, и я не могу найти остатков «старого» раздела. Но кажется, что эта форма сохраняется, и я не знаю почему.

Apolymoxic 29.11.2018 19:10

@David, чтобы добавить больше к этому последнему комментарию ... когда я нажимаю "Отправить", данные на странице в настоящее время отправляются. Если я загрузил этот раздел 3 раза, данные будут отправлены 3 раза. Если я обновляю всю страницу и загружаю раздел загрузки (только один раз), данные отправляются один раз. Это ответ на ваш вопрос, или я неправильно понял?

Apolymoxic 29.11.2018 19:17

Когда вы говорите, что данные отправляются трижды, вы имеете в виду один запрос AJAX с тремя формами данных (все разные)? Три запроса AJAX с тремя разными наборами данных? Три запроса AJAX с одинаковым набором данных? Что-то другое? Кроме того, загружается ли этот код jQuery AJAX на страницу один раз? Или каждый раз, когда загружается эта «секция»? В последнем случае каждый раз будет создаваться новый обработчик событий.

David 29.11.2018 19:22

@David отправляет ОДИНАКОВЫЕ данные - все, что в данный момент находится в форме раздела. Да, этот раздел загружается каждый раз, он находится в разделе загрузки. Я не думал, что проблема в этом ... позвольте мне попробовать поместить это на главную страницу и посмотреть, что произойдет.

Apolymoxic 29.11.2018 19:26

@ Дэвид Ага, вот и все. Просто из любопытства, есть ли способ уничтожить старый обработчик, чтобы я мог оставить этот код в этом разделе и НЕ иметь этой проблемы? Пожалуйста, отправьте ответ, и я отмечу его как правильный.

Apolymoxic 29.11.2018 19:32
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
6
31
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Судя по комментариям к вопросу, похоже, что корень проблемы в следующем:

$(document).on('submit', '#upload', function() {
    //...
});

Поскольку это часть содержимого, загружаемого через AJAX, он выполняется каждый раз при загрузке содержимого. В частности, это добавляет обработчик submit к элементу document. Таким образом, каждый раз при загрузке контента добавляется еще один обработчик submit. Когда все эти обработчики выполняются, все они делают одно и то же.

Если вы В самом деле хотите, чтобы обработчик был включен в контент, привяжите его напрямую к элементу:

$('#upload').on('submit', function() {
    //...
});

Пока элемент #upload уничтожается и каждый раз при загрузке контента создается новый, любые обработчики, прикрепленные к этому элементу, также будут уничтожены.

Однако я честно рекомендую другой подход. Отделите функциональность от содержания. Сохраните обработчик submit на document, как он уже есть, но переместите этот код на общую «родительскую» страницу, а не в динамически загружаемое содержимое. Таким образом, он выполняется только один раз при загрузке страницы и не требует повторного выполнения.

Обновляйте содержание сколь угодно часто, но определяйте общий функциональность один раз.

Другие вопросы по теме