แบบฟอร์มที่ไม่มีการดำเนินการและโดยที่ Enter จะไม่โหลดหน้าซ้ำ


96

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


คุณต้องการที่จะไม่ส่งหรือไม่
UpTheCreek

หากคุณมีเพียง <form> ที่มี <input> ช่องเดียวที่เป็นช่องข้อความก็ไม่ควรส่งเมื่อคุณกด Enter ควรหรือไม่
Zack The Human

ฉันต้องการให้ส่งตามเงื่อนไขอื่น ๆ (ในความเป็นจริงการกดปุ่มบางปุ่ม) ปัญหาคือฉันไม่สามารถรับพฤติกรรม 'enter while in text field' ของการโพสต์ / ไปที่ url เดียวกันเพื่อไม่ให้เกิดขึ้น ดังนั้นแบบฟอร์มที่ฉันสร้างขึ้นอย่างระมัดระวังซึ่งคุณต้องทำ X, Y และ Z เพื่อให้ส่งได้ผู้ใช้กด Enter
Matt Roberts

คำตอบ:


44

เพิ่มตัวจัดการ onsubmit ในแบบฟอร์ม (ผ่าน js ธรรมดาหรือ jquery $ (). submit (fn)) และส่งคืนเท็จเว้นแต่ว่าเงื่อนไขเฉพาะของคุณจะตรงตามเงื่อนไข

เว้นแต่คุณจะไม่ต้องการให้ส่งแบบฟอร์ม แต่ในกรณีนี้ทำไมไม่เพียงแค่ปล่อยแอตทริบิวต์ "action" ไว้ในองค์ประกอบแบบฟอร์ม


155
แบบฟอร์มที่ไม่มีactionแอตทริบิวต์ไม่ใช่รูปแบบตามมาตรฐาน - และจะทำให้เกิดการโหลดหน้าซ้ำในเบราว์เซอร์บางตัว .. ฉันพบว่าaction="javascript:void(0);"ทำงานได้ดี
Dutchie432

คำตอบ Dutchies ทำงานได้อย่างสมบูรณ์แบบ Firefox เพิ่งรีเฟรชหน้า
IAmGroot

1
@ Dutchie432 ควรทำให้เป็นคำตอบแทนที่จะแสดงความคิดเห็น จากนั้นมันจะขึ้นสู่จุดสูงสุดที่เป็นของมัน หรืออีกวิธีหนึ่ง KPrime สามารถปรับคำตอบของเขาได้เนื่องจากการละเว้นการกระทำนั้นไม่ได้ผลสำหรับฉัน ...
ปราชญ์

216

คุณจะต้องรวมไว้action="javascript:void(0);"ในแบบฟอร์มของคุณเพื่อป้องกันการโหลดหน้าซ้ำและรักษามาตรฐาน HTML


4
ใช้เวลาเพียง 2 วันในการพยายามระงับการทำงานเริ่มต้นของปุ่มส่งเมื่อกด Enter เนื่องจากแม้ว่าจะมีการดำเนินการเกิดขึ้น แต่หน้าก็โหลดซ้ำ (Firefox) การเพิ่ม javascript เป็นโมฆะเป็นการดำเนินการในแบบฟอร์มได้รับการแก้ไข ขอบคุณสำหรับสิ่งนั้น
Tony Payne

ขอบคุณสำหรับคำตอบเพิ่มเติมนี้ วิธีนี้ยังใช้งานได้ แต่นี่ยังคงเป็นโซลูชัน "ล้ำสมัย" ในปี 2559 หรือไม่
low_rents

1
@low_rents ฉันยังคงใช้มันตลอดเวลาและไม่พบวิธีแก้ปัญหาที่ดีกว่าเป็นการส่วนตัว
Dutchie432

1
ขอบคุณสำหรับวิธีการแก้ปัญหาที่แม่นยำและยอดเยี่ยมในการแก้ไขปัญหาการโหลดหน้าซ้ำขณะกดปุ่ม Enter :) ทางออกที่ดีที่สุด
Imran Rafiq ค่อนข้าง

9

เพียงเพิ่มเหตุการณ์นี้ในช่องข้อความของคุณ จะป้องกันการส่งเมื่อกด Enter และคุณสามารถเพิ่มปุ่มส่งหรือแบบฟอร์มการโทรส่ง () ได้ตามต้องการ:

onKeyPress="if (event.which == 13) return false;"

ตัวอย่างเช่น:

<input id="txt" type="text" onKeyPress="if (event.which == 13) return false;"></input>

1
ขอบคุณสำหรับสิ่งนั้น. ฉันกลัวว่าความชัดเจนของคำตอบของคุณทำให้ฉันเข้าใจความถูกต้องของคำตอบก่อนหน้านี้อย่างชัดเจนดังนั้นคุณจึงไม่ได้รับคำตอบที่ยอมรับ แต่คุณจะได้รับความขอบคุณและการโหวตเพิ่ม!
Matt Roberts

2
ขอขอบคุณ. ดีใจที่ได้ช่วยเหลือ ฉันไม่เคยเป็นหนึ่งในไฟแก็ซอยู่แล้ว ;)
GenericMeatUnit

5

เมื่อคุณกด Enter ในรูปแบบพฤติกรรมตามธรรมชาติของฟอร์มจะถูกส่งเพื่อหยุดพฤติกรรมนี้ซึ่งไม่เป็นธรรมชาติคุณต้องป้องกันไม่ให้ส่ง (พฤติกรรมเริ่มต้น) ด้วย jquery:

$("#yourFormId").on("submit",function(event){event.preventDefault()})

4

ความคิด:

<form method="POST" action="javascript:void(0);" onSubmit="CheckPassword()">
    <input id="pwset" type="text" size="20" name='pwuser'><br><br>
    <button type="button" onclick="CheckPassword()">Next</button>
</form>

และ

<script type="text/javascript">
    $("#pwset").focus();
    function CheckPassword()
    {
        inputtxt = $("#pwset").val();
        //and now your code
        $("#div1").load("next.php #div2");
        return false;
    }
</script>

1

สองวิธีในการแก้ปัญหา:

  1. ค่าการดำเนินการของฟอร์มคือ "javascript: void (0);"
  2. เพิ่มตัวฟังเหตุการณ์การกดแป้นสำหรับแบบฟอร์มเพื่อป้องกันการส่ง

การฟังเหตุการณ์การกดแป้น (เช่นปุ่ม Enter) อาจทำให้คุณมีปัญหากับtextareas และอาจเลือกการเติมข้อความอัตโนมัติหรือรายการแบบเลื่อนลงและอุปกรณ์เคลื่อนที่อาจเป็นสาเหตุของปัญหาอื่น
luckydonald

0

คำตอบแรกคือทางออกที่ดีที่สุด:

เพิ่มตัวจัดการ onsubmit ในแบบฟอร์ม (ผ่าน js ธรรมดาหรือ jquery $ (). submit (fn)) และส่งคืนเท็จเว้นแต่ว่าเงื่อนไขเฉพาะของคุณจะตรงตามเงื่อนไข

เฉพาะเจาะจงมากขึ้นด้วย jquery:

$('#your-form-id').submit(function(){return false;});

เว้นแต่คุณจะไม่ต้องการให้ส่งแบบฟอร์ม แต่ในกรณีนี้ทำไมไม่เพียงแค่ปล่อยแอตทริบิวต์ "action" ไว้ในองค์ประกอบแบบฟอร์ม

การเขียนส่วนขยาย Chrome เป็นตัวอย่างที่คุณอาจมีแบบฟอร์มสำหรับป้อนข้อมูลโดยผู้ใช้ แต่คุณไม่ต้องการให้ส่ง หากคุณใช้ action = "javascript: void (0);" โค้ดอาจใช้งานได้ แต่คุณจะพบปัญหานี้ซึ่งคุณได้รับข้อผิดพลาดเกี่ยวกับการเรียกใช้ Javascript แบบอินไลน์

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

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