Запретить отправку нескольких форм с помощью Javascript

#javascript

#javascript

Вопрос:

У меня есть форма на основе HTML / PHP с двумя кнопками отправки — одна вверху и одна внизу. Мне нужно запретить людям нажимать «Отправить» несколько раз (тем самым создавая несколько записей в нашей базе данных), поэтому я использовал метод, найденный здесь, чтобы сделать так, чтобы кнопка отправки отключалась при нажатии, а текст на кнопке менялся с «Отправить» на «Отправить; пожалуйста, подождите…».

Сейчас у меня две проблемы:

  1. Отключается только верхняя кнопка в форме и изменяется ее текст. На нижнюю кнопку отправки это не влияет. Как мне сделать так, чтобы обе кнопки были отключены / изменены при отправке?
  2. На моей странице есть функция validateForm(), которая вызывается при нажатии кнопки Отправки. Таким образом, если пользователь не заполняет обязательное поле, отображается окно сообщения, и он возвращается к форме. Но теперь верхняя кнопка отправки по-прежнему отключена (и имеет измененный текст). Как мне «сбросить» кнопки обратно в их обычное включенное состояние «Отправить», если функция проверки обнаружит ошибки?

Вот соответствующие фрагменты кода. Если я удалю код, который отключает / изменяет кнопку, форма будет отправлена нормально (но, конечно, я не получу ту функциональность, которую ищу).

Тег формы:

 <form name="MyInquiry" method="post" autocomplete="off" onsubmit="document.getElementById('submitButtonTop').disabled=true;document.getElementById('submitButtonTop').value='Submitting, please wait...';document.getElementById('submitButtonBottom').disabled=true;document.getElementById('submitButtonBottom').value='Submitting, please wait...';return validateInquiryForm();">
 

Метки для кнопок:

 <input type="submit" name="submitinquiryform" id="submitButtonTop" value="Submit Form" />

<input type="submit" name="submitinquiryform" id="submitButtonBottom" value="Submit Form" />
 

Функция проверки:

     function validateInquiryForm() {



 var valid = true;
        var errorMessage = "";

        var emailFilter = /^([a-zA-Z0-9_.-]) @(([a-zA-Z0-9-]) .) ([a-zA-Z0-9]{2,4}) $/;

... code to validate individual fields ...

    if (!valid)
                alert(errorMessage);

            return valid;
        }
 

Спасибо,
Джон

Комментарии:

1. как насчет предоставления обеим кнопкам одинакового идентификатора / класса?

2. Нам нужно будет просмотреть часть вашего кода, чтобы дать правильные рекомендации.

3. @onatm: возможно, тот же класс, тот же идентификатор = bad. идентификаторы должны быть уникальными на странице.

4. @MarcB спасибо за ваш совет.

5. @onatm я думаю, ты саркастичен, когда сказал, что присвоил обеим кнопкам одинаковый идентификатор

Ответ №1:

@onatm: использование одного и того же идентификатора не поможет. JS будет обрабатывать только первый экземпляр тега, а не последующие.

Вы можете сделать что-то вроде этого….Используйте jquery. Дайте обеим кнопкам один и тот же класс, скажите «ОТПРАВИТЬ». Теперь напишите следующий код:

 var myForm = document.forms[0];
$(document).ready(function(){
    $(".SUBMIT").click(function(){
        if(validateInput()){
            $(".SUBMIT").attr("disabled", true).val("Submitting..");
            var url = "any URL you like";
            var data = {
                           field1: myForm.field1.value,
                           field2: myForm.field2.value,
                           .
                           .
                       };
            $.post(url, data,
                function(Result){
                    alert(Result); // Write whatever logic you want
                }
            )
            .complete(function(){
               $(".SUBMIT").attr("disabled", false).val("Submit");
            })
            .error(function(){
               alert("Some error");
               $(".SUBMIT").attr("disabled", false).val("Submit"); 
            });
        }
        else{
            alert("Enter the missing fields first"); // Write whatever your logic
        }
    });
});

function validateInput(){
    if (all fields are entered) // Write you logic here
        return true;
    else
        return false
}
 

Код должен решить вашу первую проблему. Для второй проблемы вам необходимо явно написать код для проверки подлинности для каждого поля в функции ValidateInput() .

Комментарии:

1. Если вы не знаете о jquery, просто загрузите любую версию jquery.1.6.x.js от jquery.com . Включите его в тег <HEAD> вашей веб-страницы, например, так <script src=»yourpath/jquery.1.6.x.js » /> Напишите код, который я опубликовал после этого.

2. по крайней мере, я сказал id / class 🙂 но спасибо вам и MarkB за разъяснение этого.

3. Спасибо; Я бы хотел избежать использования jquery, если это возможно. Это для работы, и я не уверен, что они захотели бы, чтобы я добавил это в форму. (Я ничего не знаю о jquery, так что, возможно, причин для беспокойства нет, но я хочу, чтобы решение было как можно более простым.)

4. @johnnyb10: Все в порядке. Но я действительно предлагаю попробовать, хотя и не в вашем проекте. Поначалу это выглядит сложно (почти для всех), но когда вы освоитесь с ним, вам понравится использовать его везде, где только сможете. Это сэкономит много времени и сил. На самом деле, это и есть монолог jquery… МЕНЬШЕ КОДИРУЙ, БОЛЬШЕ ДЕЛАЙ. Извините, но я НЕ заставляю вас им пользоваться.

Ответ №2:

 onsubmit="
    document.getElementById('myButtonTOP').disabled=true;
    document.getElementById('myButtonTOP').value='Submitting, please wait...';
    document.getElementById('myButtonBOTTOM').disabled=true;
    document.getElementById('myButtonBOTTOM').value='Submitting, please wait...';
    return true;"
 

Конечно, было бы лучше вызвать функцию javascript, объявленную в <script></script> регионе.

Поэтому я бы написал такую функцию, как…

 var mySubmitted = false;

function MyCheckSubmit()
{
    if (mySubmitted)
        return false; // Already submitted!

    if (!validateInquiryForm())
        return false; // Validation failed!

    // disable submit buttons

    document.getElementById('myButtonTOP').disabled=true;
    document.getElementById('myButtonTOP').value='Submitting, please wait...';
    document.getElementById('myButtonBOTTOM').disabled=true;
    document.getElementById('myButtonBOTTOM').value='Submitting, please wait...';

    // Store in our global variable that we submitted this form.
    mySubmitted = true;

    return true; // Ok, we can submit!
}
 

и, конечно, в форме

 onsubmit="return MyCheckSubmit();"
 

Это также сработает, если вы нажмете несколько раз клавишу «ввод» в текстовом поле ввода, поскольку для проверки того, была ли форма уже отправлена, используется внутренняя переменная.

Будьте осторожны, чтобы объявить блок сценария, конечно, перед формой, возможно, в разделе head.

Комментарии:

1. Спасибо, это то, что я делаю, и, похоже, это работает в том, что касается отключения / изменения кнопок. Но на самом деле это не отправляет форму; в моей базе данных не создаются записи.

2. Спасибо; Я попробовал эту новую версию, и, похоже, она частично сработала. Форма была отправлена правильно, но метки кнопок не обновлялись, и кнопки не отключались. Затем я понял, что у меня неправильные имена кнопок; Я еще не изменил имена кнопок, которые вы использовали в своем примере. Итак, я исправил названия кнопок, но теперь у меня обратная проблема: кнопки отключены / изменены, но форма не отправляется. Есть идеи?

Ответ №3:

вы можете поместить это в правильное состояние, когда будут выполнены условия проверки формы, таким образом, отключив только при отправке, вам нужно будет вернуть «this» в качестве ссылки в вашем onsubmit="return MyCheckSubmit(this);"

   var topButton = document.MyInquiry.submitinquiryform; // top
  var botomButton = document.otherMyInquiry.submitinquiryform; // bottom

 if(beingSubmitted.name == "MyInquiry"){ 

   topButton.value = "Please wait...";
   //beingSubmitted.action = "process.php" // action page
   beingSubmitted.submit();

  }else{
   //beingSubmitted.action = "process2.php" // action page
    botomButton.value = "Please wait...";
    beingSubmitted.submit();
}
//beingSubmitted.action = "process.php" // action page would handle for both form you could check which form is being submitted by sending a value in a hidden filed 
 topButton.disabled = true;
 botomButton.disabled = true; 
 

Я заметил, что у вас нет никаких действий в форме