Як не допустити подання форми?


243

У мене є форма, в якій десь є кнопка подання.

Однак я хотів би якось "зловити" подію подання та запобігти її виникненню.

Чи я можу це зробити?

Я не можу змінити кнопку подання, оскільки вона є частиною спеціального елемента керування.


Ви все одно можете отримати доступ до кнопки надсилання. Візуалізуйте сторінку та захопіть її ClientID, переглянувши джерело сторінки. Потім, використовуючи щось на зразок jQuery, ви можете зробити щось на зразок $ ('# ctl01_cph01_controlBtn1'). Click (function () {return false;});
повстанець

@Rafael: Правда ... але це було б в крайньому випадку - це дуже складний контроль.
Натан Осман

@Raf, що базується на asp.net, а також не найкраща практика. Але це по суті правильно. Я просто уникаю зазирнути до джерела та використовувати ім'я керування, оскільки це може змінитися, якщо хтось редагує сторінку. Непередбачувані побічні ефекти і таке.

Відповіді:


260

На відміну від інших відповідей, повернення falseє лише частиною відповіді. Розглянемо сценарій, за якого виникає помилка JS до оператора повернення ...

html

<form onsubmit="return mySubmitFunction(event)">
  ...
</form>

сценарій

function mySubmitFunction()
{
  someBug()
  return false;
}

повернення falseсюди не буде виконано, і форма буде подана в будь-якому випадку. Також слід зателефонувати, preventDefaultщоб запобігти дії форми за замовчуванням для подання форми у Ajax.

function mySubmitFunction(e) {
  e.preventDefault();
  someBug();
  return false;
}

У цьому випадку навіть із помилкою форма не надсилатиметься!

Як варіант, try...catchблок може бути використаний.

function mySubmit(e) { 
  e.preventDefault(); 
  try {
   someBug();
  } catch (e) {
   throw new Error(e.message);
  }
  return false;
}

4
Чому б не повернутися falseбезпосередньо з onsumbit?
ПрофК

1
Можливо, ви захочете показати повідомлення про помилку користувачеві під час подання. Наприклад, "заповніть це обов'язкове поле, а потім надішліть". У цьому випадку event.preventDefault стане дуже корисним
Марк Чорлі

1
@ProfK, якщо ви використовуєте event.preventDefault () це не має значення незалежно, спроба / лов буде просто частиною вашої помилки
Ben Rowe

11
<form onsubmit = "return mySubmitFunction (event)"> працював ... довелося використовувати слово event у дужках у firefox
daday74

5
@BenRowe Вам слід додати параметр evt до викликаного методу. (<form onsubmit="return mySubmitFunction(evt)">).В іншому випадку це дає Невизначена помилка.
UfukSURMEN

143

Ви можете використовувати вбудовані події, onsubmitяк це

<form onsubmit="alert('stop submit'); return false;" >

Або

<script>
   function toSubmit(){
      alert('I will not submit');
      return false;
   }
</script>

<form onsubmit="return toSubmit();" >

Демо

Тепер це може бути не дуже хорошою ідеєю при створенні великих проектів. Можливо, вам доведеться використовувати слухачів подій.

Будь ласка , прочитайте більше про Инлайн Події проти Прослуховувач подій (addEventListener і attachEvent в IE) тут . Бо я не можу пояснити це більше, ніж це зробив Кріс Бейкер .

Обидва є правильними, але жоден з них не є "найкращим" сам по собі, і може бути причина, яка розробник вирішив використовувати обидва підходи.


Гарне, швидке рішення в дорозі.
Фернандо Торрес

чомусь <form onsubmit="return false;" >не працює для мене.
Руан

102

Приєднайте слухача подій до форми за допомогою, .addEventListener()а потім викликайте .preventDefault()метод на event:

const element = document.querySelector('form');
element.addEventListener('submit', event => {
  event.preventDefault();
  // actual logic, e.g. validate the form
  console.log('Form submission cancelled.');
});
<form>
  <button type="submit">Submit</button>
</form>

Я думаю, що це краще рішення, ніж визначення submitобробника подій в onsubmitатрибуті, оскільки він розділяє логіку та структуру веб-сторінки. Набагато простіше підтримувати проект, де логіка відокремлена від HTML. Див.: Ненав'язливий JavaScript .

Використання .onsubmitвластивості formоб'єкта DOM не є хорошою ідеєю, оскільки це заважає приєднувати декілька зворотних зворотних дзвінків до одного елемента. Див. AddEventListener vs onclick .


1
& for jquery: $("button").click(function(e) { e.preventDefault() });
Nixen85

2
+1 не знаю, чому всі інші відповіді продовжують використовувати вбудовані підписки, оскільки ОП зазначив, що він не може змінити кнопку (це означає, що він, ймовірно, також не може змінити форму). Цікаво, чи є спосіб отримати "форму", якщо у нас є ідентифікатор кнопки
Роберт Сінклер

16

Спробуйте це ...

HTML-код

<form class="submit">
    <input type="text" name="text1"/>
    <input type="text" name="text2"/>
    <input type="submit" name="Submit" value="submit"/>
</form>

Код jQuery

$(function(){
    $('.submit').on('submit', function(event){
        event.preventDefault();
        alert("Form Submission stopped.");
    });
});

або

$(function(){
    $('.submit').on('submit', function(event){
       event.preventDefault();
       event.stopPropagation();
       alert("Form Submission prevented / stopped.");
    });
});

18
У цьому питанні немає тегу jQuery.
Michał Perłakowski

6
@Gothdo і все ж рішення все одно. божевільний правда?
Кевін Б

7
@Gothdo так, це точно так само. eventObject.preventDefault. Спосіб зв’язування обробника не змінює рішення. Я навіть запевняю, що ваша відповідь не відрізняється від прийнятої.
Кевін Б

stopPropagationбуло єдиним, що працювало в моєму випадку. Дякую! :)
Крегокс

13

На сьогоднішній день працює наступні роботи (протестовано в хромі та firefox):

<form onsubmit="event.preventDefault(); return validateMyForm();">

де validateMyForm () - функція, яка повертається, falseякщо перевірка не вдалася. Ключовим моментом є використання імені event. Ми не можемо використовувати, наприклад,e.preventDefault()


1
onsubmit = "повернути validateMyForm ();" достатньо, але validateMyForm () повинен повертати true або false.
Адріан П.

8
var form = document.getElementById("idOfForm");
form.onsubmit = function() {
  return false;
}

2
Я думаю, що використання .onsubmit- це погана ідея, оскільки вона заважає вам приєднувати кілька submitелементів зворотного дзвінка до одного елемента. Я рекомендую використовувати .addEventListener().
Michał Perłakowski

3
Навіть якщо ви встановили обробник подій через властивість .onsubmit, ви все одно можете додати додаткових обробників через .addEventListener (). Обробник, зареєстрований у власність, буде викликаний спочатку, а потім зареєстрований у .addEventListener () у тому порядку, в якому вони були зареєстровані.
Даніель Грейнджер

2

Дотримуватися ненав'язливих умов програмування JavaScript та залежно від швидкості завантаження DOM , може бути корисним використовувати наступне:

<form onsubmit="return false;"></form>

Потім підключіть події за допомогою програми onload або DOM, якщо ви використовуєте бібліотеку.

$(function() {
    var $form = $('#my-form');
    $form.removeAttr('onsubmit');
    $form.submit(function(ev) {
        // quick validation example...
        $form.children('input[type="text"]').each(function(){
            if($(this).val().length == 0) {
                alert('You are missing a field');
                ev.preventDefault();
            }
        });
    });
});
label {
    display: block;
}

#my-form > input[type="text"] {
    background: cyan;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<form id="my-form" action="http://google.com" method="GET" onsubmit="return false;">
    <label>Your first name</label>
    <input type="text" name="first-name"/>
    <label>Your last name</label>
    <input type="text" name="last-name" /> <br />
    <input type="submit" />
</form>

Крім того, я завжди використовував би actionатрибут, оскільки деякі люди можуть мати якийсь плагін, як NoScript, який би порушив перевірку. Якщо ви використовуєте атрибут дії, принаймні ваш користувач буде переспрямований сервером на основі перевірки на запуск. Якщо ви використовуєте щось на кшталт window.location, з іншого боку, все буде погано.


2

Для запобігання надсилання форми вам потрібно лише це зробити.

<form onsubmit="event.preventDefault()">
    .....
</form>

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


0

Ось моя відповідь:

<form onsubmit="event.preventDefault();searchOrder(event);">
...
</form>
<script>
const searchOrder = e => {
    e.preventDefault();
    const name = e.target.name.value;
    renderSearching();

    return false;
}
</script>

Додати event.preventDefault();на onsubmitі вона працює.


0

Ви можете додати eventListner до форми, яка preventDefault()перетворить дані форми в JSON, як показано нижче:

const formToJSON = elements => [].reduce.call(elements, (data, element) => {
  data[element.name] = element.value;
  return data;

}, {});

const handleFormSubmit = event => {
    event.preventDefault();
    const data = formToJSON(form.elements);
    console.log(data);
  //  const odata = JSON.stringify(data, null, "  ");
  const jdata = JSON.stringify(data);
    console.log(jdata);

    (async () => {
      const rawResponse = await fetch('/', {
        method: 'POST',
        headers: {
          'Accept': 'application/json',
          'Content-Type': 'application/json'
        },
        body: jdata
      });
      const content = await rawResponse.json();

      console.log(content);
    })();
};

const form = document.forms['myForm']; 
form.addEventListener('submit', handleFormSubmit);
<form id="myForm" action="/" method="post" accept-charset="utf-8">
    <label>Checkbox:
        <input type="checkbox" name="checkbox" value="on">
    </label><br /><br />

    <label>Number:
        <input name="number" type="number" value="123" />
    </label><br /><br />

    <label>Password:
        <input name="password" type="password" />
    </label>
    <br /><br />

    <label for="radio">Type:
        <label for="a">A
            <input type="radio" name="radio" id="a" value="a" />
        </label>
        <label for="b">B
            <input type="radio" name="radio" id="b" value="b" checked />
        </label>
        <label for="c">C
            <input type="radio" name="radio" id="c" value="c" />
        </label>
    </label>
    <br /><br />

    <label>Textarea:
        <textarea name="text_area" rows="10" cols="50">Write something here.</textarea>
    </label>
    <br /><br />

    <label>Select:
        <select name="select">
            <option value="a">Value A</option>
            <option value="b" selected>Value B</option>
            <option value="c">Value C</option>
        </select>
    </label>
    <br /><br />

    <label>Submit:
        <input type="submit" value="Login">
    </label>
    <br /><br />


</form>

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.