ส่งแบบฟอร์มโดยใช้ปุ่มนอกแท็ก <form>


301

พูดว่าฉันมี:

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

<input type="submit" />

ฉันจะส่งฟอร์มที่มีปุ่มส่งที่อยู่นอกฟอร์มได้อย่างไรฉันคิดว่าใน HTML5 มีแอตทริบิวต์การดำเนินการสำหรับส่ง แต่ฉันไม่แน่ใจว่าเป็นเบราว์เซอร์ที่สมบูรณ์หรือไม่และถ้าไม่มี ทำเช่นนี้?


2
ฉันไม่คิดว่าคุณสามารถทำได้โดยไม่มีจาวาสคริปต์ เบราว์เซอร์จะรู้ได้อย่างไรว่ามันคืออะไร อาจมีหลายอย่าง ทำไมคุณไม่สามารถใส่ปุ่มส่งภายในแบบฟอร์มได้
Keith

1
หากคุณไม่ต้องการใช้ JS จากนั้นสำหรับฉันดูเหมือนว่าเป็นไปไม่ได้ในรูปแบบ html (<5) จากความอยากรู้อยากเห็นทำไมคุณถึงมีข้อตกลงในรูปแบบดังกล่าว?
Kumar

1
ฉันมีพื้นที่การตั้งค่าแบบแท็บหลายปุ่มพร้อมด้วยการอัปเดตทั้งหมดเนื่องจากการออกแบบของมันปุ่มจะอยู่ด้านนอกของแบบฟอร์ม ฉันแค่จะหมุนด้วยตัวเลือก HTML5 หรือโซลูชัน JS เนื่องจากคำถามนี้ดูเหมือนจะซ้ำซ้อน
daryl

1
@ Kumar ฉันยังคิดว่ามันเป็นไปไม่ได้ แต่ดูเหมือนว่าไม่ใช่stackoverflow.com/a/23456905/932473
dav

2
ทุกวันนี้คำตอบคือdeveloper.mozilla.org/en-US/docs/Web/HTML/Element/…
caub

คำตอบ:


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

คุณสามารถใช้แท็ก <button> สำหรับวัตถุประสงค์นี้เพื่อ html4
degr

คำตอบนั้นไม่ถูกต้องอีกต่อไปเนื่องจากคำตอบของ Joe the Squirrel ทำงานได้ตั้งแต่ปี 2016
Peter

มีข้อกังวลกับโซลูชัน JavaScript ที่เสนอ ใน Chrome ล่าสุดตัวอย่างเช่นการตรวจสอบความถูกต้องของ HTML5 (จำเป็นเป็นต้น) ทางออกหนึ่งที่ฉันนึกได้คือมีปุ่มส่งสองปุ่มปุ่มหนึ่งซ่อนอยู่ คลิกควรถูกเรียกใช้บนปุ่มที่ซ่อนอยู่ ไม่ควรส่งแบบฟอร์มโดยไม่มีการตรวจสอบความถูกต้องที่เหมาะสม
ผู้ชนะ n

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
fallback @ AdrianFöderเวอร์ชัน vanilla-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>องค์ประกอบ


4
วิธีการแก้ปัญหา IMHO ดีกว่าโดยไม่ต้อง js และการเปลี่ยนแปลงที่สำคัญ :)
แอนตันฮะซัน

52
ทำงานใน IE 11 ด้วย ฉันรู้ว่าคุณมักจะไม่เห็น "งาน" และ "IE" ในประโยคเดียวกัน
ชิม

2
ทางออกที่ดีกว่าโดยไม่มีความเข้ากันไม่ได้ หากใช้ Twitter Bootstrap คุณสามารถใช้ "btn btn-primary" สำหรับคลาส css ฉลากและใช้งานได้สมบูรณ์
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 ผ่านการคลิกที่ปุ่ม 'ส่งปลอม' หวังว่ามันจะช่วย


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


นี่คือคำตอบที่ดีที่สุด IMO ส่งตรงจาก 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();" />

ถึงแม้ว่าผมจะขอแนะนำการเพิ่มรูปแบบและการเข้าถึงโดยที่แทนiddocument.forms[index]


1
ใช่ฉันรู้ว่าจะทำอย่างไรกับจาวาสคริปต์ถ้าคุณดูฉันไม่ได้ติดแท็กเป็นจาวาสคริปต์
daryl

ขออภัยไม่ชัดเจนจากโพสต์ที่คุณกำลังมองหาวิธีที่ไม่ใช่ JS (ฉันคิดว่าคุณพลาดการติดแท็กภายใต้ JS)
Mrchief

1
นี่เป็นวิธีที่ดีที่สุดถ้าคุณต้องการส่งแบบฟอร์มภายนอกโดยใช้ปุ่มภายในฟอร์มอื่น
Vahid Amiri

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 ไม่ใช้จาวาสคริปต์

หากคุณสนใจความเข้ากันได้ย้อนหลังกับ 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's .show()และ.hide()และได้ถูกเลิกใช้แล้วใน Bootstrap 4

ตอนนี้เพียงเพิ่มป้ายกำกับสำหรับการส่งของคุณ (สไตล์สำหรับ bootstrap):

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

ไม่เหมือนกับโซลูชันอื่น ๆ ฉันยังใช้tabindex - ตั้งค่าเป็น 0 ซึ่งหมายความว่าตอนนี้เราเข้ากันได้กับการแท็บคีย์บอร์ด เพิ่มแอตทริบิวต์ให้มันรูปแบบrole="button" CSS cursor: pointerและ voila ( ดูซอนี้ )


ดี! ทำงานได้ดีกับ IE11 และ firefox ขอบคุณ!
eaglei22

@ eaglei22 ดีใจที่ได้ยิน :) :)
Jonathan

เป็นประโยชน์อย่างมากสำหรับคุณที่จะรวบรวมคุณสมบัติ / คำแนะนำทั้งหมดจากที่อื่นดังนั้นขอขอบคุณ อย่างไรก็ตามแม้ว่าตอนนี้คุณสามารถแท็บปุ่ม / ฉลากฉันไม่เห็นวิธี "คลิก" จากแป้นพิมพ์เช่นการกดEnterไม่มีผลใด ๆ ดังนั้นความสามารถในการแท็บดูเหมือนว่าไม่มีจุดหมายเล็กน้อย มีวิธีทำโดยไม่ใช้ JavaScript หรือไม่
Andrew Willems

@ AndrewWillems เป็นจุดที่ดี น่าเสียดายที่ฉันไม่เห็นวิธีการใช้แป้นพิมพ์ของคุณเพื่อเรียกใช้เหตุการณ์การคลิกโดยไม่ใช้จาวาสคริปต์ PS: ถ้าโพสต์เป็นประโยชน์กับคุณโปรด upvote ไม่เสียค่าใช้จ่าย แต่อย่างใด แต่มีความหมายอย่างมากสำหรับผู้ที่สร้างคำตอบที่เป็นประโยชน์
Jonathan

1
และฉันก็รักคุณในการแก้ไข<input... />ไวยากรณ์การปิดตัวเองที่เลอะเทอะและไม่ถูกต้องซึ่งเกือบทุกคนใช้อย่างโจ๋งครึ่มและไม่ถูกต้องที่นี่ (ด้วย) ไปยังแท็กโมฆะที่ไม่ปิด :) รุ่งโรจน์!
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>

โค้ดอาแจ็กซ์จะเป็นอย่างไร:

    <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

ฉันใช้วิธีนี้และชอบมันมันตรวจสอบแบบฟอร์มก่อนที่จะส่งยังเข้ากันได้กับซาฟารี / 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>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.