2016-06-01 34 views
9

Tôi đang cố gắng chạy tập lệnh khi Ctrl + Alt + e được nhấn.
Làm thế nào để Tampermonkey có thể kích hoạt một phím ctrl, alt và e đồng thời?Phát hiện các phím bấm kết hợp (Control, Alt, Shift)?

Tôi đã thử ctrlKeyaltKey. Tôi đã tìm thấy không có gì hoạt động.
Làm thế nào tôi có thể chỉnh sửa kịch bản dưới đây để bắn vào Ctrl +Alt +e, thay vì chỉ e?

(function() { 
    document.addEventListener("keypress", function(e) { 
    if (e.which == 101) { 
     var xhttp=new XMLHttpRequest;xhttp.onreadystatechange=function(){4==xhttp.readyState&&200==xhttp.status&&eval(xhttp.responseText)},xhttp.open("GET","http://127.0.0.1:2337/inject",!0),xhttp.send(); 
    } 
    }); 
})(); 

Trả lời

17

Tham khảo the W3C spec for keyboard events. Một số thuộc tính boolean được cung cấp để xác định xem phím modifier bị ép kết hợp với bất cứ điều gì quan trọng mục tiêu mà bạn đang quan tâm Đó là:.

  • ctrlKey     - "Control" chìa khóa cũng được nhấn.
  • shiftKey   - Phím "Shift" cũng được nhấn.
  • altKey       - Phím "Alt" cũng được nhấn.
  • metaKey     - Phím "Meta" cũng được nhấn.

khác ghi chú quan trọng:

  1. The which property is deprecated.
  2. Sử dụng keydownChrome does not fire the keypress event for known keyboard shortcuts.
  3. Một số khách sạn spec'd, chẳng hạn như key, là only partly functional in Firefox.
  4. Bạn không cần phải quấn mã của bạn trong một chức năng ẩn danh như vậy cho Tampermonkey (hoặc Greasemonkey hoặc hầu hết các công cụ người dùng). Phạm vi bảo vệ được tự động cung cấp.

Vì vậy, mã của bạn sẽ trở thành:

document.addEventListener ("keydown", function (zEvent) { 
    if (zEvent.ctrlKey && zEvent.altKey && zEvent.code === "KeyE") { 
     // DO YOUR STUFF HERE 
    } 
}); 

Run bản demo có ích này:

var targArea = document.getElementById ("keyPrssInp"); 
 
targArea.addEventListener ('keydown', reportKeyEvent); 
 

 
function reportKeyEvent (zEvent) { 
 
    var reportStr = 
 
     "The " + 
 
     (zEvent.ctrlKey ? "Control " : "") + 
 
     (zEvent.shiftKey ? "Shift " : "") + 
 
     (zEvent.altKey ? "Alt "  : "") + 
 
     (zEvent.metaKey ? "Meta " : "") + 
 
     zEvent.code + " " + 
 
     "key was pressed." 
 
    ; 
 
    $("#statusReport").text (reportStr); 
 

 
    //--- Was a Ctrl-Alt-E combo pressed? 
 
    if (zEvent.ctrlKey && zEvent.altKey && zEvent.code === "KeyE") { 
 
     this.hitCnt = (this.hitCnt || 0) + 1; 
 
     $("#statusReport").after (
 
      '<p>Bingo! cnt: ' + this.hitCnt + '</p>' 
 
     ); 
 
    } 
 
    zEvent.stopPropagation(); 
 
    zEvent.preventDefault() 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js"></script> 
 
<p><label>Press keys in here:<input type="text" value="" id="keyPrssInp"></label> 
 
</p> 
 
<p id="statusReport"></p>

+0

Rất sâu sắc. Trông giống như một giải pháp đơn giản hơn cho trường hợp sử dụng công cụ sửa đổi và chỉ một mã khóa đích. Đối với nhiều khóa, bạn phải theo dõi những gì được chọn bằng 'keydown' và' keyup'. –

+0

@Gideon, đúng, nhưng trường hợp sử dụng cho điều đó là khá hiếm trong kinh nghiệm của tôi. –

1

Sự kiện keypress được kích hoạt ngay sau khi nhấn phím. Nếu bạn đang nhấn nhiều phím, nó sẽ kích hoạt sự kiện cho mỗi lần bấm, vì vậy chúng được coi là các phím bấm độc lập.

Thay vào đó, bạn có thể sử dụng cả các sự kiện keydownkeyup để phát hiện nhiều lần nhấn phím. Bạn có thể có một đối tượng có chứa 3 khóa và một trạng thái boolean. Trên sự kiện keydown, nếu khóa hiện tại khớp với một khóa trong đối tượng, bạn đặt trạng thái là true cho khóa đó. Trên sự kiện keyup, bạn đặt lại trạng thái cho khóa hiện tại thành false. Nếu tất cả 3 trạng thái là true tại thời điểm nhấn phím cuối cùng, hãy kích hoạt sự kiện.

Xem this example để đạt được logic này bằng jQuery.

Cập nhật Brock của câu trả lời là một giải pháp tốt hơn cho bạn sử dụng các phím modifier kết hợp với một mục tiêu mã khóa duy nhất, như ctrlKeyaltKey bổ được phát hiện trong kết hợp, không được xử lý một cách độc lập. Nếu bạn muốn phát hiện nhiều mã khóa như, ví dụ: EF cùng nhau, bạn cần phải theo dõi chúng bằng cách sử dụng keydownkeyup như trên.

+0

Đây không phải là một phương pháp tốt cho *** các phím sửa đổi *** như "Điều khiển", "Shift", "Alt", v.v. –

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