Ngăn người dùng gửi biểu mẫu bằng cách nhấn Enter


773

Tôi có một cuộc khảo sát trên một trang web và dường như có một số vấn đề với người dùng nhấn enter (tôi không biết tại sao) và vô tình gửi bản khảo sát (biểu mẫu) mà không nhấp vào nút gửi. Có cách nào để ngăn chặn điều này?

Tôi đang sử dụng HTML, PHP 5.2.9 và jQuery trong khảo sát.


2
Không sử dụng thẻ biểu mẫu và thực hiện yêu cầu ajax tùy chỉnh :) Nhưng chắc chắn, bạn có thể tiếp tục với phương pháp ngăn chặn và lắng nghe, đó là những gì tôi sẽ làm ..
jancha

Tôi chỉ không sử dụng thẻ biểu mẫu vì tôi thích xử lý biểu mẫu thông qua các yêu cầu ajax theo các cách không thông thường (ví dụ: gửi một số trường khi tiêu điểm của chúng bị bỏ, v.v.). Bạn cũng có thể tạo một trình lắng nghe đặc biệt để bắt phím Enter và xử lý nó chỉ khi bạn muốn làm điều đó.
Juan

Câu trả lời:


881

Bạn có thể sử dụng một phương pháp như

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

Khi đọc các bình luận trên bài viết gốc, để làm cho nó dễ sử dụng hơn và cho phép mọi người nhấn Enternếu họ đã hoàn thành tất cả các trường:

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
Hiện tại tôi chỉ đang tìm cách khắc phục nhanh và không có thời gian để thực hiện các mục xác thực. Tôi đánh giá cao câu trả lời của mọi người, nhưng đây là câu tôi sẽ đi cùng trong lúc này. cảm ơn bạn.
DForck42

8
Phương pháp này không hợp lý vì nó ngăn người dùng gửi biểu mẫu bằng cách nhấn enter trong khi tập trung vào nút gửi. Giải pháp tốt nhất sẽ là BalusC bên dưới, nơi nhập chỉ bị gián đoạn trong khi vẫn tập trung vào các đầu vào mẫu.
Anson Kao

3
Tôi đã nhìn thấy tình huống (Internet Explorer) nơi bạn cần phải bám vào keydowntrên documentthay vì windowcho điều này để làm việc.
MartinHN

8
Bạn có thể muốn thêm && !$(document.activeElement).is('textarea')vào điều kiện hoặc các dòng mới khác trong văn bản bị chặn (ít nhất là trong IE).
Flash

1
Điều này làm việc cho tôi. Nhưng điều này cũng ngăn chặn để thêm dòng ngắt trong textarea.
César León

613

Không cho phép nhập khóa ở bất cứ đâu

Nếu bạn không có <textarea>trong mẫu của mình, thì chỉ cần thêm những thứ sau vào <form>:

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

Hoặc với jQuery:

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

Điều này sẽ khiến mọi phím bấm bên trong biểu mẫu sẽ được kiểm tra trên key. Nếu không Enter, nó sẽ trở lại truevà mọi thứ tiếp tục như bình thường. Nếu có Enter, nó sẽ trở lạifalse và mọi thứ sẽ dừng ngay lập tức, vì vậy mẫu đơn sẽ không được gửi.

Sự keydownkiện này được ưu tiên hơn keyupkeyupquá muộn để chặn biểu mẫu gửi. Trong lịch sử cũng có keypress, nhưng điều này không được chấp nhận, cũng nhưKeyboardEvent.keyCode . Bạn nên sử dụng KeyboardEvent.keythay vì trả về tên của phím được nhấn. Khi nàoEnter được kiểm tra, thì điều này sẽ kiểm tra 13 (nhập bình thường) cũng như 108 (nhập numpad).

Lưu ý rằng $(window)như được đề xuất trong một số câu trả lời khác thay vì$(document) không hoạt động cho keydown/keyup trong IE <= 8, vì vậy đó không phải là một lựa chọn tốt nếu bạn cũng muốn bao gồm cả những người dùng kém đó.

Chỉ cho phép nhập khóa trên textareas

Nếu bạn có một <textarea>biểu mẫu của mình (tất nhiên sẽ chấp nhận phím Enter), sau đó thêm trình xử lý phím tắt cho mọi thành phần đầu vào riêng lẻ không phải là một <textarea>.

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

Để giảm bản tóm tắt, điều này tốt hơn là được thực hiện với jQuery:

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

Nếu bạn có các hàm xử lý sự kiện khác được đính kèm trên các phần tử đầu vào đó, vì lý do nào đó bạn cũng muốn gọi phím enter vì một số lý do, thì chỉ ngăn hành vi mặc định của sự kiện thay vì trả về false, vì vậy nó có thể truyền đúng cho các trình xử lý khác.

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

Cho phép nhập khóa trên textareas và chỉ gửi các nút

Nếu bạn cũng muốn cho phép nhập phím trên các nút gửi <input|button type="submit">, thì bạn luôn có thể tinh chỉnh bộ chọn như bên dưới.

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

Lưu ý rằng input[type=text]như được đề xuất trong một số câu trả lời khác không bao gồm các đầu vào phi văn bản HTML5 đó, vì vậy đó không phải là một công cụ chọn tốt.


11
Đây là một câu trả lời tốt vì nó cũng liên quan đến hình thức bao gồm cả textarea và giải thích rõ hơn về sự lan truyền sự kiện
foobar

6
":input:not(textarea):not([type=submit]):not(button)"nếu bạn đang sử dụng <button>thay vì<input type=submit>
Simon_Weaver

Điều này ngăn khóa enter hoạt động trên bất kỳ đầu vào nào khác ngoài textarea. Đó không phải là một giải pháp tốt
mate.gwozdz

Có phải là một dấu hai chấm trước input?
xfactorial

1
@YodaDaCoda: đồng ý và điều chỉnh.
BalusC

110

Mục 4.10.22.2 Việc gửi ngầm định của thông số HTML5 W3C nói:

Một formphần tử nút mặc định là người đầu tiên nút gửi trong trật tự câychủ sở hữu dưới hình thứcformyếu tố.

Nếu tác nhân người dùng hỗ trợ cho phép người dùng gửi biểu mẫu ngầm (ví dụ: trên một số nền tảng nhấn phím "enter" trong khi trường văn bản được tập trung hoàn toàn gửi biểu mẫu), thì làm như vậy đối với biểu mẫu có nút mặc địnhkích hoạt được xác định hành vi phải khiến tác nhân người dùng chạy các bước kích hoạt nhấp chuột tổng hợp trên nút mặc định đó .

Lưu ý: Do đó, nếu nút mặc định bị tắt, biểu mẫu sẽ không được gửi khi sử dụng cơ chế đệ trình ngầm như vậy. (Nút không có hành vi kích hoạt khi bị tắt.)

Do đó, một cách tuân thủ tiêu chuẩn để vô hiệu hóa bất kỳ nội dung gửi biểu mẫu nào là đặt nút gửi bị vô hiệu hóa làm nút gửi đầu tiên trong biểu mẫu:

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

Một tính năng hay của phương pháp này là nó hoạt động mà không cần JavaScript ; cho dù JavaScript có được bật hay không, một trình duyệt web tuân thủ tiêu chuẩn là bắt buộc để ngăn chặn việc gửi biểu mẫu ngầm.


6
Errrr ... Đây là vàng rắn. Nếu điều này thực sự hoạt động trên trình duyệt chéo, nó xứng đáng để đi đầu! Làm thế nào nhiều người có thể trả lời với các biến thể của phím bấm, phím tắt vv nhưng bỏ lỡ câu trả lời dựa trên tiêu chuẩn này?
John Rees

4
Một mặt nó đơn giản và ngăn chặn tất cả những cạm bẫy được đề xuất bởi các câu trả lời được chấp nhận. Mặt khác, nó cảm thấy như một sự khai thác nhẹ của tiêu chuẩn. Kudos cho bao gồm thuộc tính aria- *. Tôi rất thích nghe thêm thông tin phản hồi về điều này.
Solvitieg

2
Cũng hoạt động như <input type="submit" disabled style="display: none" aria-hidden="true" />và bạn có thể giảm kích thước trang của bạn bằng một vài ký tự. :-P
gaefan

7
IE 11 vẫn nộp.
CamaroSS

2
Safari là IE mới.
twistpixel

68

Tôi đã phải nắm bắt cả ba sự kiện liên quan đến việc bấm phím để ngăn biểu mẫu được gửi:

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

Bạn có thể kết hợp tất cả những điều trên thành một phiên bản nhỏ gọn đẹp mắt:

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

7
Bạn có thể xâu chuỗi 3 bộ chọn cuối cùng hoặc liên kết nhiều sự kiện bằng một phương thức như vậy $("#search").bind('keypress keyup keydown',preventSubmit);
Moak

Bởi vì trong một biểu mẫu web ASP.NET, mọi thứ phải được lồng trong một <form>thẻ, khóa enter sẽ gửi biểu mẫu ... Giải pháp này đã vô hiệu hóa khóa enter và mặc dù đã khắc phục sự cố, cảm ơn @Dave! Sau đó, tôi kích hoạt phím enter cho các trường nhất định bằng cách id.
Ian Campbell

@Upgradingdave Làm thế nào bạn có thể viết "log ()" thay vì "console.log ()"?
radbyx

1
@radbyx ... bắt tốt, nó nên console.log, tôi đã cập nhật câu trả lời của tôi.
Nâng cấp

Lưu ý rằng với keypress keyup keydownbạn kích hoạt bất kỳ mã nào trong điều kiện if hai lần .
Kai Noack

56

Nếu bạn sử dụng tập lệnh để thực hiện việc gửi thực tế, thì bạn có thể thêm dòng "return false" vào trình xử lý onsubmit như thế này:

<form onsubmit="return false;">

Gọi submit () trên biểu mẫu từ JavaScript sẽ không kích hoạt sự kiện.


Hoạt động với tôi trong Chrome, điều này cũng sẽ vô hiệu hóa các nút gửi, điều này rất tốt nếu bạn muốn kích hoạt một sự kiện onlick trên chính nút gửi. Gợi ý Ajax: Thêm chức năng gọi của bạn trước khi trả về và người dùng vẫn có thể nhấn phím enter mà không cần gửi biểu mẫu đến trang.
Dennis Heiden

Làm việc cho tôi trên Chrome, IE-11 và Firefox và là giải pháp đơn giản nhất để thực hiện. Vô hiệu hóa phím enter trên toàn bộ các phần của trang, như một số câu trả lời, dường như quá cực đoan và dễ bị lỗi.
Roberto

Cảm ơn bạn. nó làm việc cho tôi
LU

23

Sử dụng:

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

Giải pháp này hoạt động trên tất cả các biểu mẫu trên một trang web (cũng trên các biểu mẫu được chèn bằng Ajax), chỉ ngăn Enters trong các văn bản đầu vào. Đặt nó trong một chức năng sẵn sàng tài liệu và quên vấn đề này cho một cuộc sống.


Tôi nghĩ rằng câu trả lời ban đầu e.whichlà tốt; không cần phải thay đổi nó thành e.keyCode. Cả hai trả về giá trị 13 cho khóa enter. Xem stackoverflow.com/a/4471635/292060stackoverflow.com/a/18184976/292060
goodeye

2
Giải pháp này xử lý hai giải pháp: 1.) Không gửi biểu mẫu khi nhập 2.) Cho phép nhập vào văn bản
PlanetUn Unknown

21

Thay vì ngăn người dùng nhấn Enter, điều này có vẻ không tự nhiên, bạn có thể để lại biểu mẫu và thêm một số xác thực phía máy khách bổ sung: Khi kết thúc khảo sát không được gửi đến máy chủ và người dùng nhận được thông báo tốt những gì cần phải được hoàn thành để hoàn thành các hình thức. Nếu bạn đang sử dụng jQuery, hãy thử plugin Xác thực:

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

Điều này sẽ đòi hỏi nhiều công việc hơn là bắt Enternút, nhưng chắc chắn nó sẽ cung cấp trải nghiệm người dùng phong phú hơn.


13
Điều này nghe có vẻ tốt nhưng các trường tùy chọn có vấn đề, người dùng có thể nhấn enter do nhầm lẫn và biểu mẫu sẽ được gửi. Tôi không biết bạn sẽ biết như thế nào khi cuộc khảo sát chưa kết thúc trừ khi bạn đặt mọi trường theo yêu cầu (không có lựa chọn mặc định, không có trường trống nào được phép ...)
Barshe Roussy

19

Một giải pháp jQuery nhỏ đơn giản tốt đẹp:

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

1
+1 Tôi đang tìm kiếm một giải pháp thay thế jQuery, thay vì sử dụng JS bình thường nhưvar key = event.keyCode || event.which; if (key == 13) return false;
RaphaelDDL

1
về mặt kỹ thuật, đây vẫn là POJ chỉ với một trình bao bọc jquery đơn giản hơn. mã mà bạn đã đưa ra gần giống như vậy.
Eonasdan

19

Tôi chưa thể bình luận, vì vậy tôi sẽ đăng một câu trả lời mới

Câu trả lời được chấp nhận là ok-ish, nhưng nó đã không dừng gửi trên numpad enter. Ít nhất là trong phiên bản hiện tại của Chrome. Tôi đã phải thay đổi điều kiện mã khóa thành cái này, sau đó nó hoạt động.

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

5
Sự khác biệt giữa Enter và Return - nhiều nhà khai thác Điểm bán hàng chỉ sử dụng numpad. +1
helloserve

8
Bây giờ (05-21-2015) , đối với cả nhập thông thường và nhập numpad, keyCode là 13 [Chrome 42, IE 11, FIreFox 36]
Cliff Burton

15

Đó là giải pháp của tôi để đạt được mục tiêu, nó sạch sẽ và hiệu quả.

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

13

Một cách tiếp cận hoàn toàn khác:

  1. Đầu tiên <button type="submit">trong mẫu sẽ được kích hoạt khi nhấn Enter.
  2. Điều này đúng ngay cả khi nút bị ẩn với style="display:none;
  3. Kịch bản cho nút đó có thể quay lại false, hủy bỏ quá trình gửi.
  4. Bạn vẫn có thể có một cái khác <button type=submit>để gửi mẫu. Chỉ cần quay trở lại trueđể trình tầng.
  5. Nhấn Entertrong khi nút gửi thực sự được tập trung sẽ kích hoạt nút gửi thực sự.
  6. Nhấn Enterbên trong <textarea>hoặc các điều khiển biểu mẫu khác sẽ hoạt động như bình thường.
  7. Nhấn Entervào bên trong các <input>điều khiển biểu mẫu sẽ kích hoạt cái đầu tiên <button type=submit>, nó sẽ trả về falsevà do đó không có gì xảy ra.

Như vậy:

<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
Hmm, trong Chrome và Firefox, một phiên bản thậm chí ngắn hơn sẽ là <button tật style = "display: none;"> <button>, cũng có ưu điểm là không yêu cầu JS hoạt động. Safari chỉ cần bỏ qua nút và vì vậy những thứ khác sẽ diễn ra như bình thường.
Erics

1
Tôi thực sự không thích cách "bỏ qua 13 mã khóa", vì vậy tôi bắt đầu suy nghĩ một cách dễ dàng và phức tạp, và ý tưởng này xuất hiện trong đầu tôi và khi tôi cuộn xuống trang này tôi đã thấy chủ đề này :). Thêm một cho ý tưởng lẫn nhau và tất nhiên là giải pháp tốt nhất.
Jalali Shakib

Câu trả lời hoàn hảo cho tôi. Tôi muốn có một biểu mẫu để mô phỏng CLI để người dùng sẽ nhấn enter cho từng trường tiếp theo và sau đó có một lần gửi.
nathan

thật tuyệt vời, nút cuối cùng có thể như thế này để ngăn chặn sự trùng lặp khi nhấp vào nhanh chóng:<button onclick="this.disabled=true;this.form.submit();" type="submit"">submit</button>
Arash Moosapour

@ArashMoosapour vui lòng không tắt các nút gửi nếu chúng có tiêu điểm - làm như vậy làm giảm tiêu điểm và là một mớ hỗn độn cho khả năng truy cập.
Erics

9

Đưa ra hình thức một hành động của 'javascript: void (0);' dường như làm trò bịp

<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

Không đặt một nút gửi có thể làm. Chỉ cần đặt một tập lệnh vào đầu vào (kiểu = nút) hoặc thêm eventListener nếu bạn muốn nó gửi dữ liệu trong biểu mẫu.

Thay vì sử dụng cái này

<input type="button">

hơn là sử dụng cái này

<input type="submit">

8
  1. Không sử dụng type = "submit" cho đầu vào hoặc nút.
  2. Sử dụng type = "button" và sử dụng js [Jquery / angular / etc] để gửi biểu mẫu đến máy chủ.

7

Tôi chỉ cần ngăn chặn các đầu vào cụ thể gửi, vì vậy tôi đã sử dụng một bộ chọn lớp, để cho đây là một tính năng "toàn cầu" bất cứ nơi nào tôi cần.

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

Và mã jQuery này:

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

Ngoài ra, nếu không đủ phím tắt:

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

Một số lưu ý:

Sửa đổi nhiều câu trả lời hay ở đây, Enterkhóa dường như hoạt động keydowntrên tất cả các trình duyệt. Đối với giải pháp thay thế, tôi được cập nhật bind()để các on()phương pháp.

Tôi là một fan hâm mộ lớn của các công cụ chọn lớp, cân nhắc tất cả các ưu và nhược điểm và thảo luận về hiệu suất. Quy ước đặt tên của tôi là 'idS Something' để chỉ ra jQuery đang sử dụng nó làm id, để tách nó khỏi kiểu CSS.


Điều này hoạt động trên các yếu tố hộp văn bản trong mẫu. Khi bạn nhập và nhấn enter trong hộp văn bản, hành vi mặc định sẽ gửi biểu mẫu. Điều này chặn khóa enter và ngăn nó gửi.
tạm biệt

5

Bạn có thể tạo một phương thức JavaScript để kiểm tra xem Enterkhóa có bị đánh hay không và nếu có, để dừng gửi.

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

Chỉ cần gọi nó trên phương thức trình.


4

CHỈ ĐĂNG KÝ BLOCK nhưng không phải chức năng quan trọng khác của phím enter, chẳng hạn như tạo một đoạn mới trong <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>


tự hỏi ai và tại sao sẽ downvote này: | vấn đề với giải pháp của tôi là gì?
mate.gwozdz

Nâng cao cho sự đóng góp. Câu trả lời được chấp nhận phá vỡ hầu hết giao diện người dùng mẫu, ngăn "đăng nhập" được đăng ký trên toàn bộ ứng dụng. Không tốt. Tôi nghĩ rằng đó là một ý tưởng tốt để cho phép nhập được xử lý trong các phần tử biểu mẫu, đặc biệt là các nút để tôi thích con đường bạn đang đi xuống. Tôi nghĩ rằng điều này có thể đạt được mà không có thời gian chờ mặc dù. Ví dụ, chỉ cần nhìn vào thuộc tính thành phần trong trình xử lý sự kiện của bạn. Cho phép 'nút' và 'gửi'
Solvitieg

@NathanCH - Mã này hoàn toàn ngược lại với những gì bạn đang nói. Nó chỉ ngăn enter nhập biểu mẫu và không ngăn bất kỳ chức năng nào khác - ví dụ: bạn có thể có trường văn bản và muốn sử dụng enter để tạo đoạn văn bản mới.
mate.gwozdz

1
Có một lỗi đánh máy trong dòng đầu tiên. Thay vì function(e)nó nên được function(event). Nếu không, nó làm việc cho tôi. Cảm ơn bạn.
Guillermo Prandi

1
Đây là một cứu cánh tuyệt đối, vì mọi thứ khác ngăn tôi xử lý đúng cách nhập các sự kiện lưu cho những thứ như chỉnh sửa nội tuyến dạng lưới. Gợi ý duy nhất là hoàn toàn không sử dụng 'setTimeout'. Tôi nghĩ đó là vấn đề của mọi người với câu trả lời này. Nó quá khó. Thay vào đó, đối với sự kiện làm on("keydown", function(event) { enterPressed = true; }và sau đó trong sự kiện gửi, hãy làm on("submit", function(e) { if (pressedEnter == true) { pressedEnter = false; e.preventDefault(); return false;}Điều này sẽ đảm bảo rằng nó hoạt động bất kể sự chậm trễ.
Curtis Snowden

3

Đây là cách hoàn hảo, Bạn sẽ không được chuyển hướng từ trang của bạn

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

2

Tôi gặp một vấn đề tương tự, ở đó tôi có một lưới với "trường văn bản ajax" (Yii CGridView) và chỉ một nút gửi. Mỗi lần tôi thực hiện tìm kiếm trên một trường văn bản và nhấn vào biểu mẫu đã gửi. Tôi đã phải làm một cái gì đó với nút vì đó là nút chung duy nhất giữa các khung nhìn (mẫu MVC). Tất cả tôi phải làm là loại bỏ type="submit"và đặtonclick="document.forms[0].submit()


2

Tôi nghĩ rằng nó được bao phủ đầy đủ với tất cả các câu trả lời, nhưng nếu bạn đang sử dụng một nút có một số mã xác thực JavaScript, bạn chỉ có thể đặt onkeypress của biểu mẫu cho Enter để gọi trình của bạn như mong đợi:

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

JS onkeypress có thể là bất cứ điều gì bạn cần làm. Không cần thay đổi toàn cầu lớn hơn. Điều này đặc biệt đúng nếu bạn không phải là người viết mã ứng dụng từ đầu và bạn đã được sửa chữa trang web của người khác mà không xé nó ra và kiểm tra lại.


Tôi nhận ra đó là một biến thể của câu trả lời của Tom Hubbard, mà tôi + 1'd vì đó thực sự là những gì tôi đã tự làm hôm nay trước khi tìm kiếm các ý tưởng khác.
tỏi

2

Có nhiều câu trả lời hay ở đây rồi, tôi chỉ muốn đóng góp một cái gì đó từ góc độ UX. Điều khiển bàn phím trong các hình thức là rất quan trọng.

Câu hỏi là làm thế nào để vô hiệu hóa từ trình trên phím nhấn Enter. Không phải làm sao để bỏ quaEnter trong toàn bộ một ứng dụng. Vì vậy, hãy xem xét việc gắn trình xử lý vào một phần tử biểu mẫu, không phải cửa sổ.

Vô hiệu hóa Enterđể gửi biểu mẫu vẫn nên cho phép như sau:

  1. Gửi mẫu qua EnterGửi khi nút gửi được tập trung.
  2. Gửi biểu mẫu khi tất cả các lĩnh vực được điền.
  3. Tương tác với các nút không gửi qua Enter.

Đây chỉ là nồi hơi nhưng nó tuân theo cả ba điều kiện.

$('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

Một cái gì đó tôi chưa thấy đã trả lời ở đây: khi bạn duyệt qua các yếu tố trên trang, nhấn Enterkhi bạn nhận được nút gửi sẽ kích hoạt trình xử lý onsubmit trên biểu mẫu, nhưng nó sẽ ghi lại sự kiện dưới dạng MouseEvent. Đây là giải pháp ngắn của tôi để bao quát hầu hết các cơ sở:

Đây không phải là câu trả lời liên quan đến 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();
}

Để tìm một ví dụ hoạt động: https://jsfiddle.net/nemearial/6rooseva2/


0

Trong trường hợp cụ thể của tôi, tôi đã phải dừng ENTER gửi biểu mẫu và cũng mô phỏng việc nhấp vào nút gửi. Điều này là do nút gửi có trình xử lý nhấp chuột vào nó vì chúng tôi đã ở trong một cửa sổ phương thức (mã cũ được kế thừa). Trong mọi trường hợp đây là giải pháp kết hợp của tôi cho trường hợp này.

    $('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;
        }
    });

Ca sử dụng này đặc biệt hữu ích cho những người làm việc với IE8.


0

Điều này làm việc cho tôi

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

0

Tôi muốn thêm một ít mã CoffeeScript (không được kiểm tra trường):

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

(Tôi hy vọng bạn thích thủ thuật hay trong mệnh đề trừ khi.)


0

Sử dụng Javascript (không kiểm tra bất kỳ trường đầu vào nào):

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

Nếu ai đó muốn áp dụng điều này trên các trường cụ thể, ví dụ văn bản loại đầu vào:

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

Điều này hoạt động tốt trong trường hợp của tôi.


0

Đi vào css của bạn và thêm nó vào đó sau đó sẽ tự động chặn việc gửi biểu mẫu của bạn miễn là bạn đã gửi đầu vào nếu bạn không còn muốn nữa, bạn có thể xóa nó hoặc gõ activatedeactivatethay vào đó

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

0

Bạn cũng có thể sử dụng javascript:void(0)để ngăn chặn việc gửi biểu mẫu.

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


không hoạt động khi bạn đặc biệt có method="post"trên mẫu của bạn. Chẳng hạn, tôi muốn biểu mẫu được gửi bằng các nút, nhưng không phải khi nhấn enter trong khi tập trung vào đầu vào.
Souleste

Đối với điều kiện đó, bạn có thể sử dụng các câu trả lời ở trên vì câu trả lời này dựa trên việc ngăn chặn gửi biểu mẫu bằng cách nhập và nhấp vào cả hai. ví dụ trên có method="post"hình thức và công việc của nó, kiểm tra lại.
Nisharg Shah

-2

Điều này đã làm việc cho tôi trong tất cả các trình duyệt sau nhiều thất vọng với các giải pháp khác. Hàm bên ngoài name_space chỉ là để tránh khai báo toàn cầu, một cái gì đó tôi cũng khuyên bạn nên.

$(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;    
        }
    }
}

Sử dụng mẫu:

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

-2

Sử dụng:

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