2011-01-24 38 views
7

Tôi có một trang web mà tôi muốn ghi đè F5 để nó không làm mới trang, nhưng thay vào đó thực hiện một số cuộc gọi ajax để làm mới một số phần nhất định. Điều này có thể không?Xử lý F5 trong JQuery

EDIT: Bởi vì không ai trong số bạn dường như hiểu được lý do tại sao tôi muốn làm điều gì đó như thế này, nếu bạn thực sự quan tâm sau đó truy cập những liên kết này:

dự án nguồn mở (đơn giản web-thiết bị đầu cuối): http://code.google.com/p/web-terminal

Chạy demo của đơn giản web-thiết bị đầu cuối: http://web-terminal.net.pine.arvixe.com

Sống thực hiện (phiên bản diễn đàn): http://www.u413.com

+0

Tại sao? Tôi không muốn ghi đè lên nút làm mới, chỉ cần nhấn phím F5. Trong cùng một cách, bạn có thể ghi đè lên phím ENTER và ngăn không cho nó gửi biểu mẫu để bạn có thể xử lý sự kiện một cách không đồng bộ. – Chev

+0

@Chevex Đó là hầu như không giống nhau. Tôi không muốn một số kịch bản thay đổi cách các phím chức năng hoạt động; chúng là cơ bản và phần lớn * được chuẩn hóa *. Tôi cũng hy vọng rằng điều này là không thể. –

+0

Tôi nghĩ nó thực sự là có thể. Nhưng trừ khi đó là một loại trò chơi và bạn sẽ luôn đảm bảo những thứ cũ không được lưu trong bộ nhớ cache: ** Đừng phá vỡ F5! ** – ThiefMaster

Trả lời

7

Điều này giống với câu trả lời được chấp nhận ở trên, ngoại trừ việc không nắm bắt sự kiện 'nhấn phím'.

Nếu bạn nắm bắt sự kiện 'nhấn phím', bạn cũng chặn phím 't'. Đối với một số lý do cả mã khóa và mã khóa ASCII đều bị bắt nếu bạn sử dụng sự kiện 'nhấn phím' (mà bạn không thể thấy trong trình gỡ lỗi chrome). Phím F5 là '116', nhưng mã khóa ASCII cho 't' cũng là 116, do đó, với sự kiện 'nhấn phím' bạn chặn F5, nhưng bạn cũng chặn 't' toàn bộ ứng dụng.

$(document).bind('keydown keyup', function(e) { 
    if(e.which === 116) { 
     console.log('blocked'); 
     return false; 
    } 
    if(e.which === 82 && e.ctrlKey) { 
     console.log('blocked'); 
     return false; 
    } 
}); 

Đây là coffeescript chỉ để cho vui :)

$(document).bind "keydown keyup", (e) -> 
    if e.keyCode is 116 
     console.log "blocked" 
     return false 
    if e.keyCode is 82 and e.ctrlKey 
     console.log "blocked" 
     false 
10

Vâng, bạn có thể làm điều đó (ít nhất trong một số trình duyệt, tôi không chắc chắn liệu điều này có hoạt động trên trình duyệt) hay không, nhưng nó sẽ là một trải nghiệm người dùng khá tệ.

$(document).bind('keypress keydown keyup', function(e) { 
    if(e.which === 116) { 
     console.log('blocked'); 
     return false; 
    } 
    if(e.which === 82 && e.ctrlKey) { 
     console.log('blocked'); 
     return false; 
    } 
}); 

Dù sao đi nữa, có nhiều cách khác để người dùng làm mới trang web. Nhấn ctrl + r (cmd + r) hoặc chỉ cần nhấn nút làm mới. Vâng, tổ hợp phím nóng khác có thể bị chặn tương tự, nhưng không có cách nào để chặn nút làm mới.

-

Nó có thể là một ý tưởng rất lớn tốt hơn không để ngăn chặn những hành vi duyệt mặc định, nhưng để hỏi một cách duyên dáng. Điều đó có thể được thực hiện bằng cách liên kết một trình xử lý sự kiện với sự kiện onbeforeunload, sự kiện này sẽ kích hoạt trước khi một trang web được tải xuống.

$(window).bind('beforeunload', function() { 
    return 'Are you really sure?'; 
}); 
+0

AFAIK jQuery bình thường hóa đối tượng sự kiện, vì vậy sẽ tốt cho khả năng tương thích của trình duyệt x. –

+0

+1 Đánh bại tôi với nó, gõ đẹp –

+0

Trong trường hợp của tôi nó sẽ không phải là một trải nghiệm người dùng xấu. Tôi sẽ không đi về việc thúc đẩy các dự án của riêng tôi nhưng trong trường hợp này nó sẽ là tuyệt vời. – Chev

0

Đây là ví dụ về cách ghi đè phím F5 sẽ nâng cao trải nghiệm người dùng. Tôi đang xây dựng trình chỉnh sửa bản tin cho khách hàng của mình và tôi cần phải ngăn trang tải lại khi người dùng vô tình nhấn phím F5 nhưng thay vào đó nó làm mới xem trước email được tạo từ mã html đã nhập.

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