Отправьте форму, используя кнопку вне тега <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
Дав
2
в настоящее время ответ - developer.mozilla.org/en-US/docs/Web/HTML/Element/…
совещание

Ответы:

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 для тех, кто планирует его использовать. Я использовал его, но затем решил добавить функцию обратного вызова submit, чтобы вручную отправить форму в браузерах IE.
racl101
1
Какие именно версии IE?
mwld
11
Я сделал это как изящный запасной вариант: <button type="submit" form="frmFoo" onclick="!this.form&&$('#'+$(this).attr('form')).submit()">как показали эксперименты, this.form является присоединенной формой DomElement, в то время как в противном случае он равен нулю. // edit: jQuery, но возможно и с ванилью, тоже ofcredrian
Адриан Фёдер
2
Если вы хотите видеть атрибут формы в MS Edge, пожалуйста, проголосуйте здесь: wpdev.uservoice.com/forums/257854-microsoft-edge-developer/…
mkurz
2
Версия @ AdrianFöder для ванильной версии JS будет выглядеть так:<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>элемент.

Offereins
источник
4
Лучшее решение Imho без JS и серьезных изменений :)
Антон Хасан
52
Работает в IE 11 тоже. Я знаю, что вы не часто видите "работы" и "IE" в одном предложении.
Шим
2
Лучшее решение без каких-либо несовместимостей. Если вы используете Twitter Bootstrap, вы можете просто использовать «btn btn-primary» для класса css label, и он отлично работает.
Juanda
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, нажав кнопку «Поддельная отправка». Надеюсь, поможет.

DAV
источник
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
Мани
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

mster
источник
Это лучший ответ, ИМО. Прямо из 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].

Mrchief
источник
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

Вот довольно солидное решение, которое включает в себя лучшие идеи, а также мое решение проблемы, выделенной Оффереином. Никакой 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класса начальной загрузки конфликтует с 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. И вуаля. ( См. Эту скрипку ).

Джонатан
источник
Ницца! Отлично работал с IE11 и Firefox. Спасибо!
eaglei22
@ eaglei22 рад это слышать :)
Джонатан
Для вас очень полезно собрать все функции / предложения из других мест, так что спасибо. Однако, несмотря на то, что теперь вы можете перейти к кнопке / метке, я не вижу способа «щелкнуть» ее с клавиатуры, например, нажатие не Enterимеет никакого эффекта. Таким образом, возможность вкладывать в него кажется немного бессмысленным. Есть ли способ сделать это без использования JavaScript?
Эндрю Виллемс
@ AndrewWillems, это хороший момент. К сожалению, я не вижу возможности использовать вашу клавиатуру для запуска события щелчка без JavaScript. PS: если пост был вам полезен, пожалуйста, проголосуйте. Это ничего не стоит, но много значит для тех, кто дает полезные ответы.
Джонатан
1
И я также люблю вас за исправление небрежного и недопустимого <input... />синтаксиса самозакрытия, который почти все явно и некорректно используют здесь (тоже), для правильного тега void no-close! :) Слава!
СЗ
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>

Код 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
Джаянт Бхавал,
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>
SotoArmando
источник