jquery vô hiệu hóa hình thức gửi vào enter


207

Tôi có javascript sau trong trang của tôi dường như không hoạt động.

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

Tôi muốn vô hiệu hóa việc gửi biểu mẫu khi nhập hoặc tốt hơn là gọi biểu mẫu ajax của tôi. Hoặc là giải pháp được chấp nhận nhưng mã tôi bao gồm ở trên không ngăn biểu mẫu gửi.


3
Đây là một giải pháp HTML đơn giản: stackoverflow.com/a/51507806/337934
SamB

Câu trả lời:


420

Nếu keyCodekhông bị bắt, hãy bắt which:

$('#formid').on('keyup keypress', function(e) {
  var keyCode = e.keyCode || e.which;
  if (keyCode === 13) { 
    e.preventDefault();
    return false;
  }
});

EDIT: bỏ lỡ nó, tốt hơn là sử dụng keyupthay vìkeypress

EDIT 2: Như trong một số phiên bản Firefox mới hơn, việc gửi biểu mẫu không bị ngăn chặn, việc thêm sự kiện nhấn phím vào biểu mẫu cũng an toàn hơn. Ngoài ra, nó không hoạt động (nữa?) Bằng cách chỉ ràng buộc sự kiện với biểu mẫu "tên" mà chỉ với id mẫu. Do đó tôi đã làm điều này rõ ràng hơn bằng cách thay đổi ví dụ mã một cách thích hợp.

EDIT 3: Thay đổi bind()thànhon()


15
jQuery normalises nó e.which, vì vậy bạn không cần phải kiểm tra cho e.keyCode, nhưng 1 cho các nguyên nhân thường gặp nhất cho vấn đề này.
Bojangles

4
Bạn có cần return false;cho việc này? e.preventDefault();có vẻ khó chịu
chromigo

10
Quan trọng! Giải pháp này phá vỡ khối trong textarea.
Khokhlov Đức

4
Vấn đề là nếu tôi có cùng một hộp văn bản, bây giờ tôi không thể thêm một mục nhập (để tạo một dòng mới) trong hộp văn bản.
Tikky

3
keyCode === 13 && !$(e.target).is('textarea')
teran

62

Thông thường hình thức được gửi Enterkhi bạn tập trung vào các yếu tố đầu vào.

Chúng ta có thể vô hiệu hóa Enterchính (mã 13) trên các yếu tố đầu vào trong một hình thức:

$('form input').on('keypress', function(e) {
    return e.which !== 13;
});

DEMO: http://jsfiddle.net/bnx96/325/


Nút iOS Go là vấn đề của tôi trên trường nhập tự động hoàn thành tùy chỉnh. Điều này đã giải quyết nó.
Dylan Valade

11
Điều này ngăn khóa enter được sử dụng trong textareascùng một hình thức. Sử dụng $("form input")thay vì $("form :input")dường như để sửa chữa nó. DEMO: jsfiddle.net/bnx96/279
shaneparsons

43

Thậm chí ngắn hơn:

$('myform').submit(function() {
  return false;
});

35
Nhưng điều này sẽ ngăn người dùng nhấp chuột là tốt?
haibuihoang

5
@haibuihoang Có, điều này sẽ vô hiệu hóa biểu mẫu.
Tom

7
Bạn nên sử dụng function(e) {e.preventDefault();}làm giá trị trả về trong trình xử lý sự kiện không được dùng nữa: stackoverflow.com/a/20045473/601386
cúm

6
@ user1111929 Điều này không hoạt động tốt nhưng nó không phải là câu trả lời hàng đầu vì câu hỏi chỉ hỏi về Entervà không phải về việc vô hiệu hóa gửi biểu mẫu bằng Submitnút.
daveslab

Một tình huống phổ biến trong đó bạn có thể muốn duy trì việc gửi biểu mẫu, nhưng vô hiệu hóa việc gửi khi nhấn phím 'enter', là nếu bạn quyết định sử dụng một onClicksự kiện jQuery để xác thực một biểu mẫu và vẫn gửi bằng jQuery. Nói cách khác, có những trường hợp bạn chỉ muốn gửi qua javascript / jQuery. Mặc dù bạn vẫn có thể sử dụng AJAX với giải pháp này, nhưng nó vô hiệu hóa chức năng cơ bản của submitphương thức.
JRad xấu


14
$(document).on('keyup keypress', 'form input[type="text"]', function(e) {
  if(e.which == 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 trang web (cũng trên các biểu mẫu được chèn bằng ajax), chỉ ngăn các mục nhập trong 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.


9

Hầu hết các câu trả lời ở trên sẽ ngăn người dùng thêm dòng mới vào trường textarea. Nếu đây là điều bạn muốn tránh, bạn có thể loại trừ trường hợp cụ thể này bằng cách kiểm tra phần tử nào hiện đang tập trung:

var keyCode = e.keyCode || e.which;
if (keyCode === 13 && !$(document.activeElement).is('textarea')) {
  e.preventDefault();
  return false;
}

8

Quá mức cần thiết để nắm bắt và kiểm tra mọi tổ hợp phím cho phím ENTER thực sự làm tôi khó chịu, vì vậy giải pháp của tôi phụ thuộc vào hành vi trình duyệt sau:

Nhấn ENTER sẽ kích hoạt một sự kiện nhấp chuột vào nút gửi (được thử nghiệm trong IE11, Chrome 38, FF 31) ** (ref: http://mattsnider.com/how-forms-submit-when-pressing-enter/ )

Vì vậy, giải pháp của tôi là loại bỏ nút gửi tiêu chuẩn (nghĩa là <input type="submit">) để hành vi trên không thành công vì không có nút gửi để nhấp một cách kỳ diệu khi nhấn ENTER. Thay vào đó, tôi sử dụng trình xử lý nhấp chuột jQuery trên một nút thông thường để gửi biểu mẫu thông qua .submit()phương thức của jQuery .

<form id="myform" method="post">
  <input name="fav_color" type="text">
  <input name="fav_color_2" type="text">
<button type="button" id="form-button-submit">DO IT!</button>
</form>

<script>
 $('#form-button-submit').click(function(){
    $('#myform').submit();
  });
</script>

Bản trình diễn: http://codepen.io/anon/pen/fxeyv?editors=101

** hành vi này không được áp dụng nếu biểu mẫu chỉ có 1 trường đầu vào và trường đó là đầu vào 'văn bản'; trong trường hợp này, biểu mẫu sẽ được gửi theo khóa ENTER ngay cả khi không có nút gửi nào xuất hiện trong đánh dấu HTML (ví dụ: trường tìm kiếm). Đây là hành vi tiêu chuẩn của trình duyệt từ những năm 90.


Tôi đã thêm một hộp đầu vào vô hình để truy cập "biểu mẫu sẽ được gửi theo khóa ENTER" do "biểu mẫu chỉ có 1 trường nhập và trường đó là đầu vào" văn bản ".
Luo Jiong Hui

6

nếu bạn chỉ muốn tắt nút gửi và nhập, hãy sử dụng sự kiện onsubmit của biểu mẫu

<form onsubmit="return false;">

Bạn có thể thay thế "return false" bằng hàm gọi tới hàm JS sẽ làm bất cứ điều gì cần thiết và cũng gửi biểu mẫu như bước cuối cùng.


1
Điều này sẽ vô hiệu hóa tất cả các hình thức gửi, bao gồm cả việc nhấp vào nút gửi.
Nick

không phải 100% ... làm việc thường xuyên gửi một khóa ... sử dụng tốt nhất jquery để ngăn chặn
KingRider

Câu trả lời thay thế tốt (với những lời cảnh báo ở trên) bởi vì ... tốt, đôi khi đây là tất cả những gì bạn cần.
emilys

đây chính xác là những gì tôi cần cho một tình huống, cảm ơn bạn
shababhsiddique 17/03/18

4

Bạn có thể làm điều này một cách hoàn hảo trong Javascript thuần túy, đơn giản và không cần thư viện. Đây là câu trả lời chi tiết của tôi cho một chủ đề tương tự: Vô hiệu hóa phím enter cho biểu mẫu

Tóm lại, đây là mã:

<script type="text/javascript">
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>

Mã này là để ngăn phím "Enter" chỉ cho kiểu nhập = 'văn bản'. (Vì khách truy cập có thể cần nhấn enter trên toàn trang) Nếu bạn cũng muốn tắt "Enter" cho các hành động khác, bạn có thể thêm console.log (e); cho mục đích thử nghiệm của bạn và nhấn F12 bằng chrome, hãy chuyển đến tab "console" và nhấn "backspace" trên trang và nhìn vào bên trong để xem giá trị nào được trả về, sau đó bạn có thể nhắm mục tiêu tất cả các tham số đó để tăng cường hơn nữa mã ở trên để phù hợp với nhu cầu của bạn về "e.target.nodeName" , "e.target.type" và nhiều hơn nữa ...


2
Thật ra nó nên như vậy e.target.nodeName === 'INPUT' && e.target.type !== 'textarea'. Với mã được chỉ định, nó sẽ cho phép gửi biểu mẫu nếu radio hoặc hộp kiểm được tập trung.
vào

3

Tôi không biết nếu bạn đã giải quyết vấn đề này, hoặc bất cứ ai đang cố gắng giải quyết vấn đề này ngay bây giờ, nhưng đây là giải pháp của tôi cho vấn đề này!

$j(':input:not(textarea)').keydown(function(event){
    var kc = event.witch || event.keyCode;
    if(kc == 13){
    event.preventDefault();
        $j(this).closest('form').attr('data-oldaction', function(){
            return $(this).attr('action');
        }).attr('action', 'javascript:;');

        alert('some_text_if_you_want');

        $j(this).closest('form').attr('action', function(){
            return $(this).attr('data-oldaction');
        });
        return false;
    }
});

2

Cách đơn giản là thay đổi loại nút thành nút - trong html và sau đó thêm sự kiện trong js ...

Thay đổi từ đây:

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

Đến

<form id="myForm">
   <button type="button" id="btnSubmit">Submit</button>
</form>

Và trong js hoặc jquery thêm:

("#btnSubmit").click(function () {
    $('#myForm').submit();
});

1

Đoạn mã sau sẽ loại bỏ khóa enter được sử dụng để gửi biểu mẫu, nhưng vẫn sẽ cho phép bạn sử dụng khóa enter trong một vùng văn bản. Bạn có thể chỉnh sửa nó thêm tùy thuộc vào nhu cầu của bạn.

<script type="text/javascript">
        function stopRKey(evt) {
          var evt = (evt) ? evt : ((event) ? event : null);
          var node = (evt.target) ? evt.target : ((evt.srcElement) ? evt.srcElement : null);
          if ((evt.keyCode == 13) && ((node.type=="text") || (node.type=="radio") || (node.type=="checkbox")) )  {return false;}
        }

        document.onkeypress = stopRKey;
</script> 

1

Trong firefox, khi bạn nhập và nhấn enter, nó sẽ gửi biểu mẫu phía trên. Các giải pháp là trong mẫu sẽ gửi thêm:

<input type="submit" onclick="return false;" style="display:none" />

1

3 năm sau và không một người nào trả lời hoàn toàn câu hỏi này.

Người hỏi muốn hủy việc gửi biểu mẫu mặc định và gọi Ajax của riêng họ. Đây là một yêu cầu đơn giản với một giải pháp đơn giản. Không cần phải chặn mọi ký tự được nhập vào mỗi đầu vào.

Giả sử biểu mẫu có nút gửi, dù là a <button id="save-form">hay an <input id="save-form" type="submit">, hãy làm:

$("#save-form").on("click", function () {
    $.ajax({
        ...
    });
    return false;
});


-2

Khi tệp kết thúc (tải xong), tập lệnh sẽ phát hiện từng sự kiện cho phím "Entry" và anh ta vô hiệu hóa sự kiện phía sau.

<script>
            $(document).ready(function () {
                $(window).keydown(function(event){
                    if(event.keyCode == 13) {
                        e.preventDefault(); // Disable the " Entry " key
                        return false;               
                    }
                });
            });
        </script>

thêm một số lời giải thích
HaveNoDisplayName

@HaveNoDisplayName: Đã cập nhật.
McN lượn

-4

Giải pháp hoàn chỉnh trong JavaScript cho tất cả các trình duyệt

Các mã ở trên và hầu hết các giải pháp là hoàn hảo. Tuy nhiên, tôi nghĩ rằng "câu trả lời ngắn" thích nhất là không đầy đủ.

Vì vậy, đây là toàn bộ câu trả lời. trong JavaScript với Hỗ trợ riêng cho IE 7 là tốt.

var form = document.getElementById("testForm");
form.addEventListener("submit",function(e){e.preventDefault(); return false;});

Giải pháp này bây giờ sẽ ngăn người dùng gửi bằng phím Enter và sẽ không tải lại trang hoặc đưa bạn lên đầu trang, nếu biểu mẫu của bạn ở đâu đó bên dưới.


8
Điều này cũng ngăn biểu mẫu được gửi nếu bạn nhấp vào nút "Gửi".
Mario Werner

-10

Còn cái này thì sao:

$(":submit").closest("form").submit(function(){
    $(':submit').attr('disabled', 'disabled');
});

Điều này sẽ vô hiệu hóa tất cả các hình thức với các nút gửi trong ứng dụng của bạn.

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.