Phương pháp trình duyệt chéo tốt nhất để chụp CTRL + S bằng JQuery?


162

Người dùng của tôi muốn có thể nhấn Ctrl+ Sđể lưu biểu mẫu. Có cách nào để duyệt kết hợp phím Ctrl+ Svà gửi biểu mẫu của tôi không?

Ứng dụng được xây dựng trên Drupal, do đó jQuery có sẵn.

Câu trả lời:


121
$(window).keypress(function(event) {
    if (!(event.which == 115 && event.ctrlKey) && !(event.which == 19)) return true;
    alert("Ctrl-S pressed");
    event.preventDefault();
    return false;
});

Mã khóa có thể khác nhau giữa các trình duyệt, vì vậy bạn có thể cần kiểm tra nhiều hơn chỉ 115.


5
trên trình duyệt webkit OS X, cmd + s trả về 19, do đó, cũng đáng để kiểm tra điều đó. tức là if (! (event.which == 115 && event.ctrlKey) &&! (event.which == 19)) trả về true;
Tadas T

6
Chỉ hoạt động trong Firefox cho tôi. IE9 & Chrome không đăng ký bất kỳ phím nhấn nào.
xương chậu

7
Ngay cả với $ (tài liệu) .keypress (thay vì $ (window) .keypress), IE và Chrome vẫn lấy sự kiện nhấn phím bằng 'Ctrl' trước khi tập lệnh thực hiện.
xương chậu

16
sử dụng keydownthay vì keypresstrong chrome
Destan

3
Thật không may, nó đã hết hạn
Cần sa

250

Điều này hoạt động với tôi (sử dụng jquery) để quá tải Ctrl+ S, Ctrl+ FCtrl+ G:

$(window).bind('keydown', function(event) {
    if (event.ctrlKey || event.metaKey) {
        switch (String.fromCharCode(event.which).toLowerCase()) {
        case 's':
            event.preventDefault();
            alert('ctrl-s');
            break;
        case 'f':
            event.preventDefault();
            alert('ctrl-f');
            break;
        case 'g':
            event.preventDefault();
            alert('ctrl-g');
            break;
        }
    }
});

8
Đây là câu trả lời duy nhất phù hợp với tôi trong tất cả các trình duyệt tôi đã thử nghiệm, bao gồm Phiên bản Chrome 28.0.1500.71
T. Brian Jones

27
Có thể thực hiện với JS thuần nếu bạn sử dụng window.addEventListener(thay vì$(window).bind(

2
@NatesS nếu bạn xóa cảnh báo thì nó không mở hộp thoại lưu. Nó được gây ra do cảnh báo. Hoạt động tốt cho tôi trong tất cả các trình duyệt. Cách giải quyết tốt đẹp.
CrazyNooB

2
Đã làm cho tôi. Hãy chấp nhận câu trả lời này hơn câu trả lời ở trên.
pavanw3b

1
@Fireflight: else ifsẽ không hoạt động vì iftuyên bố ban đầu sẽ được đánh giá là đúng. Bạn sẽ phải đặt mã của mình trước ifcâu lệnh gốc , biến bản gốc thành một else if.
Daniel Ruijters

34

Bạn có thể sử dụng một thư viện phím tắt để xử lý các công cụ cụ thể của trình duyệt.

shortcut.add("Ctrl+S",function() {
    alert("Hi there!");
});

7
Điều này đã được chuyển đổi thành một plugin jQuery, rẽ nhánh và được bổ sung và hiện hỗ trợ 1.6.x: github.com/ricardovaleriano/jquery.hotkeys
Félix Saparelli

12
Đối với các nhân viên Google, URL được cập nhật cho plugin jQuery là: github.com/jeresig/jquery.hotkeys
bss264

28

Giải pháp jQuery này hoạt động với tôi trong Chrome và Firefox, cho cả Ctrl+ SCmd+ S.

$(document).keydown(function(e) {

    var key = undefined;
    var possible = [ e.key, e.keyIdentifier, e.keyCode, e.which ];

    while (key === undefined && possible.length > 0)
    {
        key = possible.pop();
    }

    if (key && (key == '115' || key == '83' ) && (e.ctrlKey || e.metaKey) && !(e.altKey))
    {
        e.preventDefault();
        alert("Ctrl-s pressed");
        return false;
    }
    return true;
}); 

1
Đây là giải pháp duy nhất đang hoạt động đúng ở đây. Cảm ơn rất nhiều!
Stephan Weinhold

1
điều này có thể đã lỗi thời ngay bây giờ: sử dụng e.keythay vì e.which;
Tự sát

Cập nhật ngày 14 tháng 5 năm 2017 cho các tiêu chuẩn hiện đại.
Alan Bellows

28

Cái này hoạt động với tôi trên Chrome ... vì một số lý do event.whichtrả lại vốn S (83) cho tôi, không hiểu tại sao (bất kể trạng thái khóa mũ) vì vậy tôi đã sử dụng fromCharCodetoLowerCasechỉ để ở bên an toàn

$(document).keydown(function(event) {

    //19 for Mac Command+S
    if (!( String.fromCharCode(event.which).toLowerCase() == 's' && event.ctrlKey) && !(event.which == 19)) return true;

    alert("Ctrl-s pressed");

    event.preventDefault();
    return false;
});

Nếu bất cứ ai biết lý do tại sao tôi nhận được 83 chứ không phải 115 , tôi sẽ rất vui khi biết, nếu có ai kiểm tra điều này trên các trình duyệt khác, tôi sẽ rất vui khi biết nó có hoạt động hay không


Tôi có vấn đề tương tự với chrome. Một nỗi đau!
qodeninja

Bây giờ tôi nhìn vào nó, tôi nghĩ rằng ngăn chặn không cần thiết là trả lại sai kích hoạt nó (Và stopPropagation) nhưng không chắc nó quan trọng lắm cho câu hỏi
Eran Medan

7

Tôi đã kết hợp một vài tùy chọn để hỗ trợ FireFox, IE và Chrome. Tôi cũng đã cập nhật nó để hỗ trợ mac tốt hơn

// simply disables save event for chrome
$(window).keypress(function (event) {
    if (!(event.which == 115 && (navigator.platform.match("Mac") ? event.metaKey : event.ctrlKey)) && !(event.which == 19)) return true;
    event.preventDefault();
    return false;
});

// used to process the cmd+s and ctrl+s events
$(document).keydown(function (event) {
     if (event.which == 83 && (navigator.platform.match("Mac") ? event.metaKey : event.ctrlKey)) {
        event.preventDefault();
        save(event);
        return false;
     }
});

5

Thành thật, tôi muốn các ứng dụng web không ghi đè các phím tắt mặc định của tôi. Ctrl+ Sđã làm một cái gì đó trong trình duyệt. Có sự thay đổi đột ngột tùy thuộc vào trang web tôi đang xem là gây rối và bực bội, chưa kể thường là lỗi. Tôi đã bị tấn công trang web Ctrl+ Tabvì nó trông giống như Ctrl+ I, cả hai đều phá hỏng công việc của tôi trên trang web và ngăn tôi chuyển đổi các tab như bình thường.

Nếu bạn muốn các phím tắt, sử dụng accesskeythuộc tính. Vui lòng không phá vỡ chức năng trình duyệt hiện có.


2
Tôi đồng ý, hoàn toàn, nhưng thật không may, tôi là người thực hiện, không phải là người ra quyết định.
ceejayoz

24
Đúng, nhưng CTRL + S không phải là một tính năng thường được sử dụng. Tôi nghi ngờ mọi người sẽ bỏ lỡ nó, đặc biệt nếu điều đó có nghĩa là bạn có thể lưu tệp của mình trong ứng dụng web.
nguy cơ tuyệt chủng

13
Tôi thường đồng ý với bạn, nhưng lần duy nhất tôi từng sử dụng ctrl-s trong trình duyệt là khi tôi quên tôi đang sử dụng một ứng dụng web và mong muốn các phím tắt sẽ làm điều gì đó hữu ích. Tôi thường thất vọng. Gmail lưu email của bạn khi bạn nhấn ctrl-s, mặc dù bạn sẽ không bao giờ nhận thấy bởi vì khi nó thực hiện đúng những gì bạn mong đợi và mọi ứng dụng trên máy tính để bàn thì bạn không thực sự chú ý. Bạn thông báo khi nó nghĩ rằng bạn muốn lưu gmail dưới dạng HTML và điều đó thật khó chịu.
Carson Myers

4
Điều này thực sự phụ thuộc vào ứng dụng. Tôi đang xây dựng một ứng dụng web giả lập thiết bị đầu cuối và ghi đè ctrl + c có vẻ thiết thực nếu không cần thiết.
Brack

Nhu cầu thực sự lưu một trang HTML khá mỏng, tôi thấy mình không bao giờ làm điều này. Tuy nhiên, như những người khác đã nói, trình duyệt đang nhanh chóng trở thành nơi chúng ta làm việc, tất cả công việc của chúng ta và ngày càng có nhiều trình duyệt thay thế trình xử lý văn bản và các ứng dụng khác thường được sử dụng trên máy tính để bàn, người dùng đã quen với bàn phím của họ các phím tắt, vì vậy hỗ trợ chúng là điều bắt buộc để sử dụng và áp dụng. Nếu bạn tạo một trình xử lý văn bản và khiến tôi nhấn ALT + SHIFT + S hoặc điều gì đó tệ hơn, tôi sẽ bỏ ứng dụng của bạn như một thói quen xấu khi là người dùng.
DavidScherer

4

@Eevee: Khi trình duyệt trở thành ngôi nhà cho chức năng ngày càng phong phú hơn và bắt đầu thay thế các ứng dụng trên máy tính để bàn, nó sẽ không phải là một lựa chọn để từ bỏ việc sử dụng các phím tắt. Bộ lệnh bàn phím phong phú và trực quan của Gmail là công cụ giúp tôi từ bỏ Outlook. Các phím tắt trong Todoist, Google Reader và Google Lịch đều giúp cuộc sống của tôi dễ dàng hơn nhiều, hàng ngày.

Các nhà phát triển chắc chắn nên cẩn thận không ghi đè các tổ hợp phím đã có ý nghĩa trong trình duyệt. Ví dụ: hộp văn bản WMD tôi đang nhập vào phiên dịch không thể giải thích Ctrl+ Dellà "Blockquote" thay vì "xóa từ chuyển tiếp". Tôi tò mò liệu có một danh sách tiêu chuẩn nào đó ở đâu đó về các phím tắt "an toàn cho trình duyệt" mà các nhà phát triển trang web có thể sử dụng và các trình duyệt sẽ cam kết tránh xa các phiên bản trong tương lai.


1
Câu trả lời là Không, không có danh sách các phím tắt an toàn cho trình duyệt. Và nó tốt cho hai cộng hưởng: 1. Phím tắt có thể tùy chỉnh (ít nhất là trong Opera). 2. Làm như vậy, bạn không hạn chế sự sáng tạo của nhà cung cấp trình duyệt để cung cấp cho bạn nhiều năng lượng hơn cho chính việc sử dụng trình duyệt.
gizmo

3

$(document).keydown(function(e) {
    if ((e.key == 's' || e.key == 'S' ) && (e.ctrlKey || e.metaKey))
    {
        e.preventDefault();
        alert("Ctrl-s pressed");
        return false;
    }
    return true;
}); 
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
Try pressing ctrl+s somewhere.

Đây là phiên bản cập nhật của câu trả lời của @ AlanBellows, thay thế whichbằng key. Nó cũng hoạt động ngay cả với trục trặc khóa vốn của Chrome (trong đó nếu bạn nhấn Ctrl+ Snó sẽ gửi vốn S thay vì s). Hoạt động trong tất cả các trình duyệt hiện đại.


Để kiểm tra điều này, nhấp vào bên trong hộp đoạn mã và nhấn Ctrl + S.
Tự sát

1

Đây là giải pháp của tôi, dễ đọc hơn nhiều so với các đề xuất khác ở đây, có thể dễ dàng bao gồm các kết hợp phím khác và đã được thử nghiệm trên IE, Chrome và Firefox:

$(window).keydown(function(evt) {
    var key = String.fromCharCode(evt.keyCode);
    //ctrl+s
    if (key.toLowerCase() === "s" && evt.ctrlKey) {
        fnToRun();
        evt.preventDefault(true);
        return false;
    }
    return true;
});

1
+1 cho việc sử dụng String.fromCharCode. Mặc dù, máy Mac không có khóa điều khiển. Kiểm tra phím lệnh với evt.metaKey. Nó trả về truecho Cmd trên Mac và Win trên Windows.
KatoFett


0

Điều này sẽ hoạt động (được điều chỉnh từ https://stackoverflow.com/a/8285722/388902 ).

var ctrl_down = false;
var ctrl_key = 17;
var s_key = 83;

$(document).keydown(function(e) {
    if (e.keyCode == ctrl_key) ctrl_down = true;
}).keyup(function(e) {
    if (e.keyCode == ctrl_key) ctrl_down = false;
});

$(document).keydown(function(e) {
    if (ctrl_down && (e.keyCode == s_key)) {
        alert('Ctrl-s pressed');
        // Your code
        return false;
    }
}); 


0

Để Alan Bellows trả lời :! (E.altKey) được thêm cho người dùng sử dụng AltGrkhi nhập (ví dụ: Ba Lan). Nếu không nhấn AltGr+ Snày sẽ cho kết quả tương tự như Ctrl+S

$(document).keydown(function(e) {
if ((e.which == '115' || e.which == '83' ) && (e.ctrlKey || e.metaKey) && !(e.altKey))
{
    e.preventDefault();
    alert("Ctrl-s pressed");
    return false;
}
return true; });

0

Plugin này được thực hiện bởi tôi có thể hữu ích.

Cắm vào

Bạn có thể sử dụng plugin này, bạn phải cung cấp Mã và chức năng chính để được chạy như thế này

simulatorControl([17,83], function(){
 console.log('You have pressed Ctrl+Z');
});

Trong mã tôi đã hiển thị cách thực hiện cho Ctrl+ S. Bạn sẽ nhận được Tài liệu chi tiết Trên liên kết. Plugin nằm trong phần Mã JavaScript của Bút của tôi trên Codepen.


0

Tôi đã giải quyết vấn đề của mình trên IE , sử dụng một alert("With a message")để ngăn chặn Hành vi mặc định:

window.addEventListener("keydown", function (e) {
    if(e.ctrlKey || e.metaKey){
        e.preventDefault(); //Good browsers
        if (navigator.userAgent.indexOf('MSIE') !== -1 || navigator.appVersion.indexOf('Trident/') > 0) { //hack for ie
            alert("Please, use the print button located on the top bar");
            return;
        }
    }
});
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.