JQuery veya JavaScript: Bağlantı etiketi köprüsünü tıklarken shift tuşuna basılıp basılmadığını nasıl belirlersiniz?


94

JavaScript işlevini çağıran bir bağlantı etiketim var.

JQuery ile veya JQuery olmadan bağlantı tıklandığında shift tuşunun aşağıda olup olmadığını nasıl belirleyebilirim?

Aşağıdaki kod çalışmaz çünkü tuşa basma yalnızca "gerçek bir tuşa" (shift tuşuna değil) basıldığında tetiklenir. (Sadece vardiya tuşuna basılsa ateşleneceğini umuyordum.)

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
:-) shiftkeyyerine yazdığınız için aşağıdaki kod da çalışmıyorshiftKey
Simon_Weaver

Eğer basarken işleyiciyi aramaktan kaçınmak için bunu bilmeniz gerekiyorsa shift+click, şunu kullanınfilter-altered-clicks
fregante

Yanıtlar:


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

21
Bu benim için çalıştı ancak shiftişlev geri döndüğünden beri içermeyen tüm standart kısayolları kesintiye uğrattı false. Açıkça return truecrtl + r, ctrl + s, ctrl + p vb
John H

4
Bu nedenle, öneri tuşa basmak yerine tuşa basmayı kullanmaktır.
rwitzel

Garip, sadece keydown olayları alıyorum, keyup yok.
Gerry

@rwitzel keydown ve keyup, klavyedeki her tuş için tetiklenirken shift tuşunun gerçek durumunu izlemenize olanak tanır. Tuşa basma her zaman tetiklenmez, örneğin sadece shift tuşuna basıldığında ateşlenmez.
jakubiszon

@Gerry, sayfanızda olay zincirini kıran başka bir olay işleyicisi olabilir. Önce boş / yeni bir sayfayı kontrol edin (tüm komut dosyalarınızı içermeyen bir sayfa) - tam olarak doğru çalışacaktır.
jakubiszon

75

İşte JavaScript'teki her tuş vuruşu için anahtar kod. Bunu kullanabilir ve kullanıcının Shift tuşuna basıp basmadığını tespit edebilirsiniz.

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

Tüm tarayıcılar tuşa basma olayını iyi yönetmez, bu nedenle ya yukarı tuşu ya da aşağı tuşu olayını kullanın, örneğin:

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

bu yanıta harcanan çaba için artı 1
Ian Wise

1
Onun event.keyyerine kullanın ! Size doğrudan karakteri verecektir, örn: "a", "1", "LeftArrow"
Gibolt

VanillaJS versiyonunda daha da iyi:document.addEventListener("keydown", function(e){ console.log(e.which); });
Evgeny

26

Fare olayları için, Firefox'ta en azından olay nesnesindeki "shiftKey" özelliğinin shift tuşunun aşağı olup olmadığını size söyleyeceğini biliyorum. MSDN'de belgelendi, ancak sonsuza kadar denemedim, bu yüzden IE'nin bunu doğru yapıp yapmadığını hatırlamıyorum.

Bu nedenle, "tıklama" işleyicinizdeki olay nesnesinde "shiftKey" i kontrol edebilmelisiniz.


2
Aslında. Bu, JavaScript'in ilk günlerine kadar uzanan bir durumdur.
bobince

23

'Shift + tıklama' yakalamaya çalışırken benzer bir sorun yaşadım, ancak standart clickişleyici yerine geri arama ile üçüncü taraf kontrolü kullandığım için, olay nesnesine ve onunla ilişkili nesneye erişimim yoktu e.shiftKey.

Vardiyayı kaydetmek için fare aşağı olayını işlemeyi ve daha sonra geri aramamda kullanmayı bıraktım.

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

Sadece başka birinin burada bu soruna bir çözüm araması ihtimaline karşı yayınlandı.


7

keypressTıkladığınızda olay tüm tarayıcılar tarafından tetiklenmez shiftya ctrl, ama neyse olaydır .keydown

Eğer dışarı geçerseniz keypressile keydownsize daha şanslı olabilir.


1
Eh fakat sorun için bilemezsiniz olduğunu emin vardiya tuşa basılsın. Ama sanırım bayrak da "keyUp" için ayarlanmışsa, o zaman "tıklama" anahtar olayları tarafından parantez içine alındığında tespit edilebilir.
Pointy

6

Şu anda basılan tuş kodlarını bir dizide saklayarak belirli bir tuşa basılıp basılmadığını test etmek için bir yöntem kullandım:

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;
}

İşte jsfiddle


3
Harika bir çözüm ama keyup üzerinde küçük bir düzeltmeye ihtiyacı var: while (idx> = 0) {keysPressed.splice (idx, 1); idx = avpg.keysPressed.indexOf (e.keyCode); } Aksi takdirde, bir tuşa basmanın yalnızca ilk geçtiği yer kaldırılır. Bunu fark etmek için birkaç saniye shift tuşunu basılı tutun. Dizi, vardiya kodlarıyla doldurulur, ancak bunlardan yalnızca biri anahtarlamada kaldırılır.
pkExec

4

Mükemmel JavaScript kitaplığı KeyboardJS , SHIFT tuşu da dahil olmak üzere her türlü tuşa basmayı idare eder. Hatta önce CTRL + x ve ardından a tuşlarına basmak gibi tuş kombinasyonlarının belirlenmesine bile izin verir.

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

Basit bir versiyon istiyorsanız, @tonycoupland'ın cevabına gidin ):

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

@downvoters: Lütfen neden olumsuz oy verdiğinize bir yorum bırakın
koppor

4

Fare ile tıklanırken shift tuşuna basılıp basılmadığını kontrol etmek için , click olay nesnesinde tam bir özellik vardır : shiftKey (ve ayrıca ctrl ve alt ve meta anahtarı için): https://www.w3schools.com/jsref/event_shiftkey .asp

Yani jQuery kullanarak:

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

3

Bu benim için harika çalışıyor:

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

2

Daha modüler bir yaklaşım ve thiskapsamınızı dinleyicilerde tutma yeteneği :

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

Herhangi biri belirli bir anahtarı algılamak istiyorsa ve "değiştiricilerin" (Java'da çağrıldıkları şekliyle), yani Shift, Alt ve Control tuşlarının durumunu bilmesi gerekiyorsa, bunun gibi bir şey yapabilirsiniz, bu da keydownF9 tuşuna yanıt verir , ancak yalnızca Shift, Alt veya Control tuşlarından hiçbirine o anda basılmamışsa.

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;
}

demo

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.