Nhập sự kiện nhấn phím trong JavaScript


330

Tôi có một formvới hai hộp văn bản, một chọn thả xuống và một nút radio . Khi enternhấn phím, tôi muốn gọi một hàm Javascript (Người dùng xác định), nhưng khi tôi nhấn nó, biểu mẫu được gửi.

Làm cách nào để ngăn chặn việc formgửi khi enternhấn phím?

Câu trả lời:


444
if(characterCode == 13)
{
    return false; // returning false will prevent the event from bubbling up.
}
else
{
    return true;
}

Ok, vì vậy hãy tưởng tượng bạn có hộp văn bản sau dưới dạng:

<input id="scriptBox" type="text" onkeypress="return runScript(event)" />

Để chạy một số tập lệnh "do người dùng xác định" từ hộp văn bản này khi nhấn phím enter và không gửi biểu mẫu, đây là một số mã mẫu . Xin lưu ý rằng chức năng này không thực hiện bất kỳ kiểm tra lỗi nào và rất có thể sẽ chỉ hoạt động trong IE. Để làm điều này đúng, bạn cần một giải pháp mạnh mẽ hơn, nhưng bạn sẽ có được ý tưởng chung.

function runScript(e) {
    //See notes about 'which' and 'key'
    if (e.keyCode == 13) {
        var tb = document.getElementById("scriptBox");
        eval(tb.value);
        return false;
    }
}

trả về giá trị của hàm sẽ cảnh báo cho bộ xử lý sự kiện không làm bong bóng sự kiện thêm nữa và sẽ ngăn sự kiện nhấn phím được xử lý thêm.

GHI CHÚ:

Nó được ra nhọn mà keyCodebây giờ bị phản . Giải pháp thay thế tốt nhất tiếp theo whichđã cũng bị phản đối .

Thật không may key, tiêu chuẩn ưa thích , được hỗ trợ rộng rãi bởi các trình duyệt hiện đại, có một số hành vi tinh ranh trong IE và Edge . Bất cứ điều gì cũ hơn IE11 vẫn sẽ cần một polyfill .

Hơn nữa, trong khi cảnh báo không được chấp nhận là khá đáng ngại keyCodewhich, việc loại bỏ những cảnh báo đó sẽ thể hiện một sự thay đổi lớn đối với số lượng lớn các trang web cũ. Vì lý do đó, không có khả năng họ sẽ đi bất cứ nơi nào sớm.


4
Chính xác những gì bạn có nghĩa là người dùng xác định? Giống như, người dùng nhập một số tập lệnh trong hộp văn bản và bạn chạy nó bằng Eval () ???
Josh

1
Đây có phải là một tình huống mà Ngăn chặn có thể được sử dụng?

12
@ Stuart.Sklinar - Thực hiện đánh giá người dùng nhập vào trình duyệt sẽ không cho họ quyền kiểm soát nhiều hơn nếu họ mở bảng điều khiển lệnh trong Chrome / FF / IE và tự gõ vào tập lệnh. Người duy nhất họ có thể làm tổn thương chính họ ... trừ khi tất nhiên bạn không thực thi bảo mật trên máy chủ. Đó là một vấn đề khác hoàn toàn.
Josh

1
@SteelBrain - Một lần nữa, đưa cho ai đó một hộp văn bản mà họ có thể nhập và sau đó evalnội dung bằng cách nhấn nút không khác gì nếu họ mở các công cụ dành cho nhà phát triển và thực hiện. Nếu đây là thứ gì đó được lưu vào DB và có thể được mở bởi người dùng KHÁC , thì đó sẽ là một vấn đề lớn, nhưng đó là một vấn đề hoàn toàn độc lập với đoạn trích nhỏ này.
Josh


137

Sử dụng cả hai event.whichevent.keyCode:

function (event) {
    if (event.which == 13 || event.keyCode == 13) {
        //code to execute here
        return false;
    }
    return true;
};

11
Tại sao cả event.which và event.keyCode?
Alex Spurling

35
Một số trình duyệt hỗ trợ whichnhững người khác hỗ trợ keyCode. Đó là thực hành tốt để bao gồm cả hai.
dùng568109

Đồng thời sử dụng keydownsự kiện thay vì keyuphoặckeypress
manish_s

@Agiagnoc nhưng sự kiện này nên được gắn vào?
Don Cheadle

2
@manish, nhấn phím cung cấp cho bạn nhiều thông tin để chơi hơn so với phím tắt / lên. stackoverflow.com/a/9905293/322537
Hermann Ingjaldsson

78

Nếu bạn đang sử dụng jQuery:

$('input[type=text]').on('keydown', function(e) {
    if (e.which == 13) {
        e.preventDefault();
    }
});

1
Tôi không thể làm việc này. Trình xử lý kích hoạt, nhưng preventDefaultdường như không dừng việc gửi biểu mẫu, trong Chrome ít nhất.
Drew Noakes

19
Bạn phải sử dụng sự kiện keydown thay vì keyup:$('input[type=text]').on('keydown', function(e) { if (e.which == 13) { e.preventDefault(); } });
Petar Donchev Marinov

2
keyup được kích hoạt SAU khi gửi, và do đó không thể hủy nó.
Pierre-Olivier Vares

Cả keyup và keypress đều làm việc cho tôi. Tôi đã đi với nhấn phím. Cảm ơn!
markiyanm

'keydown'là chính xác như các bình luận khác đang nêu. Vì nó không được thay đổi nên tôi sẽ cập nhật câu trả lời. Tôi đã sử dụng câu trả lời này và bị mắc kẹt trong một thời gian cho đến khi tôi trở lại và xem các ý kiến.
Matt K

71

event.key === "Nhập"

Gần đây và sạch sẽ hơn nhiều: sử dụng event.key. Không còn mã số tùy ý!

const node = document.getElementsByClassName(".mySelect")[0];
node.addEventListener("keydown", function(event) {
    if (event.key === "Enter") {
        event.preventDefault();
        // Do more work
    }
});

Tài liệu Mozilla

Trình duyệt được hỗ trợ


Đã tìm kiếm điều này. đã thấy thuộc tính quan trọng trong nhật ký giao diện điều khiển của sự kiện $. nghĩ rằng nó có thể đáng tin cậy hơn
tatsu

Đây không phải là một vĩ mô hay bí danh? Có bất kỳ lợi ích nào về hiệu suất bằng cách sử dụng mã này?
clockw0rk

1
keyCodebị phản đối Điều này dễ đọc và dễ bảo trì hơn một số nguyên ma thuật trong mã của bạn
Gibolt


17

Ghi đè onsubmithành động của biểu mẫu để gọi hàm của bạn và thêm return false sau nó, nghĩa là:

<form onsubmit="javascript:myfunc();return false;" >

Tôi không thể ghi đè onsubmit vì tôi có một mẫu khác được gửi trong trang này
Shyju

5
vâng bạn có thể Javascript là ngôn ngữ dựa trên nguyên mẫu. document.forms ["form_name"]. onsubmit = fucntion () {}
the_drow

Tôi có một quy trình xóa khác để chạy khi biểu mẫu được gửi. Vì vậy, tôi muốn duy trì như hiện tại
Shyju

17

Một giải pháp js phản ứng

 handleChange: function(e) {
    if (e.key == 'Enter') {
      console.log('test');
    }


 <div>
    <Input type="text"
       ref = "input"
       placeholder="hiya"
       onKeyPress={this.handleChange}
    />
 </div>

9

Vì vậy, có lẽ giải pháp tốt nhất để bao quát càng nhiều trình duyệt càng tốt và là bằng chứng trong tương lai sẽ là

if (event.which === 13 || event.keyCode === 13 || event.key === "Enter")

6

Nếu bạn muốn làm điều đó bằng cách sử dụng hoàn toàn java script thì đây là một ví dụ hoạt động hoàn hảo

Giả sử đây là tệp html của bạn

<!DOCTYPE html>
<html>
  <body style="width: 500px">
    <input type="text" id="textSearch"/> 
      <script type="text/javascript" src="public/js/popup.js"></script>
  </body>
</html>

trong tệp popup.js của bạn chỉ cần sử dụng chức năng này

var input = document.getElementById("textSearch");
input.addEventListener("keyup", function(event) {
    event.preventDefault();
    if (event.keyCode === 13) {
        alert("yes it works,I'm happy ");
    }
});

5

Mã bên dưới sẽ thêm người nghe cho ENTERkhóa trên toàn bộ trang.

Điều này có thể rất hữu ích trong các màn hình với một nút Hành động duy nhất, ví dụ: Đăng nhập, Đăng ký, Gửi, v.v.

<head>
        <!--Import jQuery IMPORTANT -->
        <script src="https://code.jquery.com/jquery-2.1.1.min.js"></script>

         <!--Listen to Enter key event-->
        <script type="text/javascript">

            $(document).keypress(function (e) {
                if (e.which == 13 || event.keyCode == 13) {
                    alert('enter key is pressed');
                }
            });
        </script>
    </head>

Đã thử nghiệm trên tất cả các trình duyệt.


3

Một giải pháp jQuery.

Tôi đến đây để tìm cách trì hoãn việc gửi biểu mẫu cho đến sau khi sự kiện mờ trên đầu vào văn bản đã bị hủy.

$(selector).keyup(function(e){
  /*
   * Delay the enter key form submit till after the hidden
   * input is updated.
   */

  // No need to do anything if it's not the enter key
  // Also only e.which is needed as this is the jQuery event object.
  if (e.which !== 13) {
       return;
  }

  // Prevent form submit
  e.preventDefault();

  // Trigger the blur event.
  this.blur();

  // Submit the form.
  $(e.target).closest('form').submit();
});

Sẽ rất tuyệt nếu có được một phiên bản tổng quát hơn, kích hoạt tất cả các sự kiện bị trì hoãn thay vì chỉ gửi biểu mẫu.


3

Một cách đơn giản và hiệu quả hơn theo quan điểm của tôi nên là:

function onPress_ENTER()
{
        var keyPressed = event.keyCode || event.which;

        //if ENTER is pressed
        if(keyPressed==13)
        {
            alert('enter pressed');
            keyPressed=null;
        }
        else
        {
            return false;
        }
}

2

Sử dụng TypeScript và tránh nhiều cuộc gọi trên hàm

let el1= <HTMLInputElement>document.getElementById('searchUser');
el1.onkeypress = SearchListEnter;

function SearchListEnter(event: KeyboardEvent) {
    if (event.which !== 13) {
        return;
    }
    // more stuff
}

Câu hỏi này là hơn tám tuổi. Bản đánh máy không tồn tại sau đó. Vì vậy, bạn có chắc chắn rằng bạn không trả lời một câu hỏi khác?
Nico Haase

2

Một chút đơn giản

Không gửi biểu mẫu trên phím nhấn "Enter":

<form id="form_cdb" onsubmit="return false">

Thực hiện chức năng trên phím nhấn "Enter":

<input type="text" autocomplete="off" onkeypress="if(event.key === 'Enter') my_event()">

1

js bản địa (lấy api)

document.onload = (() => {
    alert('ok');
    let keyListener = document.querySelector('#searchUser');
    // 
    keyListener.addEventListener('keypress', (e) => {
        if(e.keyCode === 13){
            let username = e.target.value;
            console.log(`username = ${username}`);
            fetch(`https://api.github.com/users/${username}`,{
                data: {
                    client_id: 'xxx',
                    client_secret: 'xxx'
                }
            })
            .then((user)=>{
                console.log(`user = ${user}`);
            });
            fetch(`https://api.github.com/users/${username}/repos`,{
                data: {
                    client_id: 'xxx',
                    client_secret: 'xxx'
                }
            })
            .then((repos)=>{
                console.log(`repos = ${repos}`);
                for (let i = 0; i < repos.length; i++) {
                     console.log(`repos ${i}  = ${repos[i]}`);
                }
            });
        }else{
            console.log(`e.keyCode = ${e.keyCode}`);
        }
    });
})();
<input _ngcontent-inf-0="" class="form-control" id="searchUser" placeholder="Github username..." type="text">


Tại sao client_id vv được đưa vào đây? Mã có hợp pháp không?
eddyparkinson

1
<form id="form1" runat="server" onkeypress="return event.keyCode != 13;">

Thêm mã này vào trang HTML của bạn ... nó sẽ vô hiệu hóa ... Enter Nút ..


rất tuyệt, cảm ơn
Chris Allinson

0
<div class="nav-search" id="nav-search">
        <form class="form-search">
            <span class="input-icon">
                <input type="text" placeholder="Search ..." class="nav-search-input" id="search_value" autocomplete="off" />
                <i class="ace-icon fa fa-search nav-search-icon"></i>
            </span>
            <input type="button" id="search" value="Search" class="btn btn-xs" style="border-radius: 5px;">
        </form>

</div>

<script type="text/javascript">
    $("#search_value").on('keydown', function(e) {
        if (e.which == 13) {
             $("#search").trigger('click');
            return false;
        }
    });
    $("#search").on('click',function(){
        alert('You press enter');
    });
</script>

0

Giải pháp trình duyệt chéo

Một số trình duyệt cũ đã triển khai các sự kiện keydown theo cách không chuẩn.

KeyBoardEvent.key là cách nó được cho là sẽ được thực hiện trong các trình duyệt hiện đại.

whichkeyCodehiện không được chấp nhận, nhưng dù sao cũng không nên kiểm tra các sự kiện này để mã hoạt động cho người dùng vẫn sử dụng các trình duyệt cũ hơn như IE.

Các isKeyPressedkiểm tra chức năng nếu chìa khóa ép được nhập và event.preventDefault()gây cản trở các hình thức từ nộp.

  if (isKeyPressed(event, 'Enter', 13)) {
    event.preventDefault();
    console.log('enter was pressed and is prevented');
  }

Ví dụ làm việc tối thiểu

Mã não

function isKeyPressed(event, expectedKey, expectedCode) {
  const code = event.which || event.keyCode;

  if (expectedKey === event.key || code === expectedCode) {
    return true;
  }
  return false;
}

document.getElementById('myInput').addEventListener('keydown', function(event) {
  if (isKeyPressed(event, 'Enter', 13)) {
    event.preventDefault();
    console.log('enter was pressed and is prevented');
  }
});

HTML

<form>
  <input id="myInput">
</form>

https://jsfiddle.net/tobiobeck/z13dh5r2/

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.