ปุ่ม HTML เพื่อไม่ส่งแบบฟอร์ม


370

ฉันมีแบบฟอร์ม นอกฟอร์มนั้นฉันมีปุ่ม ปุ่มง่าย ๆ เช่นนี้:

<button>My Button</button>

อย่างไรก็ตามเมื่อฉันคลิกมันก็จะส่งแบบฟอร์ม นี่คือรหัส:

<form id="myform">
    <input />
</form>
<button>My Button</button>

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

<button onclick="document.getElementById('myform').doNotSubmit();">My Button</button>

3
ปัญหานี้ไม่สามารถทำซ้ำได้ในเบราว์เซอร์สมัยใหม่และปัญหานี้อาจเกิดจากความเข้าใจผิด ในขณะที่ค่าเริ่มต้นสำหรับbuttonคือtype=submitไม่มีรูปแบบที่จะส่งเมื่อbuttonองค์ประกอบอยู่นอกรูปแบบใด ๆ เว้นแต่จะมีการสาธิตจริง (ตัวอย่างเอกสารการระบุเบราว์เซอร์และคำอธิบายของการสังเกตที่แสดงว่ามีการส่งแบบฟอร์ม) คำถามนี้ควรถูกปิดเพราะไม่สามารถทำซ้ำได้ การใช้type=buttonเป็นการฝึกฝนที่ดี แต่สิ่งนี้ไม่ได้ทำให้ปัญหาเกิดขึ้นจริง
Jukka K. Korpela

คำตอบ:


894

ฉันคิดว่านี่เป็นลักษณะเฉพาะที่น่ารำคาญที่สุดของ HTML ... ปุ่มนั้นต้องเป็นปุ่ม "type" เพื่อไม่ให้ส่ง

<button type="button">My Button</button>

อัปเดต 5-Feb-2019:ตามHTML Living Standard (และข้อกำหนด HTML 5 ):

หายไปค่าเริ่มต้นและเริ่มต้นค่าไม่ถูกต้องเป็นรัฐส่งปุ่ม


9
@Powerlave เหตุผลใดที่จะไม่to use <button>
Sandip Pingle

4
@SandipPingle ไม่มีเหตุผลที่จะใช้มันยกเว้นว่าคุณต้องการสไตล์ที่ซับซ้อนจริงๆ นอกจากนี้ IE6 และ IE7 (โชคดีที่ถูกเลิกใช้งาน) จัดการ <button>อย่างไม่ถูกต้องในบางกรณี นอกจาก<button>นี้ไม่สามารถใช้งานข้ามเบราว์เซอร์ได้ 100% ในเบราว์เซอร์ที่แตกต่างกันอาจส่งค่าที่แตกต่างกันสำหรับสิ่งเดียวกัน<button>เมื่อใช้ในรูปแบบ
Powerslave

35
นี่คือคำตอบที่ดี แต่ก็ไม่ได้เป็นความผิดปกติ ค่าเริ่มต้นของtypeแอตทริบิวต์ในแท็ก<button> submitเมื่อเปลี่ยนไปtype=buttonที่<button>จะได้รับการทำงานเริ่มต้นไม่มี ดูแอtypeททริบิวที่นี่: developer.mozilla.org/en-US/docs/Web/HTML/Element/button
Michael Benjamin

1
อะไรคือความคิด<button type='submit'>ที่ว่ามันยากเกินไปสำหรับฉันฮ่าฮ่า อย่างไรก็ตามคำตอบของคุณใช้งานได้ดี!
divHelper11

2
พฤติกรรมเริ่มต้น (และโดยนัย) พฤติกรรมขององค์ประกอบที่ไม่ใช่แบบฟอร์มที่เฉพาะเจาะจงคือการเรียกการทำงานของฟังก์ชั่นที่เฉพาะเจาะจงแบบฟอร์มที่อาจทำลายล้าง นั่นไม่ใช่การตัดสินใจออกแบบที่แปลกประหลาดสำหรับสเป็ค HTML ที่ต้องทำ
HonoredMule

36

return false;ในตอนท้ายของตัวจัดการ onclick จะทำงาน อย่างไรก็ตามมันจะเป็นการดีกว่าถ้าคุณเพิ่มtype="button"เข้าไปใน<button>- วิธีนั้นจะทำงานได้อย่างถูกต้องแม้ว่าจะไม่มี JavaScript ก็ตาม


1
ปุ่มที่ไม่ส่งแบบฟอร์มมีประโยชน์เฉพาะเมื่อเปิดใช้งาน JavaScript อยู่แล้ว ... ฉันยอมรับว่า type = "button" นั้นสะอาดกว่า
ThiefMaster

2
return false;ไม่สามารถใช้งานได้ในทุกสถานการณ์ในขณะtype="Button"นั้น แม้จะเปิดใช้งาน JavaScript
brejoc

15

Dave Markle ถูกต้อง จากเว็บไซต์ของ W3School :

ระบุแอตทริบิวต์ type สำหรับปุ่มทุกครั้ง ประเภทเริ่มต้นสำหรับ Internet Explorer คือ "ปุ่ม" ในขณะที่เบราว์เซอร์อื่น ๆ (และในข้อกำหนด W3C) จะเป็น "ส่ง"

กล่าวอีกนัยหนึ่งเบราว์เซอร์ที่คุณใช้นั้นเป็นไปตามข้อกำหนดของ W3C


15

โดยค่าเริ่มต้นปุ่ม html จะส่งแบบฟอร์ม

นี่คือความจริงที่ว่าแม้ปุ่มที่อยู่ด้านนอกของแบบฟอร์มทำหน้าที่เป็นผู้ส่ง (ดูเว็บไซต์ W3Schools: http://www.w3schools.com/tags/att_button_form.asp )

กล่าวอีกนัยหนึ่งประเภทของปุ่มคือ "ส่ง" โดยค่าเริ่มต้น

<button type="submit">Button Text</button>

ดังนั้นวิธีที่ง่ายที่จะได้รับรอบนี้คือการใช้ประเภทปุ่ม

<button type="button">Button Text</button>

ตัวเลือกอื่น ๆ รวมถึงการคืนค่าเท็จเมื่อสิ้นสุดonclickหรือตัวจัดการอื่น ๆ เมื่อคลิกปุ่มหรือใช้แท็ก <input> แทน

หากต้องการข้อมูลเพิ่มเติมดูที่ปุ่มข้อมูลของ Mozilla Developer Network: https://developer.mozilla.org/en/docs/Web/HTML/Element/button


3

ขอแนะนำไม่ให้ใช้<Button>แท็ก ใช้<Input type='Button' onclick='return false;'>แท็กแทน (การใช้ "return false" ไม่ควรส่งแบบฟอร์ม)

วัสดุอ้างอิงบางอย่าง


2
มันเพียงพอที่จะใช้<input type="button" />และก็เพียงพอแล้วreturn false;- ไม่จำเป็นต้องทำทั้งสองอย่าง
Tom

ฉันไม่เห็นด้วยที่จะไม่แนะนำให้ใช้แท็กปุ่ม หากคุณไม่ได้ใช้งานคุณจะสูญเสียคุณสมบัติการเข้าถึงบางอย่างที่คุณจะได้รับโดยอัตโนมัติด้วยแท็กปุ่ม ฉันว่าแท็กปุ่มแนะนำจริง ๆ แล้วสำหรับองค์ประกอบที่ทำหน้าที่เป็นปุ่ม
CookieMonster

ตามบันทึกย่อในเอกสารอ้างอิงที่คุณเชื่อมโยง: "ในขณะที่องค์ประกอบ <input> ของปุ่มประเภทยังคงเป็น HTML ที่ถูกต้องสมบูรณ์องค์ประกอบ <button> ที่ใหม่กว่าจะเป็นวิธีที่โปรดปรานในการสร้างปุ่ม" ดังนั้นจึงเป็นสิ่งที่ตรงกันข้ามที่คุณระบุไว้
jedzej

1

ด้วยเหตุผลการเข้าถึงฉันไม่สามารถดึงออกด้วยtype=submitปุ่มหลายปุ่มได้ วิธีเดียวที่จะทำงานโดยกำเนิดกับformมีปุ่มหลาย แต่เพียงหนึ่งสามารถส่งแบบฟอร์มเมื่อกดปุ่มEnterที่สำคัญคือเพื่อให้แน่ใจว่ามีเพียงหนึ่งในนั้นคือของtype=submitในขณะที่คนอื่น ๆ ที่อยู่ในประเภทอื่น ๆ type=buttonเช่น ด้วยวิธีนี้คุณจะได้รับประโยชน์จากประสบการณ์การใช้งานที่ดีขึ้นในการจัดการแบบฟอร์มบนเบราว์เซอร์ในแง่ของการสนับสนุนแป้นพิมพ์


0

ตัวเลือกอื่นที่ใช้งานได้สำหรับฉันคือการเพิ่ม onsubmit = "return false;" ไปที่แท็กแบบฟอร์ม

<form onsubmit="return false;">

ความหมายอาจไม่ดีเท่าวิธีแก้ไขข้างต้นของการเปลี่ยนประเภทปุ่ม แต่ดูเหมือนจะเป็นตัวเลือกหากคุณต้องการให้องค์ประกอบของฟอร์มไม่ส่ง

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