2009-10-28 31 views
9

Tôi có một nút và thói quen javascript sau đây.Tại sao việc trả về false trong cuộc gọi lại gọi lại keydown không dừng sự kiện bấm nút?

$("button").keydown(function(key) { 
    switch(key.keyCode) { 
    case 32: //space 
    return false; 
    } 
}); 

như tôi đã hiểu, return false; sẽ dừng việc xử lý phím. Vì vậy, $("button").click(); sẽ không được gọi. Đối với các mã phím khác, điều này hoạt động như mong đợi. Ví dụ: nếu tôi chặn 40, là nút dưới, trang không cuộn.

Tôi nhận thấy hành vi này trong firefox.

Tại sao return false; không dừng sự kiện nhấp nút trên không gian? Thông số javascript nói gì về điều này?

+1

thực sự có nói "return fale" trong mã thực của bạn không? Nếu vậy, đó có thể là vấn đề của bạn. fale. – rmeador

+0

Trong đoạn mã của bạn, bạn có "return fale;" - đây có phải là mã khi nó tồn tại không? nếu đó là một lỗi đánh máy đơn giản. – artlung

+0

Không Tôi mã thực sự của tôi trả về sai. Tôi thực sự sử dụng mã này để chặn các nút khác như xuống và nó hoạt động cho chúng. – johannes

Trả lời

13

Hy vọng điều này trả lời câu hỏi của bạn:

<input type="button" value="Press" onkeydown="doOtherStuff(); return false;"> 

return false; hủy thành công một sự kiện trên các trình duyệt nếu được gọi ở cuối thuộc tính trình xử lý sự kiện trong HTML. Hành vi này không được chỉ định chính thức ở bất cứ nơi nào theo như tôi biết.

Nếu bạn thay vì đặt một sự kiện thông qua một tài sản xử lý sự kiện trên phần tử DOM (ví dụ button.onkeydown = function(evt) {...}) hoặc sử dụng addEventListener/attachEvent (ví dụ button.addEventListener("keydown", function(evt) {...}, false)) sau đó chỉ cần trở về false từ chức năng không hoạt động ở mọi trình duyệt và bạn cần phải làm các công cụ returnValuepreventDefault() từ câu trả lời khác của tôi. preventDefault được chỉ định trong DOM 2 spec và được thực hiện bởi hầu hết các trình duyệt hiện đại chủ đạo. returnValue là đặc trưng của IE.

+0

Ở dạng asp.net của tôi, nó vẫn phát ra làm mới trang. – Si8

+1

@ Si8: Điều đó có thể xảy ra nếu tương đương với 'doOtherStuff()' ở trên ném lỗi. –

6

Trước tiên, nếu bạn đang phát hiện một ký tự có thể in, chẳng hạn như dấu cách, bạn sẽ thích hợp hơn với sự kiện keypress. Thứ hai, cách ngăn chặn hành động mặc định là gọi preventDefault() trên sự kiện trong trình duyệt không phải của IE và đặt thuộc tính returnValue của sự kiện thành false trong IE.

var button = document.getElementById("button"); 
button.onkeypress = function(evt) { 
    evt = evt || window.event; 
    var charCode = evt.keyCode || evt.which; 
    if (charCode == 32) { 
     if (evt.preventDefault) { 
      evt.preventDefault(); 
     } else { 
      evt.returnValue = false; 
     } 
    } 
}; 

Tôi không phải là một chuyên gia về jQuery và tôi cho rằng nó sẽ chăm sóc của việc thu thập các sự kiện dành cho bạn:

$("button").keypress(function(evt) { 
    var charCode = evt.keyCode || evt.which; 
    if (charCode == 32) { 
     if (evt.preventDefault) { 
      evt.preventDefault(); 
     } else { 
      evt.returnValue = false; 
     } 
    } 
}); 
+0

Tôi đã thử nghiệm nó và 'key.preventDefault();' không thay đổi gì trong firefox. 'keydown' không phát hiện các phím, để tạo ra các ký tự có thể in được, vậy có gì sai với' keydown'? – johannes

+0

OK. HTML tạo nút nào? Bạn có chắc là trình xử lý nhấn phím đang được gọi không? Trong trường hợp không gian, bạn có thể OK sử dụng 'keydown' và' keyCode' 32, nhưng nói chung với các ký tự có thể in bằng cách sử dụng 'keypress' tóm tắt mọi khác biệt tiềm năng giữa bàn phím hoặc thiết bị đầu vào khác bằng cách trích xuất ký tự phím bấm thay vì mã tương ứng với khóa trên thiết bị đầu vào. –

+0

@Tim: mẫu mã OPS ban đầu là jQuery hợp lệ để hủy sự kiện.Không có chuyển đổi mã trình duyệt thông thường nào là cần thiết trong trường hợp này. –

Các vấn đề liên quan