2012-03-31 56 views

Trả lời

3

Sử dụng mảng boolean toàn cầu var keys = [] để kiểm tra xem một phím có được nhấn hay không. Sau đó, sử dụng chức năng sau để thêm một phím nóng toàn cầu:

window.addGlobalHotkey = function(callback,keyValues){ 
    if(typeof keyValues === "number") 
     keyValues = [keyValues]; 

    var fnc = function(cb,val){ 
     return function(e){ 
      keys[e.keyCode] = true; 
      executeHotkeyTest(cb,val); 
     };   
    }(callback,keyValues); 
    window.addEventListener('keydown',fnc); 
    return fnc; 
}; 

Như bạn có thể thấy nó thêm người nghe mới vào sự kiện 'keydown'. Người nghe này đầu tiên sẽ đặt giá trị tương ứng trong keys true và sau đó thực hiện kiểm tra, cho dù keyValues nhất định có đúng không. Lưu ý rằng bạn không thể xóa keys[e.keyCode] = true và đặt nó vào một trình nghe khác vì điều này có thể dẫn đến lệnh gọi lại sai (kiểm tra phím nóng đầu tiên, sau đó ánh xạ khóa). Các executeHotkeyTest chính nó là rất dễ dàng quá:

window.executeHotkeyTest = function(callback,keyValues){ 
    var allKeysValid = true; 

    for(var i = 0; i < keyValues.length; ++i) 
     allKeysValid = allKeysValid && keys[keyValues[i]]; 

    if(allKeysValid) 
     callback(); 
}; 

Cuối cùng bạn phải thêm người nghe khác để keyup để làm sạch các phím phát hành từ keys.

window.addEventListener('keyup',function(e){ 
    keys[e.keyCode] = false; 
}); 

Bây giờ bạn có thể thêm một phím nóng để ctrl + x + nhập bằng cách sử dụng addGlobalHotkey(callback,[13,17,88]):

addGlobalHotkey(function(){ 
    document.body.appendChild(
     document.createElement('div').appendChild(
      document.createTextNode('Ctrl + x + Enter down') 
    ).parentNode); 
},[88,13,17]); 

JSFiddle demo

Thay vì thêm một người biết lắng nghe cho mỗi phím nóng, bạn có thể sử dụng một toàn cầu [[callback1,values1],[callback2,values2],...] mảng.

Lưu ý quan trọng: trong IE phiên bản trước 9 bạn phải sử dụng attachEvent thay vì addEventListener. Vì bạn đã sử dụng jQuery, bạn có thể sử dụng .on(...) hoặc .keydown để thay thế.

3

Bạn có thể sử dụng ctrlKey tài sản của đối tượng sự kiện nhấn phím

$(document).keypress(function(e) { 
    if(e.ctrlKey) { 
     // do code to test other keys 
    } 
}); 

thường xuyên thay đổi, alt reserved phím có các thuộc tính, nhưng nhập key có keyCode 13.

Có bất kỳ lý do bạn có thể không thử kết hợp khác - ví dụ ctrl-alt-x? Phím Enter thường được dành riêng để kích hoạt các lần gửi biểu mẫu và các sự kiện khác trên trang web.

+0

tôi thấy rằng có thể có một vấn đề với combo ctrl-return, đặc biệt là cross browser - đọc thêm ở đây: http: // stackoverflow. com/questions/3532313/jquery-ctrlenter-as-enter-in-text-area –

2
$("body").bind("keydown",keyDown); 

function keyDown(e){ 
    if((e.ctrlKey)&&(e.keyCode == 88)&&(e.keyCode == 13)){ 
     alert("Keys down are Ctrl + x + Return"); 
    } 
} 
5

Bạn có thể thấy sử dụng KeyboardJS để trở thành giải pháp tốt hơn. Đập của nó đơn giản để sử dụng.Dưới đây là docs;

KeyboardJS.on('ctrl + x + enter', function() { 
    //do stuff on press 
}, function() { 
    //do stuff on release 
}); 

Ngoài ra, nếu bạn muốn để buộc nhấn ctrl trước x hoặc nhập bạn có thể làm điều này thay vì

KeyboardJS.on('ctrl > x + enter', function() { 
    //do stuff on press 
}, function() { 
    //do stuff on release 
}); 

http://robertwhurst.github.com/KeyboardJS/

+0

Tôi đã thử các phím nóng và mousetrap và không hoạt động ... có vẻ như chưa được cập nhật trong một thời gian. Điều này đã được cập nhật gần đây và hoạt động! – Chris

1

đơn giản chỉ cần gõ như thế này:

document.getElementById('yourelementid').onkeydown = function(){ 
     if(event.ctrlKey===true && event.keyCode==88){ 
      //your code goes here 
     } 
    } 
//no depedency needs. pretty straight-forward 
Các vấn đề liên quan