Зупинити подання поля у формі у формі


114

Я пишу javascript (жирна клавіша / сценарій користувача), яка вставить деякі поля введення у форму на веб-сайті.

Справа в тому, що я не хочу, щоб ці поля вводу жодним чином впливали на форму, я не хочу, щоб вони надсилалися під час подання форми, я лише хочу, щоб мій JavaScript мав доступ до їх значень.

Чи є якимось чином я можу додати деякі поля введення в середину форми і не подати їх під час подання форми?

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


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

6
Я не вірю, що неіменовані елементи форми з’являються під час подання форми - якщо ви можете написати свій JS для посилання на них за ідентифікатором, ви можете залишити їх імена порожніми, що фактично не дозволяє їм подавати.
gddc

2
залиште поле атрибута імені порожнім
deostroll

@Sarfraz Ahmed: Я пишу сценарій жирної ключі, тому я не маю контролю над веб-сайтом.
Жолудь

11
Відповідно до w3: бути включеним до подання форми. поле (елемент форми) повинно бути визначене в елементі форми і повинно мати атрибут імені. Елементи без імен або не містяться у формі, не подаються на сервер.
kennebec

Відповіді:


159

Ви можете вставити поля введення без атрибута "name":

<input type="text" id="in-between" />

Або ви можете просто видалити їх після надсилання (в jQuery) форми:

$("form").submit(function() {
   $(this).children('#in-between').remove();
});

7
Відмова від імені не дозволяє його надіслати? Класно, я цього не знав. Чи працює це у всіх браузерах? Це частина стандарту, або це химерність реалізації?
BlairHippo

2
@Acorn Я не зовсім впевнений, але про це варто прочитати. По суті, якщо ви опустите значення атрибута "name", ви не можете отримати доступ до цього значення жодним методом ... тож може бути, що це значення просто відкидається браузером. Якщо для вас це безпечно, перейдіть до параметра jquery / javascript (просто зауважте, що поля будуть подані, коли javascript легко відключений - тому не покладайтеся на нього жодним із ваших механізмів захисту).
Гал

17
Я перевіряв, залишаючи атрибут імені chrome, firefox, safari і, здається, поля форми подаються на сервер із порожньою рядком для імені. Я перевірив дані публікації за допомогою WebScarab і виявив, що дані надсилаються. Зараз я думаю, що мені доведеться відключити поля, щоб запобігти їх надсиланню.
kldavis4

1
@ kldavis4 - схоже, що і смуга (stripe.js), і Braintree (braintree.js) [посилання] braintreepayments.com/docs/python/guide/getting_paid використовують концепцію атрибута "залишаючи ім'я", щоб зупинити потрапляння даних на сервери. таким чином, зменшується потреба у відповідності "PCI" ... якщо ви скажете, що "дані" надсилаються, чи помиляються вони?
Рахул Діге


57

Найпростіше зробити це вставити елементи з disabledатрибутом.

<input type="hidden" name="not_gonna_submit" disabled="disabled" value="invisible" />

Таким чином, ви все ще можете отримати доступ до них як діти форми.

У полях з обмеженими можливостями є той недолік, що користувач взагалі не може взаємодіяти з ними, тому якщо у вас є disabledтекстове поле, користувач не може вибрати текст. Якщо у вас є disabledпрапорець, користувач не може змінити свій стан.

Ви також можете написати javascript для запуску під час подання форми, щоб видалити поля, які ви не бажаєте надсилати.


Ідея полягає в тому, щоб мої вставлені поля були корисними, щоб користувач міг змінити прапорці і т.д., а потім подати їх у свій javascript.
Жолудь

3
Інваліди все ще можуть працювати, якщо ви вимкнете лише поля під час надсилання або на основі вибраного прапорця. Таким чином, ви не просто викидаєте nameмайно, яке ви хочете затримати, якщо хочете, щоб воно було використане пізніше.
JMTyler

Це чудово, коли вам потрібно надіслати форму за допомогою AJAX і не хочете видаляти свої дані з форми або видаляти їх nameатрибут.
Нолонар

15

Проста спроба видалити атрибут імені з елемента введення.
Так це має бути схожим

<input type="checkbox" checked="" id="class_box_2" value="2">

Це має бути відповідь :))
Максіма Алекз

1
Це працює для прапорців. Зауважте, що це призведе до порушення автоматичного відміни іншого перемикача при використанні з перемикачами.
anre

10

Я просто хотів додати додатковий варіант: у свій ввід додайте тег форми та вкажіть назву форми, яка не існує на вашій сторінці:

<input form="fakeForm" type="text" readonly value="random value" />

1
хоча це, ймовірно, працює (не перевірено), якщо ви фактично не визначитесь fakeFormдеінде (не потрібно подавати), це призводить до недійсного HTML.
Брайан Х.

1
Якщо ви не хочете додавати javascript і вам потрібен вхід всередині форми при взаємодії з користувачем. Це, безумовно, найпростіше рішення з моєї точки зору.
yannisalexiou

1
ПРИМІТКА. Це рішення не працює з IE . Перевірте тут
Харві

@Harvey Yikes! Дякую за голову!
Джошуа Пінтер

9

Ви можете написати обробник подій, onsubmitякий видаляє nameатрибут з усіх полів введення, які ви хочете не включати до подання форми.

Ось короткий неперевірений приклад:

var noSubmitElements = [ 'someFormElementID1', 'someFormElementID2' ]; //...
function submitForm() {
    for( var i = 0, j = noSubmitElements.length; i < j; i++ ) {
        document.getElementById(noSubmitElements[i]).removeAttribute('name');
    }
}
form.onsubmit = submitForm;

2

Я знаю, що цей пост давній, але я все одно відповім. Найпростіший / найкращий спосіб, який я знайшов - це просто встановити ім’я в порожнє.

Поставте це перед поданням:

document.getElementById("TheInputsIdHere").name = "";

Загалом ваша функція подання може виглядати приблизно так:

document.getElementById("TheInputsIdHere").name = "";
document.getElementById("TheFormsIdHere").submit();

Ця форма все ще надсилатиме форму з усіма вашими іншими полями, але не надсилатиме форму без імені.


Простий і прямолінійний. Мені це подобається!
pbarney

2

Додати ввімкнено = "вимкнено" і в той час, коли jquery видаліть атрибут вимкнено, коли ви хочете надіслати його за допомогою .removeAttr ("вимкнено")

HTML:

<input type="hidden" name="test" value="test" disabled='disabled'/>

jquery:

$("input[name='test']").removeAttr('disabled');


2

Усі вищевказані відповіді вже говорили про те, що (не) називати контрольні форми або програмно їх видаляти, перш ніж фактично надсилати форму.

Хоча в
ході мого дослідження я знайшов ще одне рішення, про яке я не бачив згаданих у цій публікації: Якщо ви інкапсулюєте контрольні форми, ви хочете, щоб їх не обробляли / не надсилали, всередині іншого <form>тегу без methodатрибута ні path(і, очевидно, немає контролю над типом як кнопка або надіслати вкладені в неї кнопки), то подання батьківської форми не включатиме ці інкапсульовані елементи керування формою.

<form method="POST" path="/path">
  <input type="text" name="sent" value="..." />
  <form>
    <input type="text" name="notSent" value="..." />
  </form>
  <input type="submit" name="submit" value="Submit" />
</form>

Контрольне значення [name = "notSent"] не обробляється та не надсилається кінцевій точці POST сервера, але те, що з [name = "sent"], буде.

Це рішення може бути анекдотичним, але я все ще залишаю це для нащадків ...


Цікаве спостереження, але ви протестували це в різних браузерах? Цікаво, чи це за дизайном, специфікацією чи просто химерністю поведінки браузера. Чи це буде надійним методом у майбутньому, коли браузери змінюватимуться?
науковець

1

Обробіть подачу форми у функції через onSubmit () та виконайте щось на кшталт нижче, щоб видалити елемент форми: Використовуйте getElementById()DOM, потім використовуючи[object].parentNode.removeChild([object])

припустимо, що у вашому полі є атрибут id "my_removable_field" код:

var remEl = document.getElementById("my_removable_field");
if ( remEl.parentNode && remEl.parentNode.removeChild ) {
remEl.parentNode.removeChild(remEl);
}

Це дозволить отримати саме те, що ви шукаєте.


0

Вам навіть потрібні вони, щоб вони були вхідними елементами в першу чергу? Ви можете використовувати Javascript для динамічного створення знаків або абзаців чи списків або будь-якої іншої інформації, яка містить інформацію, яку ви хочете представити.

Але якщо інтерактивний елемент важливий і болить у прикладі, щоб розмістити ці елементи поза <form>блоком, потрібно було б видалити ці елементи з форми, коли сторінка надсилається.


Так, мені потрібно, щоб вони були елементами введення, тому що я намагаюся отримати введення користувача.
Жолудь

0
$('#serialize').click(function () {
  $('#out').text(
    $('form').serialize()
  );
});

$('#exclude').change(function () {
  if ($(this).is(':checked')) {
    $('[name=age]').attr('form', 'fake-form-id');
  } else {
    $('[name=age]').removeAttr('form');    
  }
  
  $('#serialize').click();
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<form action="/">
  <input type="text" value="John" name="name">
  <input type="number" value="100" name="age">
</form>

<input type="button" value="serialize" id="serialize">
<label for="exclude">  
  <input type="checkbox" value="exclude age" id="exclude">
  exlude age
</label>

<pre id="out"></pre>

На жаль, атрибут форми не працює в IE / Edge. caniuse.com/#search=form%20attribute
Джордж Геляр

0

Вам потрібно додати підписку у формі:

<form action="YOUR_URL" method="post" accept-charset="utf-8" onsubmit="return validateRegisterForm();">

І сценарій буде таким:

        function validateRegisterForm(){
        if(SOMETHING IS WRONG)
        { 
            alert("validation failed");
            event.preventDefault();
            return false;

        }else{
            alert("validations passed");
            return true;
        }
    }

Це працює для мене щоразу :)

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