JQuery hoặc JavaScript: Làm cách nào để xác định xem phím shift có được nhấn trong khi nhấp vào siêu liên kết thẻ neo không?


92

Tôi có một thẻ liên kết gọi một hàm JavaScript.

Có hay không có JQuery, làm cách nào để xác định xem phím shift có bị ngắt khi liên kết được nhấp không?

Đoạn mã sau KHÔNG hoạt động vì thao tác nhấn phím chỉ được kích hoạt nếu nhấn "phím thực" (không phải phím shift). (Tôi đã hy vọng nó sẽ hoạt động nếu chỉ nhấn một mình phím shift.)

var shifted = false;

$(function() {                           
    $(document).keypress(function(e) {
        shifted = e.shiftKey;
        alert('shiftkey='+e.shiftkey);
    });

    $(document).keyup(function(e) {
        shifted = false;
    });
}

...

function myfunction() {
  //shift is always false b/c keypress not fired above
}

4
đoạn mã sau cũng không làm việc vì bạn đã gõ shiftkeythay vì shiftKey:-)
Simon_Weaver

Nếu bạn cần phải biết rằng để tránh gọi xử lý khi nhấn shift+click, sử dụngfilter-altered-clicks
fregante

Câu trả lời:


100
    $(document).on('keyup keydown', function(e){shifted = e.shiftKey} );

21
Điều này làm việc với tôi nhưng đã làm gián đoạn tất cả các phím tắt tiêu chuẩn không liên quan shiftvì hàm trả về false. Tôi cần phải rõ ràng return trueđể cho phép crtl + r, ctrl + s, ctrl + p, v.v.
John H

4
Vì vậy, gợi ý là hãy sử dụng keydown thay vì keypress.
rwitzel,

Kỳ lạ, tôi chỉ nhận được các sự kiện keydown, không có keyup.
Gerry

@rwitzel keydown và keyup cho phép bạn theo dõi trạng thái thực tế của phím shift khi chúng được kích hoạt cho mọi phím trên bàn phím. Không phải lúc nào phím nhấn cũng được kích hoạt, ví dụ như không được kích hoạt khi chỉ nhấn phím shift.
jakubiszon

@Gerry, có thể có một số trình xử lý sự kiện khác trên trang của bạn, điều này phá vỡ chuỗi sự kiện. Trước tiên, hãy kiểm tra trên một trang trống / mới (một trang không bao gồm tất cả các tập lệnh của bạn) - nó sẽ hoạt động bình thường.
jakubiszon

74

Đây là mã khóa cho mỗi phím trong JavaScript. Bạn có thể sử dụng nó và phát hiện xem người dùng đã nhấn phím Shift hay chưa.

backspace           8
tab                 9
enter               13
shift               16
ctrl                17
alt                 18
pause/break         19
caps lock           20
escape              27
page up             33
page down           34
end                 35
home                36
left arrow          37
up arrow            38
right arrow         39
down arrow          40
insert              45
delete              46
0                   48
1                   49
2                   50
3                   51
4                   52
5                   53
6                   54
7                   55
8                   56
9                   57
a                   65
b                   66
c                   67
d                   68
e                   69
f                   70
g                   71
h                   72
i                   73
j                   74
k                   75
l                   76
m                   77
n                   78
o                   79
p                   80
q                   81
r                   82
s                   83
t                   84
u                   85
v                   86
w                   87
x                   88
y                   89
z                   90
left window key     91
right window key    92
select key          93
numpad 0            96
numpad 1            97
numpad 2            98
numpad 3            99
numpad 4            100
numpad 5            101
numpad 6            102
numpad 7            103
numpad 8            104
numpad 9            105
multiply            106
add                 107
subtract            109
decimal point       110
divide              111
f1                  112
f2                  113
f3                  114
f4                  115
f5                  116
f6                  117
f7                  118
f8                  119
f9                  120
f10                 121
f11                 122
f12                 123
num lock            144
scroll lock         145
semi-colon          186
equal sign          187
comma               188
dash                189
period              190
forward slash       191
grave accent        192
open bracket        219
back slash          220
close braket        221
single quote        222

Không phải tất cả các trình duyệt đều xử lý tốt sự kiện nhấn phím, vì vậy hãy sử dụng sự kiện phím lên hoặc phím xuống, như sau:

$(document).keydown(function (e) {
    if (e.keyCode == 16) {
        alert(e.which + " or Shift was pressed");
    }
});

cộng 1 cho những nỗ lực đưa vào câu trả lời này
Ian khôn ngoan

Sử dụng event.keythay thế! Nó sẽ cung cấp cho bạn các char trực tiếp, ví dụ: "a", "1", "LeftArrow"
Gibolt

Thậm chí tốt hơn trong phiên bản VanillaJS của nó:document.addEventListener("keydown", function(e){ console.log(e.which); });
Evgeny

26

Đối với các sự kiện chuột, tôi biết rằng trong Firefox ít nhất thuộc tính "shiftKey" trên đối tượng sự kiện sẽ cho bạn biết nếu phím shift có bị hỏng hay không. Nó được ghi lại tại MSDN nhưng tôi đã không thử nó mãi mãi nên tôi không nhớ liệu IE có làm đúng hay không.

Vì vậy, bạn sẽ có thể kiểm tra "shiftKey" trên đối tượng sự kiện trong trình xử lý "nhấp chuột" của bạn.


2
Thật. Đây là trường hợp quay trở lại những ngày đầu tiên của JavaScript.
bobince

23

Tôi đã gặp sự cố tương tự, cố gắng nắm bắt 'shift + nhấp chuột' nhưng vì tôi đang sử dụng điều khiển của bên thứ ba với lệnh gọi lại thay vì clicktrình xử lý tiêu chuẩn , nên tôi không có quyền truy cập vào đối tượng sự kiện và đối tượng liên quan e.shiftKey.

Tôi đã kết thúc việc xử lý sự kiện di chuột xuống để ghi lại shift-ness và sau đó sử dụng nó trong lần gọi lại của mình.

    var shiftHeld = false;
    $('#control').on('mousedown', function (e) { shiftHeld = e.shiftKey });

Được đăng trong trường hợp người khác kết thúc ở đây để tìm kiếm giải pháp cho vấn đề này.


7

Sự keypresskiện không được kích hoạt bởi tất cả các trình duyệt khi bạn nhấp vào shifthoặc ctrl, nhưng rất may keydownsự kiện này .

Nếu bạn chuyển đổi keypressvới keydownbạn có thể gặp may mắn hơn.


1
Nhưng vấn đề là anh ta sẽ không biết chắc liệu phím shift có được nhấn hay không. Ồ nhưng tôi đoán nếu cờ cũng được đặt cho "keyUp", thì sẽ có thể phát hiện khi nào "nhấp chuột" được đặt trong dấu ngoặc vuông của các sự kiện chính.
Pointy

6

Tôi đã sử dụng một phương pháp để kiểm tra xem có phím cụ thể nào được nhấn hay không bằng cách lưu trữ các mã phím hiện được nhấn trong một mảng:

var keysPressed = [],
    shiftCode = 16;

$(document).on("keyup keydown", function(e) {
    switch(e.type) {
        case "keydown" :
            keysPressed.push(e.keyCode);
            break;
        case "keyup" :
            var idx = keysPressed.indexOf(e.keyCode);
            if (idx >= 0)
                keysPressed.splice(idx, 1);
            break;
    }
});

$("a.shifty").on("click", function(e) {
    e.preventDefault();
    console.log("Shift Pressed: " + (isKeyPressed(shiftCode) ? "true" : "false"));
});

function isKeyPressed(code) {
    return keysPressed.indexOf(code) >= 0;
}

Đây là jsfiddle


3
Giải pháp tuyệt vời nhưng nó cần một sửa chữa nhỏ về keyup: while (idx> = 0) {keyPressed.splice (idx, 1); idx = avpg.keysPressed.indexOf (e.keyCode); } Nếu không, chỉ lần nhấn phím đầu tiên bị xóa. Để nhận thấy điều này, hãy giữ phím shift trong vài giây. Mảng lấp đầy các mã dịch chuyển, nhưng chỉ một trong số chúng bị xóa khi gõ phím.
pkExec

4

Thư viện JavaScript tuyệt vời KeyboardJS xử lý tất cả các kiểu nhấn phím bao gồm cả phím SHIFT. Nó thậm chí còn cho phép chỉ định các tổ hợp phím chẳng hạn như nhấn CTRL + x đầu tiên và sau đó nhấn a.

KeyboardJS.on('shift', function() { ...handleDown... }, function() { ...handleUp... });

Nếu bạn muốn một phiên bản đơn giản, hãy truy cập câu trả lời của @tonycoupland ):

var shiftHeld = false;
$('#control').on('mousedown', function (e) { shiftHeld = e.shiftKey });

@downvoters: Vui lòng để lại nhận xét tại sao bạn phản đối
koppor

3

Điều này làm việc tuyệt vời cho tôi:

function listenForShiftKey(e){
    var evt = e || window.event;
    if (evt.shiftKey) {
      shiftKeyDown = true;
    } else {
      shiftKeyDown = false;
    }
}

3

Để kiểm tra xem phím shift có được nhấn trong khi nhấp chuột hay không , có một thuộc tính chính xác trong đối tượng sự kiện nhấp chuột : shiftKey (và cả đối với phím ctrl và alt và meta): https://www.w3schools.com/jsref/event_shiftkey .asp

Vì vậy, sử dụng jQuery:

$('#anchor').on('click', function (e) {
    if (e.shiftKey) {
        // your code
    }
});

2

Một cách tiếp cận mô-đun hơn cộng với khả năng giữ thisphạm vi của bạn trong lòng người nghe:

var checkShift = function(fn, self) {
  return function(event) {
    if (event.shiftKey) {
      fn.call(self, event);
    }
    return true;
  };
};

$(document).on('keydown', checkShift(this.enterMode, this));

1

Nếu ai đó đang muốn phát hiện một phím nhất định và cần biết trạng thái của các "sửa đổi" (như chúng được gọi trong Java), tức là các phím Shift, Alt và Control, bạn có thể làm điều gì đó như thế này, phản hồi keydowntrên phím F9, nhưng chỉ khi không có phím Shift, Alt hoặc Control nào hiện được nhấn.

jqMyDiv.on( 'keydown', function( e ){
    if( ! e.shiftKey && ! e.altKey && ! e.ctrlKey ){
        console.log( e );
        if( e.originalEvent.code === 'F9' ){
          // do something 
        }
    }
});

0
var shiftDown = false;
this.onkeydown = function(evt){
    var evt2 = evt || window.event;
    var keyCode = evt2.keyCode || evt2.which;       
    if(keyCode==16)shiftDown = true;
}
this.onkeyup = function(){
    shiftDown = false;
}

bản giới thiệu

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.