Gửi biểu mẫu bằng cách sử dụng nút bên ngoài thẻ <form>


301

Nói rằng tôi có:

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

<input type="submit" />

Làm cách nào để gửi biểu mẫu đó bằng nút gửi bên ngoài biểu mẫu, tôi nghĩ trong HTML5 có một thuộc tính hành động cho việc gửi nhưng tôi không chắc liệu đó có phải là trình duyệt chéo hoàn toàn không và dù sao nó cũng không có làm cái này?


2
Tôi không nghĩ bạn có thể làm điều đó mà không cần javascript. Làm thế nào trình duyệt sẽ biết nó là hình thức gì? Có thể có một số. Tại sao bạn không thể đặt nút gửi bên trong biểu mẫu?
Keith

1
Nếu bạn không muốn sử dụng JS thì với tôi có vẻ như không thể có trong html (<5), vì tò mò, tại sao bạn lại có kiểu sắp xếp như vậy trong mã?
Kumar

1
Tôi có một khu vực cài đặt nhiều tab với một nút để cập nhật tất cả, do thiết kế của nó, nút sẽ nằm ngoài biểu mẫu. Tôi sẽ bắt đầu sử dụng tùy chọn HTML5 hoặc giải pháp JS vì câu hỏi này dường như là dư thừa.
daryl

1
@Kumar, tôi cũng nghĩ rằng điều đó là không thể, nhưng có vẻ như nó không phải là stackoverflow.com/a/23456905/932473
dav

2
ngày nay, câu trả lời là developer.mozilla.org/en-US/docs/Web/HTML/Euity/
mẹo

Câu trả lời:


84

Cập nhật: Trong các trình duyệt hiện đại, bạn có thể sử dụng formthuộc tính để làm điều này .


Theo tôi biết, bạn không thể làm điều này mà không có javascript.

Đây là những gì thông số kỹ thuật nói

Các phần tử được sử dụng để tạo các điều khiển thường xuất hiện bên trong phần tử FORM, nhưng cũng có thể xuất hiện bên ngoài khai báo phần tử FORM khi chúng được sử dụng để xây dựng giao diện người dùng. Điều này được thảo luận trong phần về các sự kiện nội tại. Lưu ý rằng các điều khiển bên ngoài một biểu mẫu không thể là các điều khiển thành công.

Đó là sự táo bạo của tôi

Một submitnút được coi là một điều khiển.

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

Từ các ý kiến

Tôi có một khu vực cài đặt nhiều tab với một nút để cập nhật tất cả, do thiết kế của nó, nút sẽ nằm ngoài biểu mẫu.

Tại sao không đặt inputbên trong biểu mẫu, nhưng sử dụng CSS để đặt nó ở vị trí khác trên trang?


19
FYI, hỗ trợ HTML5, chưa hoàn hảo nhưng nó nhận được ở đó: impressivewebs.com/html5-form-attribute
Shackrock

6
Tôi đến hơi muộn ở đây, nhưng làm thế nào bạn có thể đặt đầu vào trong biểu mẫu, nhưng đặt nó ở một nơi khác?
cgf

Bạn có thể sử dụng thẻ <button> cho mục đích này cho html4
degr

Câu trả lời không còn giá trị, vì câu trả lời của Joe the Squirrel hoạt động - kể từ năm 2016.
Peter

có một mối quan tâm với các giải pháp JavaScript được đề xuất. trong Chrome mới nhất chẳng hạn, xác thực HTML5 (bắt buộc, v.v.) bị bỏ qua. một giải pháp tôi có thể nghĩ đến là có hai nút gửi, một nút ẩn. một nhấp chuột nên được kích hoạt trên nút ẩn. mẫu đơn không nên được gửi mà không có xác nhận hợp lệ.
người chiến thắng n.

612

Trong HTML5, có thuộc tính biểu mẫu . Về cơ bản

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

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

35
Điều này không hoạt động trên IE cho bất cứ ai có kế hoạch sử dụng nó. Tôi đã sử dụng nó nhưng sau đó quyết định thêm chức năng gọi lại sự kiện để gửi biểu mẫu theo cách thủ công trên trình duyệt IE.
racl101

1
Phiên bản IE nào chính xác?
mwld

11
Tôi đã làm điều này như một dự phòng duyên dáng: <button type="submit" form="frmFoo" onclick="!this.form&&$('#'+$(this).attr('form')).submit()">Như các thí nghiệm đã tiết lộ, this.form là hình thức đính kèm DomEuity, trong khi nó thì không. // chỉnh sửa: jQuery, nhưng có thể với vanilla, quá
ofc

2
Nếu bạn muốn xem thuộc tính biểu mẫu trong MS Edge, vui lòng bỏ phiếu tại đây: wpdev.uservoice.com/forums/257854-microsoft-edge-developer/ phỏng
mkurz

2
Một phiên bản vanilla-JS của dự phòng @ AdrianFöder sẽ là:<button type="submit" form="frmFoo" onclick="!this.form && document.getElementById('myform').submit()">
romaricdrigon

318

Một giải pháp hiệu quả với tôi, vẫn còn thiếu ở đây. Nó đòi hỏi phải có một phần tử ẩn <submit>hoặc <input type="submit">phần tử trực quan và phần tử được <form>liên kết <label>bên ngoài nó. Nó sẽ trông như thế này:

<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>

Bây giờ liên kết này cho phép bạn 'nhấp vào' <submit>phần tử biểu mẫu bằng cách nhấp vào <label>phần tử.


4
imho giải pháp tốt hơn mà không yêu cầu js và thay đổi lớn :)
Anton Hasan

52
Hoạt động trong IE 11 cũng vậy. Tôi biết, bạn không thường thấy "hoạt động" và "IE" trong cùng một câu.
shim

2
Giải pháp tốt hơn mà không có sự không tương thích. Nếu sử dụng Twitter Bootstrap, bạn chỉ có thể sử dụng "btn btn-sơ cấp" cho lớp css nhãn và nó hoạt động hoàn hảo.
Juanda

7
Giải pháp rất hay, tuy nhiên có thể có một sự phản đối khi sử dụng phương pháp này. A labelkhông phải là yếu tố có thể tập trung (AFAIK) vì vậy nó không trực quan cho người dùng chỉ sử dụng bàn phím để điều hướng đến 'nút' và sau đó nhấn phím cách để kích hoạt nút đó. (Tôi nhận ra rằng bạn có thể nhấn <enter>thay vào đó, nhưng đó không phải là cách duy nhất mọi người được sử dụng để điều hướng các biểu mẫu bằng bàn phím)
Auke

11
Để tập trung vào labelnút thông qua tab, bạn có thể sử dụng tabindexthuộc tính HTML: <label for="submit-form" tabindex="0">Submit</label>theo câu hỏi này
MarthyM

47

nếu bạn có thể sử dụng jQuery, bạn có thể sử dụng

<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>

Vì vậy, điểm mấu chốt là tạo một nút như Gửi và đặt nút gửi thực sự trong biểu mẫu (tất nhiên là ẩn nó) và gửi biểu mẫu bằng cách sử dụng jquery thông qua nhấp vào nút 'Gửi giả'. Hy vọng nó giúp.


1
Để làm cho nó hoạt động trên cả trình duyệt sẵn sàng HTML5 và IE, đây là jQuery của tôi$('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>

Điều này làm việc cho tôi, để có một nút gửi từ xa cho một hình thức.


cảm ơn bạn, vì tính năng đơn giản này tôi không muốn viết các dòng mã JS. PS: ứng dụng của tôi không cần hỗ trợ IE
Mani

1
Vui lòng bỏ phiếu tại đây nếu bạn muốn xem tính năng thuộc tính biểu mẫu trong MS Edge: wpdev.uservoice.com/forums/257854-microsoft-edge-developer/ trộm
mkurz

22

Tương tự như một giải pháp khác ở đây, với sửa đổi nhỏ:

<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


Đây là câu trả lời tốt nhất, IMO. Trực tiếp từ MDN trên thuộc tính biểu mẫu của nút: Phần tử biểu mẫu mà nút được liên kết với (chủ sở hữu biểu mẫu của nó). Giá trị của thuộc tính phải là thuộc tính id của phần tử <form> trong cùng một tài liệu. Nếu thuộc tính này không được chỉ định, phần tử <button> sẽ được liên kết với phần tử <form> tổ tiên, nếu tồn tại. Thuộc tính này cho phép bạn liên kết các phần tử <button> với các phần tử <form> ở bất kỳ đâu trong tài liệu, không chỉ là hậu duệ của các phần tử <form>.
AlexSashaRegan

Lưu ý: Điều đó không hoạt động trong Internet Explorer 11. Hãy thử tại đây: cdpn.io/mdix/debug/PooPqaM/PNAvYKNJojRr
Marc Dix

19

Thử cái này:

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

Mặc dù tôi sẽ đề nghị thêm một idbiểu mẫu và truy cập bằng cách đó thay vì document.forms[index].


1
Vâng, tôi biết làm thế nào để làm điều đó với javascript, nếu bạn nhìn tôi đã không gắn thẻ nó là javascript.
daryl

Tôi xin lỗi, không rõ ràng từ bài đăng của bạn rằng bạn đang tìm kiếm cách không phải là JS (Tôi nghĩ rằng bạn đã bỏ lỡ việc gắn thẻ nó dưới JS).
Ông trùm

1
Đây là cách tốt nhất để làm điều đó nếu bạn muốn gửi một biểu mẫu bên ngoài bằng một nút bên trong một biểu mẫu khác.
Vahid Amiri

11

Bạn luôn có thể sử dụng jQuery:

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

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

8

Đây là một giải pháp khá vững chắc kết hợp những ý tưởng tốt nhất cho đến nay cũng như bao gồm giải pháp của tôi cho một vấn đề nổi bật với Offerein. Không có javascript được sử dụng.

Nếu bạn quan tâm đến khả năng tương thích ngược với IE (và thậm chí cả Edge 13), bạn không thể sử dụng form="your-form" thuộc tính .

Sử dụng đầu vào gửi tiêu chuẩn không hiển thị và thêm nhãn cho nó bên ngoài biểu mẫu:

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

Lưu ý việc sử dụng display: none;. Đây là cố ý. Sử dụng .hiddenlớp của bootstrap xung đột với jQuery .show().hide() , và từ đó bị phản đối trong Bootstrap 4.

Bây giờ chỉ cần thêm nhãn cho trình của bạn, (theo kiểu cho bootstrap):

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

Không giống như các giải pháp khác, tôi cũng đang sử dụng tabindex - được đặt thành 0 - có nghĩa là chúng tôi hiện tương thích với việc gõ bàn phím. Thêm role="button"thuộc tính cho nó kiểu CSS cursor: pointer. Et voila. ( Xem câu đố này ).


Đẹp! Đã làm việc tuyệt vời với IE11 và firefox. Cảm ơn!
Eaglei22

@ Eaglei22 rất vui khi nghe nó :)
Jonathan

Nó rất hữu ích cho bạn để tập hợp tất cả các tính năng / đề xuất từ ​​nơi khác, vì vậy cảm ơn bạn. Tuy nhiên, mặc dù bây giờ bạn có thể tab vào nút / nhãn, tôi không thể thấy bất kỳ cách "nhấp" nào từ bàn phím, ví dụ: nhấn Enterkhông có tác dụng. Vì vậy, có thể tab để nó có vẻ hơi vô nghĩa. Có cách nào để làm điều này mà không cần sử dụng JavaScript không?
Andrew Willems

@AndrewWillems đó là một điểm tốt. Thật không may, tôi không thấy cách sử dụng bàn phím của bạn để kích hoạt sự kiện nhấp mà không có javascript. PS: nếu bài viết hữu ích cho bạn, vui lòng upvote. Nó không làm bạn mất bất cứ điều gì nhưng nó có ý nghĩa rất lớn đối với bất kỳ ai đưa ra câu trả lời hữu ích.
Jonathan

1
Và tôi cũng yêu bạn vì đã sửa <input... />cú pháp tự đóng cẩu thả và không hợp lệ , điều mà mọi người đều sử dụng một cách trắng trợn và không chính xác ở đây (cũng vậy), vào thẻ void no-close thích hợp! :) Kudos!
Sz.

3

Công việc này hoàn hảo! ;)

Điều này có thể được thực hiện bằng cách sử dụng Ajax và với cái mà tôi gọi là: "một phần tử nhân bản mẫu". Thay vào đó để gửi một biểu mẫu với một yếu tố bên ngoài, bạn có thể tạo một biểu mẫu giả mạo. Các hình thức trước đó là không cần thiết.

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

Mã ajax sẽ như thế nào:

    <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>

Điều này rất hữu ích nếu bạn muốn gửi một số dữ liệu trong một biểu mẫu khác mà không cần gửi biểu mẫu mẹ.

Mã này có thể có thể được điều chỉnh / tối ưu hóa theo nhu cầu. Nó hoạt động hoàn hảo !! ;) Cũng hoạt động nếu bạn muốn một hộp tùy chọn chọn như thế này:

<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>

Tôi hy vọng nó đã giúp một người như nó đã giúp tôi. ;)


1

Có lẽ điều này có thể hoạt động, nhưng tôi không biết đây có phải là HTML hợp lệ không.

<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
Câu trả lời này đã tồn tại cho chính câu hỏi này. stackoverflow.com/a/23456905/2968465
Jayant Bhawal

0

Tôi đã gặp sự cố khi cố gắng ẩn biểu mẫu khỏi thành phần ô của bảng, nhưng vẫn hiển thị nút gửi biểu mẫu. Vấn đề là phần tử biểu mẫu vẫn chiếm một khoảng trống thừa, làm cho định dạng của ô bảng của tôi trông lạ. Hiển thị: không có và khả năng hiển thị: các thuộc tính ẩn không hoạt động vì nó cũng sẽ ẩn nút gửi, vì nó được chứa trong biểu mẫu mà tôi đang cố gắng ẩn. Câu trả lời đơn giản là đặt chiều cao của biểu mẫu thành hầu như không có gì bằng CSS

Vì thế,

CSS -

    #formID {height:4px;}

đã làm cho tôi.


0

Tôi đã sử dụng cách này và loại thích nó, nó xác nhận mẫu trước khi gửi cũng tương thích với safari / google. không 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>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.