Надішліть форму за допомогою кнопки поза тегом <form>


301

Скажіть, у мене є:

<form method="get" action="something.php">
    <input type="text" name="name" />
</form>

<input type="submit" />

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


2
Я не думаю, що ви можете це зробити без JavaScript. Як браузер дізнається, що це за форма? Їх може бути декілька. Чому ви не можете помістити кнопку надсилання всередину форми?
Кіт

1
якщо ви не хочете використовувати JS, то для мене це виглядає неможливо в html (<5), просто з цікавості, навіщо вам таке кодування в коді?
Кумар

1
У мене є область налаштувань з декількома вкладками з кнопкою для оновлення всіх, оскільки дизайн її кнопки буде поза формою. Я просто збираюся скористатися варіантом HTML5 або рішенням JS, оскільки це питання видається зайвим.
Дарил

1
@Kumar, я теж думав, що це буде неможливо, але, схоже, це не stackoverflow.com/a/23456905/932473
dav

Відповіді:


84

Оновлення: у сучасних браузерах ви можете використовувати formатрибут для цього .


Наскільки я знаю, ви не можете зробити це без javascript.

Ось що говорить специфікація

Елементи, що використовуються для створення елементів контролю, зазвичай з’являються всередині елемента FORM, але можуть також з’являтися поза декларацією елементів FORM, коли вони використовуються для побудови користувальницьких інтерфейсів. Про це йдеться в розділі про сутнісні події. Зауважте, що керування поза формою не може бути успішним.

Це мій сміливий

submitКнопка вважається контроль.

http://www.w3.org/TR/html4/interact/forms.html#h-17.2.1

З коментарів

У мене є область налаштувань з декількома вкладками з кнопкою для оновлення всіх, оскільки дизайн її кнопки буде поза формою.

Чому б не розмістити inputвнутрішню форму, а використовувати CSS, щоб розташувати її в іншому місці сторінки?


19
FYI, підтримка HTML5, не ідеально , але це як туди дістатися: impressivewebs.com/html5-form-attribute
Shackrock

6
Я трохи запізнююсь тут, але як можна поставити дані у форму, але розташувати її десь в іншому місці?
cgf

Ви можете використовувати тег <кнопку> для цих цілей для html4
град

Відповідь більше не є дійсною, оскільки відповідь Джо Білки працює - станом на 2016 рік.
Пітер

існує стурбованість запропонованими рішеннями JavaScript. Наприклад, в останньому Chrome пропускається перевірка HTML5 (необхідна тощо). одне рішення, про яке я можу подумати, - це дві кнопки подання, одна прихована. натискання має бути спровоковано на прихованій кнопці. форму не слід подавати без належної перевірки.
переможець н.

612

У HTML5 є атрибут форми . В основному

<form id="myform" method="get" action="something.php">
    <input type="text" name="name" />
</form>

<input type="submit" form="myform" />

35
Це не працює на IE для тих, хто планує ним користуватися. Я використовував це, але потім вирішив додати функцію зворотного виклику функції події, щоб вручну подати форму в браузерах IE.
racl101

1
Які саме версії IE?
mwld

11
Я зробив це як витончений запасний <button type="submit" form="frmFoo" onclick="!this.form&&$('#'+$(this).attr('form')).submit()">варіант : Як показали експерименти, this.form є доданою формою DomElement, хоча інакше це недійсно. // редагувати: jQuery, але можливо і з ваніллю також ofc
Adrian Föder

2
Якщо ви хочете побачити атрибут форми в MS Edge, будь ласка, проголосуйте тут: wpdev.uservoice.com/forums/257854-microsoft-edge-developer/…
mkurz

2
Ванільно-JS версія @ AdrianFöder резервна версія буде:<button type="submit" form="frmFoo" onclick="!this.form && document.getElementById('myform').submit()">
romaricdrigon

318

Рішення, яке для мене чудово працює, тут все ще відсутнє. Для цього потрібно мати візуально прихований <submit>або <input type="submit">елемент, що знаходиться в ньому <form>, і пов'язаний з ним <label>елемент поза ним. Це виглядатиме так:

<form method="get" action="something.php">
     <input type="text" name="name" />
     <input type="submit" id="submit-form" class="hidden" />
</form>

<label for="submit-form" tabindex="0">Submit</label>

Тепер це посилання дозволяє вам "клацнути" <submit>елемент форми , клацнувши по <label>елементу.


4
краще рішення imho без вимагати js та великих змін :)
Антон Хасан

52
Працює і в IE 11. Я знаю, ви не часто бачите "твори" та "IE" в одному реченні.
шим

2
Краще рішення без будь-яких несумісностей. Якщо ви використовуєте Twitter Bootstrap, ви можете просто використовувати "btn btn-basic" для класу css label, і це працює ідеально.
Хуанда

7
Дуже приємне рішення, проте може бути одне заперечення щодо використання цього методу. A labelне є фокусируемим елементом (AFAIK), тому користувачеві, який використовує клавіатуру лише для переходу до кнопки, не є інтуїтивно зрозумілим, а потім натисніть пробіл, щоб активувати цю кнопку, наприклад. (Я розумію, що ви можете натискати <enter>натомість, але це не єдиний спосіб, коли люди звикли навігацію по формах за допомогою клавіатури)
Auke

11
Щоб сфокусувати кнопку labelчерез вкладку, ви можете використовувати tabindexатрибут HTML: <label for="submit-form" tabindex="0">Submit</label>відповідно до цього питання
MarthyM

47

якщо ви можете використовувати jQuery, ви можете використовувати це

<form method="get" action="something.php" id="myForm">
    <input type="text" name="name" />

    <input type="submit" style="display:none" />
</form>

<input type="button" value="Submit" id="myButton" />

<script type="text/javascript">
    $(document).ready(function() {
       $("#myButton").click(function() {
           $("#myForm").submit();
       });
    });
</script>

Отже, підсумком є ​​створення кнопки "Надіслати" та розміщення у формі реальної кнопки подання (звичайно, приховуючи її) та надсилання форми за допомогою jquery, натиснувши кнопку "Підроблена подача". Сподіваюся, це допомагає.


1
Щоб він працював як у браузері, готовому до HTML5, так і в IE, ось мій jQuery$('button[form]').click(function (){ var formId = $(this).attr('form'); $('#' + formId).submit(); });
Snook

35
<form method="get" id="form1" action="something.php">

</form>

<!-- External button-->
<button type="submit" form="form1">Click me!</button>

Це працювало для мене, щоб мати кнопку віддаленої подачі форми.


дякую людино, за цю просту функцію я не хочу писати рядки коду JS. PS: моєму додатку не потрібно підтримувати IE
Mani

1
Будь ласка, проголосуйте тут, якщо ви хочете побачити особливість атрибуту форми у MS Edge: wpdev.uservoice.com/forums/257854-microsoft-edge-developer/…
mkurz

22

Подібно до іншого рішення тут, з незначними змінами:

<form method="METHOD" id="FORMID">
   <!-- ...your inputs -->
</form>
<button type="submit" form="FORMID" value="Submit">Submit</button>

https://www.w3schools.com/tags/att_form.asp


Це найкраща відповідь, ІМО. Прямо від MDN за атрибутом форми кнопки: Елемент форми, з яким пов’язана кнопка (її власник форми). Значення атрибута повинно бути атрибутом id елемента <form> у тому самому документі. Якщо цей атрибут не вказаний, елемент <button> буде асоційований з елементом <form> предка, якщо такий існує. Цей атрибут дозволяє вам пов’язувати елементи <button> з елементами <form> в будь-якому місці документа, а не лише як нащадки елементів <form>.
AlexSashaRegan

Будьте в курсі: це не працює в Internet Explorer 11. Спробуйте тут: cdpn.io/mdix/debug/PooPqaM/PNAvYKNJojRr
Marc Dix

19

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

<input type="submit" onclick="document.forms[0].submit();" />

Хоча я б запропонував додати форму idдо форми та отримати доступ замість цього document.forms[index].


1
Так, я знаю, як це зробити з javascript, якщо ви дивитесь, я не позначив його як JavaScript.
Дарил

Вибачте, не зрозуміло з вашої публікації, що ви шукаєте не JS-спосіб (я думав, що ви пропустили теги за JS).
Mrchief

1
Це найкращий спосіб зробити це, якщо ви хочете подати зовнішню форму за допомогою кнопки всередині іншої форми.
Вахід Амірі

11

Ви завжди можете використовувати jQuery:

<form id="myForm">
  <!-- form controls -->
</form>
<input type="submit" id="myButton">

<script>
$(document).ready(function () {
  $("#myButton").click(function () {
    $("#myForm").submit();
  });
});
</script>

8

Ось досить міцне рішення, яке включає найкращі ідеї на даний момент, а також включає моє вирішення проблеми, виділеної в Offerein. Не використовується JavaScript.

Якщо ви дбаєте про зворотну сумісність з IE (і навіть Edge 13), ви не можете використовувати цей form="your-form" атрибут .

Використовуйте стандартний вхід для подання з жодним відображенням та додайте мітку до нього поза формою:

<form id="your-form">
  <input type="submit" id="your-form-submit" style="display: none;">
</form>

Зверніть увагу на використання display: none;. Це навмисно. Використання .hiddenкласу bootstrap конфліктує з jQuery .show()і .hide()та з тих пір застаріло в Bootstrap 4.

Тепер просто додайте мітку для подання (в стилі завантажувального пристрою):

<label for="your-form-submit" role="button" class="btn btn-primary" tabindex="0">
  Submit
</label>

На відміну від інших рішень, я також використовую tabindex - встановлений на 0 - це означає, що ми зараз сумісні з клавіатурними вкладками. Додавання role="button"атрибуту надає йому стиль CSS cursor: pointer. Et voila. ( Дивіться цю скрипку ).


Приємно! Чудово співпрацював з IE11 та firefox. Дякую!
eaglei22

@ eaglei22 рада це почути :)
Джонатан

Вам дуже корисно зібрати всі функції / пропозиції з інших місць, тож дякую. Однак, незважаючи на те, що тепер ви можете натиснути на кнопку / мітку, я не бачу жодного способу "натискання" на неї з клавіатури, наприклад, натискання Enterне впливає. Таким чином, бути в змозі вкластися це здається трохи безглуздим. Чи можна це зробити без використання JavaScript?
Ендрю Віллемс

@AndrewWillems - це хороший момент. На жаль, я не бачу способу використання клавіатури для запуску події клацання без JavaScript. PS: якщо повідомлення було корисним для вас, будь ласка, підкажіть. Це нічого не коштує, але дуже багато значить для тих, хто дає корисні відповіді.
Джонатан

1
І я також люблю вас за те, щоб виправити неохайний і недійсний <input... />синтаксис самозакриття, який майже всі нахабно і неправильно використовує тут (теж), до належного тесту "void no-close"! :) Кудо!
Sz.

3

Це працює чудово! ;)

Це можна зробити за допомогою Ajax і з тим, що я називаю: "елемент дзеркала форми". Замість того, щоб надсилати форму з елементом зовні, ви можете створити підроблену форму. Попередня форма не потрібна.

<!-- This will do the trick -->
<div >
    <input id="mirror_element" type="text" name="your_input_name">
    <input type="button" value="Send Form">
</div>

Code ajax виглядає так:

    <script>
        ajax_form_mirror("#mirror_element", "your_file.php", "#your_element_response", "POST");

        function ajax_form_mirror(form, file, element, method) {
            $(document).ready(function() {
                // Ajax
                $(form).change(function() { // catch the forms submit event
                    $.ajax({                // create an AJAX call...
                        data: $(this).serialize(),      // get the form data
                        type: method,                   // GET or POST
                        url: file,                      // the file to call
                        success: function (response) {   // on success..
                        $(element).html(response);  // update the DIV
                        }
                    });

                    return false; // cancel original event to prevent form submitting
                });
            });
        }
   </script>

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

Цей код, ймовірно, може бути адаптований / оптимізований відповідно до потреби. Це прекрасно працює !! ;) Також працює, якщо ви хочете вибрати такий варіант:

<div>
    <select id="mirror_element" name="your_input_name">
        <option id="1" value="1">A</option>
        <option id="2" value="2">B</option>
        <option id="3" value="3">C</option>
        <option id="4" value="4">D</option>
    </select>
</div>

Я сподіваюся, що це допомогло комусь, як він мені допомогло. ;)


1

Можливо, це може спрацювати, але я не знаю, чи дійсний це HTML.

<form method="get" action="something.php">
    <input type="text" name="name" />
    <input id="submitButton" type="submit" class="hide-submit" />
</form>

<label for="submitButton">Submit</label>

3
Ця відповідь вже існує для самого цього питання. stackoverflow.com/a/23456905/2968465
Jayant Bhawal

0

У мене виникла проблема, коли я намагався приховати форму від елемента комірки таблиці, але все одно показую кнопку подання форм. Проблема полягала в тому, що елемент форми все ще займав зайве порожнє місце, завдяки чому формат комірки таблиці виглядав дивно. Дисплей: жоден та видимість: приховані атрибути не працювали, оскільки він також приховував кнопку подання, оскільки містився у формі, яку я намагався приховати. Проста відповідь полягала в тому, щоб встановити висоту форм майже нічого, використовуючи CSS

Тому,

CSS -

    #formID {height:4px;}

працював на мене.


0

Я використовував цей спосіб, і люб'язному він сподобався, він перевіряє форму перед тим, як подати також сумісний із safari / google. немає jquery nn

        <module-body>
            <form id="testform" method="post">
                <label>Input Title</label>
                <input name="named1" placeholder="Placeholder"  title="Please enter only alphanumeric characters." required="required" pattern="[A-Za-z0-9]{1,20}" />
                <alert>No Alerts!</alert>

                <label>Input Title</label>
                <input placeholder="Placeholder" title="Please enter only alphanumeric characters." required="required" pattern="[A-Za-z0-9]{1,20}" />
                <alert>No Alerts!</alert>

                <label>Input Title</label>
                <input placeholder="Placeholder" title="Please enter only alphanumeric characters." required="required" pattern="[A-Za-z0-9]{1,20}" />
                <alert>No Alerts!</alert>
            </form>
        </module-body>
        <module-footer>
            <input type="button" onclick='if (document.querySelector("#testform").reportValidity()) { document.querySelector("#testform").submit(); }' value="Submit">
            <input type="button" value="Reset">
        </module-footer>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.