Gửi biểu mẫu trên 'Enter' bằng jQuery?


427

Tôi có một hình thức đăng nhập bog tiêu chuẩn - một trường văn bản email, một lĩnh vực mật khẩu và một nút gửi trên một dự án AIR đó là sử dụng HTML / jQuery. Khi tôi nhấn Enter trên biểu mẫu, toàn bộ nội dung của biểu mẫu sẽ biến mất, nhưng biểu mẫu không được gửi. Có ai biết đây có phải là sự cố của Webkit không (Adobe AIR sử dụng Webkit cho HTML) hoặc nếu tôi đã làm hỏng mọi thứ?

Tôi đã thử:

$('.input').keypress(function (e) {
  if (e.which == 13) {
    $('form#login').submit();
  }
});

Nhưng điều đó không ngăn chặn hành vi bù trừ, hoặc gửi biểu mẫu. Không có hành động liên quan đến biểu mẫu - đó có thể là vấn đề không? Tôi có thể đặt một hàm javascript trong hành động không?


3
Bạn có thực sự có một class = "đầu vào" thuộc tính trên của bạn <input ...? Có vẻ như nó phải là $ ('đầu vào').
Bấm

Các lớp được tạo lập trình bởi một CMS. Tuy nhiên, ngoài điều đó, việc phân bổ nó thành $ ('đầu vào') sẽ ảnh hưởng đến mọi đầu vào trên trang, bất kể tôi có muốn hành vi đó hay không. Xin lỗi nó xúc phạm sự nhạy cảm của bạn.
được hollenbeck

15
Nhạy cảm không bị xúc phạm trong ít nhất. Chỉ cần nghĩ rằng nó có thể là một giám sát dẫn đến vấn đề. Tiếp tục.
NexusRex

1
FYI: Câu trả lời được chấp nhận của bạn không hoàn toàn chính xác. Tham khảo câu trả lời của tôi dưới đây.
NoBrainer

Câu trả lời:


399
$('.input').keypress(function (e) {
  if (e.which == 13) {
    $('form#login').submit();
    return false;    //<---- Add this line
  }
});

Kiểm tra câu trả lời stackoverflow này: event.preventDefault () so với return false

Về cơ bản, "return false" giống như gọi e.preventDefaulte.stopPropagation().


3
Lưu ý rằng chúng không giống nhau. IE8 không có e.preventDefault. Đối với IE8, sử dụng event.returnValue = false;
mbokil

8
@mbokil Ngoại trừ khi sử dụng jQuery, nó cũng tương tự trong IE8. và IE7. Và IE6.
Kevin B

Nếu bạn muốn nhập đầu tiên vào các trường đầu vào, hãy đặt "return false;" bên trong câu lệnh if.
Juni Brosas

173

Ngoài việc trả lại sai như Jason Cohen đã đề cập. Bạn cũng có thể phải ngăn chặn Lỗi

e.preventDefault();

13
như @NoBrainer đã nói, điều này là sai: return falsetrong một sự kiện được quản lý bởi jQuery sẽ tự động gọi e.preventDefault ()
Riccardo Galli

83

Không biết có giúp được gì không, nhưng bạn có thể thử mô phỏng nhấp vào nút gửi, thay vì gửi trực tiếp biểu mẫu. Tôi có đoạn mã sau trong sản xuất và nó hoạt động tốt:

    $('.input').keypress(function(e) {
        if(e.which == 13) {
            jQuery(this).blur();
            jQuery('#submit').focus().click();
        }
    });

Lưu ý: jQuery ('# submit'). Focus () làm cho nút hoạt hình khi nhấn Enter.


2
Hoạt động tuyệt vời nhưng tôi đã phải thêm "return false;" để ngăn chặn đệ trình hai hình thức.
mã90

Làm việc | Xem RẤT NHIỀU kết quả như thế này nói về kích hoạt, sendkey, v.v., doh, blah ..., nhưng đó là công việc duy nhất với tôi và thực sự gửi một nhấp chuột vào một nút. Không gửi (). Vì vậy, mẹo là các hàm tập trung (). Click () trong bí mật. CẢM ƠN BẠN.
m3nda

Hoạt động, nhưng tôi đã phải đặt mã này dưới: $ (tài liệu). Đã (hàm () {...
shasi kanth

61

Quay trở lại falseđể ngăn chặn tổ hợp phím tiếp tục.


30

Có bất kỳ lý do nào bạn phải móc và kiểm tra phím enter không?

Bạn không thể đơn giản thêm một

<input type="submit" /> 

vào mẫu của bạn và có tự nhiên được gửi khi nhập được đẩy không? Sau đó, bạn thậm chí có thể móc onsubmithành động của biểu mẫu và gọi hàm xác thực từ đó nếu bạn muốn ...

Bạn thậm chí có thể sử dụng onsubmitnhư một bài kiểm tra để xem nếu biểu mẫu của bạn đang được gửi, nhưng nó sẽ không hoạt động nếu bạn gọi form.submit().


1
Hoàn toàn đồng ý. Sở thích của tôi sẽ luôn là sử dụng chức năng riêng của trình duyệt (đầu vào của loại = gửi phản hồi tự nhiên cho một lần nhấn phím nhập) thay vì thêm các tập lệnh bị loại bỏ thêm ..
Aaron

1
Vấn đề là, điều gì sẽ xảy ra nếu bạn đang thực hiện công cụ ajax và không có một postback thực sự cho máy chủ, nhưng bạn muốn UI hoạt động như người dùng mong đợi?
chúa tể

Thật vậy ... Tôi đã bỏ qua toàn bộ return false;điều.
chúa tể

14

Đây là một cách để làm điều này như một plugin JQuery (trong trường hợp bạn muốn sử dụng lại chức năng):

$.fn.onEnterKey =
    function( closure ) {
        $(this).keypress(
            function( event ) {
                var code = event.keyCode ? event.keyCode : event.which;

                if (code == 13) {
                    closure();
                    return false;
                }
            } );
    }

Bây giờ nếu bạn muốn trang trí một <input>yếu tố với loại chức năng này, nó đơn giản như thế này:

$('#your-input-id').onEnterKey(
    function() {
        // Do stuff here
    } );

12

Bạn cũng có thể chỉ cần thêm onsubmit="return false"vào mã biểu mẫu trong trang để ngăn hành vi mặc định.

Sau đó móc ( .bindhoặc .live) submitsự kiện của biểu mẫu vào bất kỳ chức năng nào với jQuery trong tệp javascript.

Đây là một mã mẫu để giúp:

HTML

<form id="search_form" onsubmit="return false">
   <input type="text" id="search_field"/>
   <input type="button" id="search_btn" value="SEARCH"/>
</form>

Javascript + jQuery

$(document).ready(function() {

    $('#search_form').live("submit", function() {
        any_function()
    });
});

Điều này hoạt động kể từ 2011-04-13, với Firefox 4.0 và jQuery 1.4.3


Nó không hoạt động trong Chrome. Dù sao cũng sẽ nộp.
Marcelo Agimóvel

5

Đây là mã của tôi:

  $("#txtMessage").on( "keypress", function(event) {
    if (event.which == 13 && !event.shiftKey) {
        event.preventDefault();
        $("#frSendMessage").submit();
    }
    });

4

Ngoài ra để duy trì khả năng truy cập, bạn nên sử dụng điều này để xác định mã khóa của mình:

c = e.which ? e.which : e.keyCode;

if (c == 13) ...

3

Chỉ cần thêm để thực hiện dễ dàng. Bạn có thể chỉ cần tạo một biểu mẫu và sau đó ẩn nút gửi:

Ví dụ:

<form action="submit.php" method="post">
Name : <input type="text" name="test">
<input type="submit" style="display: none;">
</form>

@cebirci và phiên bản chrome của bạn là gì? Tôi đã thử nghiệm từ máy tính xách tay đến máy tính và mã của tôi chỉ hoạt động. Hãy thử tải xuống chrome mới nhất trước khi bạn đánh dấu nó xuống câu trả lời của tôi.
Joem Maranan

2

Tôi sử dụng bây giờ

$("form").submit(function(event){
...
}

Lúc đầu, tôi đã thêm một eventhandler vào nút gửi đã tạo ra lỗi cho tôi.


1

Hôm nay tôi phát hiện ra sự kiện nhấn phím không được kích hoạt khi nhấn phím Enter, vì vậy bạn có thể muốn chuyển sang keydown () hoặc keyup ().

Kịch bản thử nghiệm của tôi:

        $('.module input').keydown(function (e) {
            var keyCode = e.which;
            console.log("keydown ("+keyCode+")")
            if (keyCode == 13) {
                console.log("enter");
                return false;
            }
        });
        $('.module input').keyup(function (e) {
            var keyCode = e.which;
            console.log("keyup ("+keyCode+")")
            if (keyCode == 13) {
                console.log("enter");
                return false;
            }
        });
        $('.module input').keypress(function (e) {
            var keyCode = e.which;
            console.log("keypress ("+keyCode+")");
            if (keyCode == 13) {
                console.log("Enter");
                return false;
            }
        });

Đầu ra trong bảng điều khiển khi gõ "A Enter B" trên bàn phím:

keydown (65)
keypress (97)
keyup (65)

keydown (13)
enter
keyup (13)
enter

keydown (66)
keypress (98)
keyup (66)

Bạn thấy trong chuỗi thứ hai, 'phím nhấn' bị thiếu, nhưng mã đăng ký phím và mã khóa '13' khi được nhấn / nhả. Theo tài liệu jQuery về chức năng nhấn phím () :

Note: as the keypress event isn't covered by any official specification, the actual behavior encountered when using it may differ across browsers, browser versions, and platforms.

Đã thử nghiệm trên IE11 và FF61 trên Máy chủ 2012 R2


0

Trong mã HTML:

<form action="POST" onsubmit="ajax_submit();return false;">
    <b>First Name:</b> <input type="text" name="firstname" id="firstname">
    <br>
    <b>Last Name:</b> <input type="text" name="lastname" id="lastname">
    <br>
    <input type="submit" name="send" onclick="ajax_submit();">
</form>

Trong mã Js:

function ajax_submit()
{
    $.ajax({
        url: "submit.php",
        type: "POST",
        data: {
            firstname: $("#firstname").val(),
            lastname: $("#lastname").val()
        },
        dataType: "JSON",
        success: function (jsonStr) {
            // another codes when result is success
        }
    });
}

1
Xin vui lòng không gửi câu trả lời giống hệt nhau cho nhiều câu hỏi. Đăng một câu trả lời hay, sau đó bỏ phiếu / gắn cờ để đóng các câu hỏi khác dưới dạng trùng lặp. Nếu câu hỏi không trùng lặp, điều chỉnh câu trả lời của bạn cho câu hỏi.
Paul Roub

@PaulRoub câu trả lời của tôi có một số khác biệt với người khác.
mghhgm

Làm thế nào là câu trả lời này khác với điều này hay điều này ?
Paul Roub

@PaulRoub Tôi có vấn đề này và đầu tiên tìm kiếm google cho điều này. Những trang đó, nói về vấn đề này nhưng không đơn giản. Khi tôi tìm thấy câu trả lời tốt nhất, tôi quyết định chia sẻ điều này trên trang đó nói về việc giúp đỡ người dùng khi tìm kiếm này, xem câu trả lời của tôi trên một số trang stackoverflow tương tự.
mghhgm

1
câu trả lời này hoàn toàn không liên quan đến câu hỏi
Zoltán Süle

-4

Thử cái này:

var form = document.formname;

if($(form).length > 0)
{
    $(form).keypress(function (e){
        code = e.keyCode ? e.keyCode : e.which;
        if(code.toString() == 13) 
        {
             formsubmit();
        }
    })
}

9
Điều này là pha trộn jquery với javilla javascript một cách khó chịu, và bao gồm một dàn diễn viên thực sự kỳ quặc chỉ gây nhầm lẫn mọi thứ
moopet
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.