ป้องกันผู้ใช้จากการส่งแบบฟอร์มโดยการกด Enter


773

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

ฉันใช้ HTML, PHP 5.2.9 และ jQuery ในการสำรวจ


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

ฉันไม่ได้ใช้แท็กแบบฟอร์มเพราะฉันชอบที่จะประมวลผลแบบฟอร์มผ่านการร้องขอ ajax ด้วยวิธีที่ไม่ธรรมดา (เช่น: การส่งฟิลด์บางอันเนื่องจากการโฟกัสของพวกเขาลดลง ฯลฯ ) นอกจากนี้คุณยังสามารถสร้างผู้ฟังพิเศษเพื่อจับคีย์ Enter และดำเนินการเฉพาะเมื่อคุณต้องการ
ฮวน

คำตอบ:


881

คุณสามารถใช้วิธีการเช่น

$(document).ready(function() {
  $(window).keydown(function(event){
    if(event.keyCode == 13) {
      event.preventDefault();
      return false;
    }
  });
});

ในการอ่านความคิดเห็นในโพสต์ต้นฉบับเพื่อให้สามารถใช้งานได้มากขึ้นและอนุญาตให้ผู้คนกดEnterถ้าพวกเขาได้กรอกข้อมูลทั้งหมดในฟิลด์:

function validationFunction() {
  $('input').each(function() {
    ...

  }
  if(good) {
    return true;
  }
  return false;
}

$(document).ready(function() {
  $(window).keydown(function(event){
    if( (event.keyCode == 13) && (validationFunction() == false) ) {
      event.preventDefault();
      return false;
    }
  });
});

7
ขณะนี้ฉันกำลังมองหาการแก้ไขอย่างรวดเร็วและไม่มีเวลาที่จะใช้รายการตรวจสอบ ฉันขอขอบคุณคำตอบของทุกคน แต่นี่คือสิ่งที่ฉันจะไปด้วยในเวลาเฉลี่ย ขอบคุณ.
DForck42

8
วิธีนี้เป็นแบบ unideal เพราะมันจะป้องกันผู้ใช้จากการส่งแบบฟอร์มโดยการกด enter ในขณะที่มุ่งเน้นไปที่ปุ่มส่ง ทางออกที่ดีที่สุดคือ BalusC ด้านล่างซึ่งการป้อนถูกขัดจังหวะเฉพาะในขณะที่ยังคงมุ่งเน้นไปที่อินพุตแบบฟอร์ม
Anson Kao

3
ฉันเคยเห็นสถานการณ์ (Internet Explorer เท่านั้น) ที่คุณต้องผูกไว้keydownกับที่documentแทนที่จะwindowทำงานเพื่อให้มันทำงานได้
MartinHN

8
คุณอาจต้องการเพิ่ม&& !$(document.activeElement).is('textarea')เงื่อนไขหรืออื่นบรรทัดใหม่ภายใน textarea ถูกบล็อก (ใน IE อย่างน้อย)
แฟลช

1
มันใช้งานได้สำหรับฉัน แต่สิ่งนี้ยังป้องกันการเพิ่มตัวแบ่งบรรทัดใน textarea
Césarเลออน

613

ไม่อนุญาตให้ป้อนรหัสที่ใดก็ได้

หากคุณไม่มี<textarea>ในแบบฟอร์มของคุณให้เพิ่มสิ่งต่อไปนี้ใน<form>:

<form ... onkeydown="return event.key != 'Enter';">

หรือกับ jQuery:

$(document).on("keydown", "form", function(event) { 
    return event.key != "Enter";
});

keyนี้จะทำให้ทุกคนที่กดปุ่มภายในรูปแบบจะถูกตรวจสอบใน หากไม่เป็นEnterเช่นนั้นก็จะกลับมาtrueและสิ่งใดที่จะดำเนินต่อไปตามปกติ หากเป็นEnterเช่นนั้นจะส่งคืนfalseและสิ่งใดจะหยุดทันทีดังนั้นจะไม่ส่งแบบฟอร์ม

keydownเหตุการณ์เป็นที่ต้องการมากกว่าkeyupเป็นkeyupสายเกินไปที่จะใช้แบบฟอร์มการส่งบล็อก ในอดีตนอกจากนี้ยังมีแต่จะเลิกเป็นเป็นkeypress KeyboardEvent.keyCodeคุณควรใช้KeyboardEvent.keyแทนซึ่งส่งกลับชื่อของคีย์ที่ถูกกด เมื่อไหร่Enterตรวจสอบแล้วสิ่งนี้จะตรวจสอบ 13 (ป้อนปกติ) และ 108 (ป้อน numpad)

โปรดทราบว่า$(window)ตามคำแนะนำในคำตอบอื่น ๆ แทนที่จะใช้$(document)ไม่ได้ผลกับkeydown/ keyupใน IE <= 8 ดังนั้นจึงไม่ใช่ตัวเลือกที่ดีหากคุณต้องการครอบคลุมผู้ใช้ที่ไม่ดีเหล่านั้นด้วย

อนุญาตให้ป้อนคีย์บน textareas เท่านั้น

หากคุณมี<textarea>ในรูปแบบของคุณ (ซึ่งแน่นอนควรยอมรับปุ่ม Enter) แล้วเพิ่มตัวจัดการ keydown <textarea>เพื่อองค์ประกอบเข้าทุกรายที่ไม่ได้เป็น

<input ... onkeydown="return event.key != 'Enter';">
<select ... onkeydown="return event.key != 'Enter';">
...

เพื่อลดความผิดพลาดที่เกิดขึ้นควรทำด้วย jQuery:

$(document).on("keydown", ":input:not(textarea)", function(event) {
    return event.key != "Enter";
});

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

$(document).on("keydown", ":input:not(textarea)", function(event) {
    if (event.key == "Enter") {
        event.preventDefault();
    }
});

อนุญาตให้ป้อนคีย์บน textareas และส่งปุ่มเท่านั้น

หากคุณต้องการอนุญาตให้ใส่รหัสบนปุ่มส่ง<input|button type="submit">คุณสามารถปรับแต่งตัวเลือกได้ดังด้านล่าง

$(document).on("keydown", ":input:not(textarea):not(:submit)", function(event) {
    // ...
});

โปรดทราบว่าinput[type=text]ตามคำแนะนำในคำตอบอื่น ๆ จะไม่ครอบคลุมการป้อนข้อมูลที่ไม่ใช่ข้อความ HTML5 ดังนั้นจึงไม่ใช่ตัวเลือกที่ดี


11
คำตอบนี้ควรเป็นคำตอบที่ดีเนื่องจากมันเกี่ยวข้องกับแบบฟอร์มรวมถึง textarea และอธิบายการเผยแพร่เหตุการณ์ได้ดียิ่งขึ้น
foobar

6
":input:not(textarea):not([type=submit]):not(button)"หากคุณใช้<button>แทน<input type=submit>
Simon_Weaver

สิ่งนี้จะป้องกันการป้อนรหัสจากการทำงานกับอินพุตอื่นที่ไม่ใช่ textarea มันไม่ใช่ทางออกที่ดี
mate.gwozdz

ควรจะมีลำไส้ใหญ่มาก่อนinputหรือไม่
xfactorial

1
@YodaDaCoda: ตกลงและปรับเปลี่ยน
BalusC

110

ส่วน 4.10.22.2 การส่งข้อมูลจำเพาะ W3C HTML5 โดยปริยายระบุว่า:

formองค์ประกอบของปุ่มเริ่มต้นเป็นครั้งแรกที่ปุ่มส่งในการสั่งซื้อต้นไม้ที่มีการใช้รูปแบบคือการที่formองค์ประกอบ

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

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

ดังนั้นวิธีที่เป็นไปตามมาตรฐานเพื่อปิดใช้งานการส่งแบบฟอร์มใด ๆ โดยนัยคือการวางปุ่มส่งที่ถูกปิดใช้งานเป็นปุ่มส่งแรกในแบบฟอร์ม:

<form action="...">
  <!-- Prevent implicit submission of the form -->
  <button type="submit" disabled style="display: none" aria-hidden="true"></button>

  <!-- ... -->

  <button type="submit">Submit</button>
</form>

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


6
เอ้อ ... นี่คือทองคำที่มั่นคง หากใช้งานข้ามเบราว์เซอร์ได้จริง ๆ ก็สมควรที่จะขึ้นไปด้านบน! ผู้คนจำนวนมากสามารถตอบด้วยรูปแบบของการกดแป้น, การกดแป้นพิมพ์เป็นต้น แต่ไม่ได้รับคำตอบตามมาตรฐานนี้
John Rees

4
ในมือข้างหนึ่งมันง่ายและป้องกันข้อผิดพลาดทั้งหมดที่เสนอโดยคำตอบที่ยอมรับ ในทางกลับกันมันให้ความรู้สึกเหมือนเป็นการใช้ประโยชน์จากมาตรฐานเล็กน้อย ความรุ่งโรจน์สำหรับการรวมคุณลักษณะ aria- * ฉันชอบที่จะได้ยินความคิดเห็นเพิ่มเติมเกี่ยวกับเรื่องนี้
Solvitieg

2
ใช้งานได้เช่นกัน<input type="submit" disabled style="display: none" aria-hidden="true" />และคุณสามารถลดขนาดหน้าเว็บของคุณลงได้ด้วยตัวอักษรสองสามตัว :-P
gaefan

7
IE 11 ส่งต่อไป
CamaroSS

2
Safari คือ IE ใหม่
twistedpixel

68

ฉันต้องจับทั้งสามเหตุการณ์ที่เกี่ยวข้องกับการกดปุ่มเพื่อป้องกันไม่ให้ส่งแบบฟอร์ม:

    var preventSubmit = function(event) {
        if(event.keyCode == 13) {
            console.log("caught ya!");
            event.preventDefault();
            //event.stopPropagation();
            return false;
        }
    }
    $("#search").keypress(preventSubmit);
    $("#search").keydown(preventSubmit);
    $("#search").keyup(preventSubmit);

คุณสามารถรวมสิ่งต่าง ๆ ข้างต้นทั้งหมดเข้าด้วยกันเป็นแบบกะทัดรัด:

    $('#search').bind('keypress keydown keyup', function(e){
       if(e.keyCode == 13) { e.preventDefault(); }
    });

7
คุณสามารถโยง 3 ตัวเลือกล่าสุดหรือผูกหลายเหตุการณ์ด้วยวิธีเดียว$("#search").bind('keypress keyup keydown',preventSubmit)ดังนี้
Moak

เพราะใน ASP.NET web form ทุกอย่างจะต้องมีการซ้อนกันใน<form>แท็กคีย์ Enter จะส่งแบบฟอร์ม ... วิธีนี้ปิดการใช้งานคีย์ enter และแก้ไขปัญหาแม้ว่าขอบคุณ @Dave! แล้วฉันจะเปิดใช้งานปุ่ม Enter idสำหรับเขตข้อมูลบางอย่างโดย
เอียนแคมป์เบล

@Upgradingdave คุณสามารถเขียน "log ()" แทน "console.log ()" ได้อย่างไร?
radbyx

1
@radbyx ... จับได้ดีน่าจะเป็นconsole.logฉันได้อัพเดตคำตอบแล้ว
อัปเกรดเดฟ

โปรดทราบว่าkeypress keyup keydownคุณเรียกรหัสใด ๆ ในถ้าเงื่อนไขเป็นครั้งที่สอง
Kai Noack

56

หากคุณใช้สคริปต์เพื่อส่งจริงคุณสามารถเพิ่มบรรทัด "return false" ให้กับ onsubmit handler ดังนี้:

<form onsubmit="return false;">

การโทรส่ง () บนแบบฟอร์มจาก JavaScript จะไม่ทำให้เกิดเหตุการณ์


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

ทำงานกับฉันใน Chrome, IE-11 และ Firefox และเป็นวิธีที่ง่ายที่สุดในการติดตั้ง การปิดใช้งานปุ่ม Enter ในส่วนทั้งหมดของหน้าซึ่งเป็นคำตอบบางอย่างดูเหมือนจะรุนแรงเกินไปและอาจทำให้เกิดข้อบกพร่องได้
Roberto

ขอบคุณ. มันใช้งานได้สำหรับฉัน
LU

23

ใช้:

$(document).on('keyup keypress', 'form input[type="text"]', function(e) {
  if(e.keyCode == 13) {
    e.preventDefault();
    return false;
  }
});

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


ฉันคิดว่าคำตอบดั้งเดิมe.whichนั้นใช้ได้ e.keyCodeไม่จำเป็นต้องเปลี่ยนไป ทั้งคืนค่า 13 สำหรับคีย์ Enter ดูstackoverflow.com/a/4471635/292060และstackoverflow.com/a/18184976/292060
goodeye

2
โซลูชันนี้ดูแลโซลูชันสองรายการ: 1. ) อย่าส่งแบบฟอร์มในการป้อน 2) อนุญาตให้ป้อนใน textareas
PlanetUnknown

21

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

http://docs.jquery.com/Plugins/Validation

สิ่งนี้จะต้องใช้งานมากกว่าการEnterกดปุ่ม แต่แน่นอนว่ามันจะมอบประสบการณ์การใช้งานที่สมบูรณ์ยิ่งขึ้น


13
ฟังดูดี แต่ฟิลด์ตัวเลือกมีปัญหาผู้ใช้อาจกด Enter โดยไม่ได้ตั้งใจและจะส่งแบบฟอร์ม ฉันไม่เห็นว่าคุณจะรู้ได้อย่างไรเมื่อการสำรวจยังไม่เสร็จสิ้นเว้นแต่คุณจะใส่ทุกช่องตามที่ต้องการ (ไม่มีตัวเลือกเริ่มต้นไม่มีช่องว่างที่อนุญาต ... )
Christophe Roussy

19

วิธีแก้ปัญหา jQuery เล็กน้อยที่เรียบง่ายดี:

$("form").bind("keypress", function (e) {
    if (e.keyCode == 13) {
        return false;
    }
});

1
+1 ฉันกำลังมองหาทางเลือก jQuery แทนที่จะใช้ JS อย่างปกติvar key = event.keyCode || event.which; if (key == 13) return false;
RaphaelDDL

1
เทคนิคนี้ยังคงเป็น POJ เพียงห่อหุ้ม jquery ที่ง่ายขึ้น รหัสที่คุณให้มาเกือบเหมือนกัน
Eonasdan

19

ฉันยังไม่สามารถแสดงความคิดเห็นได้ดังนั้นฉันจะโพสต์คำตอบใหม่

คำตอบที่ยอมรับคือ ok-ish แต่มันก็ไม่ได้หยุดส่งเมื่อป้อน numpad อย่างน้อยใน Chrome เวอร์ชันปัจจุบัน ฉันต้องเปลี่ยนเงื่อนไขของรหัสนี้แล้วก็ใช้งานได้

if(event.keyCode == 13 || event.keyCode == 169) {...}

5
ความแตกต่างระหว่าง Enter และ Return - ผู้ประกอบการ ณ จุดขายจำนวนมากใช้ numpad โดยเฉพาะ +1
helloserve

8
ตอนนี้(05-21-2015)สำหรับทั้งการป้อนปกติและการป้อน numpad คีย์โค้ดคือ13 [Chrome 42, IE 11, FIreFox 36]
Cliff Burton

15

มันเป็นทางออกของฉันที่จะไปให้ถึงเป้าหมายมันสะอาดและมีประสิทธิภาพ

$('form').submit(function () {
  if ($(document.activeElement).attr('type') == 'submit')
     return true;
  else return false;
});

13

แนวทางที่แตกต่างอย่างสิ้นเชิง:

  1. ครั้งแรกในรูปแบบจะถูกเปิดใช้งานในการกด<button type="submit">Enter
  2. สิ่งนี้จะเกิดขึ้นแม้ว่าปุ่มจะซ่อนอยู่ style="display:none;
  3. สคริปต์สำหรับปุ่มนั้นสามารถส่งคืนfalseซึ่งยกเลิกกระบวนการส่ง
  4. คุณยังสามารถมีอีกอัน<button type=submit>เพื่อส่งแบบฟอร์ม เพียงแค่กลับtrueไปที่การเรียงซ้อนการส่ง
  5. การกดEnterในขณะที่กดปุ่มส่งจริงจะเป็นการเปิดใช้งานปุ่มส่งจริง
  6. การกดEnterด้านใน<textarea>หรือตัวควบคุมแบบอื่น ๆ จะทำงานตามปกติ
  7. การกดปุ่มควบคุมEnterใน<input>แบบฟอร์มจะเรียกสิ่งแรก<button type=submit>ซึ่งจะกลับfalseมาและจะไม่มีอะไรเกิดขึ้น

ดังนั้น:

<form action="...">
  <!-- insert this next line immediately after the <form> opening tag -->
  <button type=submit onclick="return false;" style="display:none;"></button>

  <!-- everything else follows as normal -->
  <!-- ... -->
  <button type=submit>Submit</button>
</form>

1
อืมใน Chrome และ Firefox เวอร์ชันที่สั้นกว่านั้นคือ <button disabled style = "display: none;"> <button> ซึ่งมีข้อดีที่ไม่ต้องการให้ JS ทำงาน Safari จะเพิกเฉยปุ่มและสิ่งอื่น ๆ จะเกิดขึ้นตามปกติ
นรก

1
ฉันไม่ชอบวิธี "ไม่สนใจ 13 รหัส" ดังนั้นฉันจึงเริ่มคิดหาวิธีที่ง่ายและยุ่งยากและความคิดนี้มาถึงใจของฉันและเมื่อฉันเลื่อนหน้าลงฉันเห็นกระทู้นี้ :) บวกหนึ่งสำหรับความคิดร่วมกันและแน่นอนทางออกที่ดีที่สุด
Jalali Shakib

คำตอบที่สมบูรณ์แบบสำหรับฉัน ฉันต้องการให้แบบจำลองเลียนแบบ CLI ดังนั้นผู้ใช้จะกด Enter สำหรับแต่ละฟิลด์ถัดไปและจากนั้นให้ส่งตอนท้าย
ธาน

โอ้ยอดเยี่ยมปุ่มสุดท้ายสามารถเป็นเช่นนี้เพื่อป้องกันการส่งซ้ำเมื่อคลิกอย่างรวดเร็ว:<button onclick="this.disabled=true;this.form.submit();" type="submit"">submit</button>
Arash Moosapour

@ArashMoosapour โปรดอย่าปิดการใช้งานปุ่มส่งหากพวกเขามีจุดสนใจ - การทำเช่นนั้นจะเป็นการลดจุดโฟกัสและเป็นระเบียบสำหรับการเข้าถึง
Erics

9

ให้แบบฟอร์มการทำงานของ 'javascript: void (0);' ดูเหมือนว่าจะทำเคล็ดลับ

<form action="javascript:void(0);">
<input type="text" />
</form>
<script>
$(document).ready(function() {
    $(window).keydown(function(event){
        if(event.keyCode == 13) {
    alert('Hello');
        }
    });
});
</script>

8

การไม่ใส่ปุ่มส่งสามารถทำได้ เพียงใส่สคริปต์ไปยังอินพุต (ปุ่ม = ประเภท) หรือเพิ่ม eventListener หากคุณต้องการให้ส่งข้อมูลในแบบฟอร์ม

ค่อนข้างใช้สิ่งนี้

<input type="button">

กว่าการใช้สิ่งนี้

<input type="submit">

8
  1. ห้ามใช้type = "submit"สำหรับอินพุตหรือปุ่ม
  2. ใช้type = "button"และใช้ js [Jquery / angular / etc] เพื่อส่งแบบฟอร์มไปยังเซิร์ฟเวอร์

7

ฉันต้องการป้องกันเฉพาะอินพุตที่ไม่ส่งดังนั้นฉันจึงใช้ตัวเลือกคลาสเพื่อให้คุณสมบัตินี้เป็น "ทั่วโลก" ไม่ว่าฉันต้องการที่ใด

<input id="txtEmail" name="txtEmail" class="idNoEnter" .... />

และรหัส jQuery นี้:

$('.idNoEnter').keydown(function (e) {
  if (e.keyCode == 13) {
    e.preventDefault();
  }
});

อีกวิธีหนึ่งหากการกดคีย์ไม่เพียงพอ:

$('.idNoEnter').on('keypress keydown keyup', function (e) {
   if (e.keyCode == 13) {
     e.preventDefault();
   }
});

หมายเหตุบางส่วน:

การแก้ไขคำตอบที่ดีต่าง ๆ ที่นี่Enterดูเหมือนว่ากุญแจจะใช้ได้keydownกับทุกเบราว์เซอร์ สำหรับทางเลือกฉันอัปเดตbind()เป็นon()วิธี

ฉันเป็นแฟนตัวยงของผู้เลือกคลาสการชั่งน้ำหนักข้อดีและข้อเสียและการอภิปรายประสิทธิภาพ หลักการตั้งชื่อของฉันคือ 'idSomething' เพื่อระบุว่า jQuery ใช้เป็น id เพื่อแยกมันออกจาก CSS style


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

5

คุณสามารถสร้างวิธี JavaScript เพื่อตรวจสอบว่ามีการEnterกดปุ่มหรือไม่และเพื่อหยุดการส่ง

<script type="text/javascript">
  function noenter() {
  return !(window.event && window.event.keyCode == 13); }
</script>

เพียงโทรหาเราที่วิธีส่ง


4

ส่งการบล็อกเท่านั้น แต่ไม่ใช่ฟังก์ชั่นที่สำคัญอื่น ๆ ของคีย์ Enter เช่นการสร้างย่อหน้าใหม่ใน<textarea>:

window.addEventListener('keydown', function(event) {
  //set default value for variable that will hold the status of keypress
  pressedEnter = false;

  //if user pressed enter, set the variable to true
  if (event.keyCode == 13)
    pressedEnter = true;

  //we want forms to disable submit for a tenth of a second only
  setTimeout(function() {
    pressedEnter = false;
  }, 100)

})

//find all forms
var forms = document.getElementsByTagName('form')

//loop through forms
for (i = 0; i < forms.length; i++) {
  //listen to submit event
  forms[i].addEventListener('submit', function(e) {
    //if user just pressed enter, stop the submit event
    if (pressedEnter == true) {
      updateLog('Form prevented from submit.')
      e.preventDefault();
      return false;
    }

    updateLog('Form submitted.')
  })
}

var log = document.getElementById('log')
updateLog = function(msg) {
  log.innerText = msg
}
input,
textarea {
  display: inline-block;
  margin-bottom: 1em;
  border: 1px solid #6f6f6f;
  padding: 5px;
  border-radius: 2px;
  width: 90%;
  font-size: 14px;
}

input[type=submit] {
  background: lightblue;
  color: #fff;
}
<form>
  <p>Sample textarea (try enter key):</p>
  <textarea rows="4">Hit enter, a new line will be added. But the form won't submit</textarea><br/>
  <p>Sample textfield (try enter key):</p>
  <input type="text" placeholder="" />
  <br/>
  <input type="submit" value="Save" />
  <h3 id="log"></h3>
</form>


สงสัยว่าใครและทำไมจะลงคะแนนนี้: | ปัญหาของฉันคืออะไร
mate.gwozdz

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

@NathanCH - รหัสนี้ตรงข้ามกับสิ่งที่คุณพูด มันป้องกันการป้อนจากการส่งแบบฟอร์มและไม่ได้ป้องกันการทำงานอื่น ๆ - ตัวอย่างเช่นคุณอาจมีฟิลด์ข้อความและต้องการใช้การป้อนเพื่อสร้างย่อหน้าใหม่
mate.gwozdz

1
มีการพิมพ์ผิดในบรรทัดแรก แทนที่จะมันควรจะเป็นfunction(e) function(event)มิฉะนั้นมันใช้งานได้สำหรับฉัน ขอบคุณ.
Guillermo Prandi

1
นี่คือเครื่องมือช่วยชีวิตที่สมบูรณ์เนื่องจากทุกสิ่งทุกอย่างป้องกันไม่ให้ฉันจัดการการบันทึกเหตุการณ์อย่างถูกต้องสำหรับสิ่งต่าง ๆ เช่นการแก้ไขแบบอินไลน์กริด ข้อเสนอแนะเดียวคือไม่ใช้ 'setTimeout' เลย ฉันคิดว่านั่นเป็นปัญหาที่ผู้คนมีต่อคำตอบนี้ มันจู้จี้เกินไป แต่สำหรับเหตุการณ์ที่ทำ on("keydown", function(event) { enterPressed = true; }และจากนั้นในเหตุการณ์ส่งให้ทำ on("submit", function(e) { if (pressedEnter == true) { pressedEnter = false; e.preventDefault(); return false;}สิ่งนี้จะช่วยให้มั่นใจได้ว่ามันจะทำงานไม่ว่าจะล่าช้าหรือไม่
Curtis Snowden

3

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

$('form input').keydown(function (e) {
if (e.keyCode == 13) {
    e.preventDefault();
    return false;
}
});

2

ฉันมีปัญหาที่คล้ายกันซึ่งฉันมีตารางที่มี "ajax textfields" (Yii CGridView) และเพียงปุ่มส่งเพียงปุ่มเดียว ทุกครั้งที่ฉันค้นหาข้อความและกดปุ่มป้อนแบบฟอร์มที่ส่งมา ฉันต้องทำบางสิ่งด้วยปุ่มเพราะมันเป็นปุ่มทั่วไปเพียงอย่างเดียวระหว่างมุมมอง (รูปแบบ MVC) สิ่งที่ฉันต้องทำคือถอดtype="submit"และใส่onclick="document.forms[0].submit()


2

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

<form method="POST" action="..." onkeypress="if(event.keyCode == 13) mySubmitFunction(this); return false;">

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


ฉันรู้ว่ามันแตกต่างกับคำตอบของทอมฮับบาร์ดซึ่งฉัน +1 เพราะจริงๆแล้วสิ่งที่ฉันทำเองในวันนี้ก่อนที่จะค้นหาแนวคิดอื่น ๆ
กระเทียม

2

มีคำตอบที่ดีมากมายที่นี่แล้วฉันแค่อยากมีส่วนร่วมในมุมมองของ UX การควบคุมคีย์บอร์ดในรูปแบบมีความสำคัญมาก

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

การปิดใช้งานEnterสำหรับการส่งแบบฟอร์มยังควรอนุญาตสิ่งต่อไปนี้:

  1. ส่งแบบฟอร์มผ่านทางEnterเมื่อมีการมุ่งเน้นปุ่มส่ง
  2. ส่งแบบฟอร์มเมื่อมีการเติมฟิลด์ทั้งหมด
  3. Enterการมีปฏิสัมพันธ์กับที่ไม่ได้ส่งผ่านทางปุ่ม

นี่เป็นเพียงสำเร็จรูป แต่เป็นไปตามเงื่อนไขทั้งสาม

$('form').on('keypress', function(e) {
  // Register keypress on buttons.
  $attr = $(e.target).attr('type);
  if ($attr === 'button' || $attr === 'submit') {
    return true;
  }

  // Ignore keypress if all fields are not populated.
  if (e.which === 13 && !fieldsArePopulated(this)) {
    return false;
  }
});


1

บางสิ่งที่ฉันไม่ได้เห็นคำตอบที่นี่: เมื่อคุณแท็บองค์ประกอบบนหน้าการกดEnterเมื่อคุณไปที่ปุ่มส่งจะทำให้ตัวจัดการ onsubmit บนฟอร์ม แต่จะบันทึกเหตุการณ์เป็น MouseEvent นี่เป็นคำตอบสั้น ๆ ของฉันที่จะครอบคลุมฐานส่วนใหญ่:

นี่ไม่ใช่คำตอบที่เกี่ยวข้องกับ jQuery

HTML

<form onsubmit="return false;" method=post>
  <input type="text" /><br />
  <input type="button" onclick="this.form.submit()" value="submit via mouse or keyboard" />
  <input type="button" onclick="submitMouseOnly(event)" value="submit via mouse only" />
</form>

JavaScript

window.submitMouseOnly=function(evt){
    let allow=(evt instanceof MouseEvent) && evt.x>0 && evt.y>0 && evt.screenX > 0 && evt.screenY > 0;
    if(allow)(evt.tagName=='FORM'?evt.target:evt.target.form).submit();
}

หากต้องการค้นหาตัวอย่างการทำงาน: https://jsfiddle.net/nemesarial/6rhogva2/


0

ในกรณีเฉพาะของฉันฉันต้องหยุดการป้อนแบบฟอร์มและจำลองการคลิกปุ่มส่ง นี่เป็นเพราะปุ่มส่งมีตัวจัดการการคลิกอยู่เพราะเราอยู่ในหน้าต่างโมดัล (สืบทอดรหัสเก่า) ในกรณีใด ๆ นี่คือคำสั่งผสมของฉันสำหรับกรณีนี้

    $('input,select').keypress(function(event) {
        // detect ENTER key
        if (event.keyCode == 13) {
            // simulate submit button click
            $("#btn-submit").click();
            // stop form from submitting via ENTER key press
            event.preventDefault ? event.preventDefault() : event.returnValue = false;
        }
    });

กรณีการใช้งานนี้มีประโยชน์อย่างยิ่งสำหรับผู้ที่ทำงานกับ IE8


0

มันใช้งานได้สำหรับฉัน

jQuery.each($("#your_form_id").find('input'), function(){
    $(this).bind('keypress keydown keyup', function(e){
       if(e.keyCode == 13) { e.preventDefault(); }
    });
});

0

ฉันต้องการเพิ่มรหัส CoffeeScript เล็กน้อย (ไม่ใช่การทดสอบภาคสนาม):

$ ->
    $(window).bind 'keypress', (event) ->
        if event.keyCode == 13
            unless {'TEXTAREA', 'SELECT'}[event.originalEvent.srcElement.tagName]
                event.preventDefault()

(ฉันหวังว่าคุณจะชอบกลอุบายที่ดีในข้อเว้นแต่)


0

ใช้Javascript (โดยไม่ตรวจสอบช่องใส่):

<script>
window.addEventListener('keydown', function(e) {
    if (e.keyIdentifier == 'U+000A' || e.keyIdentifier == 'Enter' || e.keyCode == 13) {
        e.preventDefault();
        return false;
    }
}, true);
</script>

หากมีคนต้องการใช้สิ่งนี้ในฟิลด์ที่ระบุเช่นข้อความประเภทอินพุต:

<script>
window.addEventListener('keydown', function(e) {
    if (e.keyIdentifier == 'U+000A' || e.keyIdentifier == 'Enter' || e.keyCode == 13) {
        if (e.target.nodeName == 'INPUT' && e.target.type == 'text') {
            e.preventDefault();
            return false;
        }
    }
}, true);
</script>

มันใช้งานได้ดีในกรณีของฉัน


0

เข้าไปใน css ของคุณและเพิ่มเข้าไปในนั้นจากนั้นจะบล็อกการส่งสูตรของคุณโดยอัตโนมัติตราบใดที่คุณมีการป้อนข้อมูลหากคุณไม่ต้องการให้คุณสามารถลบมันหรือพิมพ์activateและdeactivateแทน

 input:disabled {
        background: gainsboro;
      }
      input[value]:disabled {
        color: whitesmoke;
      }

0

คุณสามารถใช้javascript:void(0)เพื่อป้องกันการส่งแบบฟอร์ม

<form action="javascript:void(0)" method="post">
    <label for="">Search</label>
    <input type="text">
    <button type="sybmit">Submit</button>
</form>

<form action="javascript:void(0)" method="post">
    <label for="">Search</label>
    <input type="text">
    <button type="sybmit">Submit</button>
</form>


ไม่ทำงานเมื่อคุณมีเฉพาะmethod="post"ในแบบฟอร์มของคุณ เช่นฉันต้องการให้ส่งแบบฟอร์มโดยใช้ปุ่ม แต่ไม่เมื่อกด Enter ขณะที่มุ่งเน้นไปที่อินพุต
Souleste

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

-2

สิ่งนี้ได้ผลสำหรับฉันในเบราว์เซอร์ทั้งหมดหลังจากผิดหวังกับโซลูชันอื่น ๆ มากมาย ฟังก์ชั่นด้านนอก name_space นั้นอยู่ห่างจากการประกาศรอบ ๆ สิ่งที่ฉันแนะนำ

$(function() {window.name_space = new name_space();}); //jquery doc ready
function name_space() {
    this.is_ie = (navigator.userAgent.indexOf("MSIE") !== -1);

    this.stifle = function(event) {
        event.cancelBubble;
        event.returnValue = false;
        if(this.is_ie === false) {
            event.preventDefault();
        }
        return false;
    }

    this.on_enter = function(func) {
        function catch_key(e) {
            var enter = 13;
            if(!e) {
                var e = event;
            }
            keynum = GetKeyNum(e);
            if (keynum === enter) {
                if(func !== undefined && func !== null) {
                    func();
                }
                return name_space.stifle(e);
            }
            return true; // submit
        }

        if (window.Event) {
            window.captureEvents(Event.KEYDOWN);
            window.onkeydown = catch_key;
        }
        else {
            document.onkeydown = catch_key;
        }

        if(name_space.is_ie === false) {
            document.onkeypress = catch_key;    
        }
    }
}

ตัวอย่างการใช้งาน:

$(function() {
    name_space.on_enter(
        function () {alert('hola!');}
    );
});

-2

ใช้:

// Validate your form using the jQuery onsubmit function... It'll really work...

$(document).ready(function(){
   $(#form).submit(e){
       e.preventDefault();
       if(validation())
          document.form1.submit();
   });
});

function validation()
{
   // Your form checking goes here.
}

<form id='form1' method='POST' action=''>
    // Your form data
</form>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.