การผูกปุ่มลูกศรใน JS / jQuery


418

ฉันจะผูกฟังก์ชั่นเข้ากับปุ่มลูกศรซ้ายและขวาใน Javascript และ / หรือ jQuery ได้อย่างไร ฉันดูปลั๊กอิน js-hotkey สำหรับ jQuery (ล้อมฟังก์ชันการผูกในตัวเพื่อเพิ่มอาร์กิวเมนต์เพื่อจดจำคีย์เฉพาะ) แต่ดูเหมือนจะไม่สนับสนุนปุ่มลูกศร


คำตอบ:


541
document.onkeydown = function(e) {
    switch(e.which) {
        case 37: // left
        break;

        case 38: // up
        break;

        case 39: // right
        break;

        case 40: // down
        break;

        default: return; // exit this handler for other keys
    }
    e.preventDefault(); // prevent the default action (scroll / move caret)
};

หากคุณต้องการรองรับ IE8 ให้เริ่มการทำงานของร่างกายe = e || window.event; switch(e.which || e.keyCode) {ดังนี้


(แก้ไข 2020)
โปรดทราบว่าKeyboardEvent.whichขณะนี้เลิกใช้แล้ว ดูตัวอย่างนี้โดยใช้KeyboardEvent.keyสำหรับโซลูชันที่ทันสมัยกว่าเพื่อตรวจหาปุ่มลูกศร


28
โดยคำตอบที่ดีที่สุด ใช้e.whichเหมือน jQuery แนะนำสำหรับ cross-browser ใช้e.preventDefault()แทนreturn false( return falseบน jQuery event handler ทริกเกอร์ทั้งสองe.preventDefault()และe.stopPropagation()เหตุการณ์ที่สองจะทำให้เกิดเหตุการณ์ที่เพิ่มในภายหลังล้มเหลวเนื่องจากเหตุการณ์จะไม่แพร่กระจายไปยังพวกมัน) และที่ ในตอนท้ายของสวิทช์จะกลับมาโดยไม่ต้องโทรe.preventDefault()หากมันเป็นคีย์อื่นที่ไม่ใช่ปุ่มที่ถูกกีดกันการใช้งานคีย์อื่น ๆ และแทนที่จะ$.ui.keyCode.DOWNเปรียบเทียบกับตัวเลข (เร็วกว่ามาก)
Jimbo Jonny

2
นาธาน: ดูเหมือนว่าคีย์โค้ดทั้งหมดจะไม่สอดคล้องกันในเบราว์เซอร์ แต่ปุ่มลูกศรนั้นเป็นของบางส่วนเท่านั้น ดูที่นี่: stackoverflow.com/questions/5603195/…
Sygmoral

1
@MichaelScheper - 1) ตัวแปร! = ค่าคงที่ไม่ว่าพวกมันจะถูกเปลี่ยนหรือไม่ ... เครื่องยนต์ยังคงรักษาพวกมันเหมือน vars จนกระทั่งค่าคงที่ ES6 นั้นแพร่หลายมากพอที่ jQuery สามารถใช้ค่าคงที่ 2) ตัวเลขไม่ได้ หมายเลขมายากลจริงๆเมื่อมีความคิดเห็นข้างขวาพวกเขาบอกว่าสิ่งที่พวกเขาและ 3) ... ยังคง
โบ้จอนนี่

2
... 3) เมื่อมีการเข้าถึง$.ui.keyCode.DOWNที่คุณมองหา$อยู่ในขอบเขตของคำศัพท์ของคุณไม่ได้พบว่ามันจะขึ้นระดับ ... มองหา$ทำซ้ำจนกว่าจะอยู่ในขอบเขตทั่วโลกพบว่ามันอยู่บนโลกwindowเข้าถึง$บนหน้าต่าง, อินเทอร์เน็ตuiในwindow.$การเข้าถึงkeyCodeในwindow.$.uiการเข้าถึงDOWNในการwindow.$.ui.keyCodeที่จะได้รับค่าดั้งเดิมคุณต้องการเปรียบเทียบแล้วทำจริงของคุณเปรียบเทียบ ไม่ว่าความเร็วนั้นสำคัญกับคุณหรือไม่นั้นเป็นการตัดสินใจส่วนตัวฉันแค่มีแนวโน้มที่จะหลีกเลี่ยงการเข้าถึง 4 ระดับเมื่อมีสถานการณ์ที่ฉันสามารถเขียน / แสดงความคิดเห็นดั้งเดิมได้อย่างง่ายดาย
Jimbo Jonny

1
@NathanArthur ที่นี่ผมพบว่าทั้งสองเครื่องมือออนไลน์ที่ดีในการทดสอบการพิมพ์ซ้ำแป้นพิมพ์: keycode.info asquare.net/javascript/tests/KeyCode.html unixpapa.com/js/key.html
คาร์โด้ Volpe

451
$(document).keydown(function(e){
    if (e.which == 37) { 
       alert("left pressed");
       return false;
    }
});

รหัสตัวละคร:

37 - ซ้าย

38 - ขึ้นไป

39 - ถูกต้อง

40 - ลง


4
มีจุดประสงค์ในการคืนสินค้าหรือไม่?
Alex S

19
มันหยุดเหตุการณ์ keydown เพิ่มเติมใด ๆ ที่กำลังโดน
s_hewitt

9
Shadow: ไม่เขาหมายถึงว่ามันจะหยุดเหตุการณ์ keydown จากการ
โจมตี

3
ยกเว้น 39 เป็นเครื่องหมายอะโพสโทรฟีด้วยใช่ไหม
Paul D. Waite

25
เมื่อใช้ jQuery ให้ใช้e.whichแทนe.keyCodeการสนับสนุนเบราว์เซอร์เพิ่มเติม ดูความคิดเห็นของฉันด้านล่าง
Sygmoral

108

คุณสามารถใช้รหัสคีย์ของปุ่มลูกศร (37, 38, 39 และ 40 สำหรับซ้าย, ขึ้น, ขวาและลง):

$('.selector').keydown(function (e) {
  var arrow = { left: 37, up: 38, right: 39, down: 40 };

  switch (e.which) {
    case arrow.left:
      //..
      break;
    case arrow.up:
      //..
      break;
    case arrow.right:
      //..
      break;
    case arrow.down:
      //..
      break;
  }
});

ตรวจสอบตัวอย่างข้างต้นที่นี่


1
ฉันไม่แน่ใจเกี่ยวกับการใช้ | | ตัวดำเนินการในบรรทัดที่ 2 ค่าอื่นที่ไม่ใช่ศูนย์หรือการใช้งานที่ไม่ใช่ศูนย์เฉพาะและไม่รับประกัน ฉันจะใช้สิ่งที่ชอบมากขึ้น: var keyCode = (e.keyCode? e.keyCode: e.which); +1 สำหรับการใช้วัตถุลูกศรเพื่อกำหนดชื่อที่อ่านได้
Mnebuerquo

6
หากคุณใช้ jQuery คุณไม่จำเป็นต้องทดสอบ e.which: The event.which property normalizes event.keyCode and event.charCode- api.jquery.com/event.which
JCM

ฉันพยายามวางฟังเหตุการณ์สำคัญไว้บนโต๊ะ แต่มันไม่ทำงาน มีประเภทตัวเลือกจำนวน จำกัด ที่รองรับฟังเหตุการณ์สำคัญหรือไม่?
Arman Bimatov

23

นี่มันช้าไปหน่อย แต่ HotKeys มีข้อบกพร่องที่สำคัญมากซึ่งทำให้เกิดเหตุการณ์ที่จะถูกดำเนินการหลายครั้งถ้าคุณแนบฮอตคีย์มากกว่าหนึ่งรายการเข้ากับองค์ประกอบ เพียงใช้ jQuery ธรรมดา

$(element).keydown(function(ev) {
    if(ev.which == $.ui.keyCode.DOWN) {
        // your code
        ev.preventDefault();
    }
});

2
+1 สำหรับการใช้วัตถุรหัส UI ง่ายต่อการเข้าใจมากกว่า 37, 38, 39 หรือ 40 ไม่แน่ใจว่าทำไมคำตอบยอดนิยมคือการใช้ e.keyCode เมื่อเอกสาร jQuery ระบุอย่างชัดเจนให้ใช้ e.which เพื่อบัญชีสำหรับความแตกต่างของเบราว์เซอร์ หวังว่าคำตอบนี้จะได้รับการยอมรับมากขึ้นสำหรับการทำถูกต้อง
ไม่มี

2
การใช้ $ .ui.keyCode.DOWN ในทุกการกดปุ่มจะช้ากว่าการใช้หมายเลขมาก เพียงเพิ่มความคิดเห็นหากกังวลเกี่ยวกับความคมชัดโดยเฉพาะอย่างยิ่งเนื่องจากต้องมีการเรียกใช้ทุกครั้งที่กดปุ่มใด ๆ
Jimbo Jonny

16

ฉันได้รวมบิตที่ดีที่สุดจากคำตอบอื่น ๆ :

$(document).keydown(function(e){
    switch(e.which) {
        case $.ui.keyCode.LEFT:
        // your code here
        break;

        case $.ui.keyCode.UP:
        // your code here
        break;

        case $.ui.keyCode.RIGHT:
        // your code here
        break;

        case $.ui.keyCode.DOWN:
        // your code here
        break;

        default: return; // allow other keys to be handled
    }

    // prevent default action (eg. page moving up/down)
    // but consider accessibility (eg. user may want to use keys to choose a radio button)
    e.preventDefault();
});

1
"ui" มาจากไหน ได้รับ "TypeError: $ .ui ไม่ได้กำหนด" แก้ไข - ฉันขาด JQuery UI เตรียมพร้อมแล้ว - ไม่มีข้อผิดพลาดอีกต่อไป
coder

3
เห็นได้ชัดว่าเขาใช้ jQuery UI ซึ่งต้องมี enum นั้น ฉันจะไม่รวม jQuery UI เพียงแค่นั้น btw
Jethro Larson

14

คุณสามารถใช้ KeyboardJS ฉันเขียนไลบรารีสำหรับงานเช่นนี้

KeyboardJS.on('up', function() { console.log('up'); });
KeyboardJS.on('down', function() { console.log('down'); });
KeyboardJS.on('left', function() { console.log('right'); });
KeyboardJS.on('right', function() { console.log('left'); });

ชำระเงินห้องสมุดที่นี่ => http://robertwhurst.github.com/KeyboardJS/


14

วิธีแก้ปัญหาสั้น ๆ โดยใช้ Javascript ธรรมดา (ขอบคุณ Sygmoral สำหรับการปรับปรุงที่แนะนำ):

document.onkeydown = function(e) {
    switch (e.keyCode) {
        case 37:
            alert('left');
            break;
        case 39:
            alert('right');
            break;
    }
};

ยังเห็นhttps://stackoverflow.com/a/17929007/1397061


อาจมีค่าผูกพันผ่านdocument.addEventListener('keydown', myFunction);
nathanbirrell

9

คุณแน่ใจหรือไม่ว่า jQuery.HotKeys ไม่รองรับปุ่มลูกศร ฉันเคยยุ่งกับการสาธิตก่อนและสังเกตการทำงานซ้ายขวาขึ้นและลงเมื่อฉันทดสอบใน IE7, Firefox 3.5.2 และ Google Chrome 2.0.172 ...

แก้ไข : ดูเหมือนว่า jquery.hotkeys ถูกย้ายไปที่ Github: https://github.com/jeresig/jquery.hotkeys


ฉันกำลังอ่านว่ามันบอกว่ามันเป็นไปตามห้องสมุดอื่นและสันนิษฐานว่ารายการของคีย์ที่รองรับยังคงใช้
Alex S

5

แทนที่จะใช้return false;ในตัวอย่างด้านบนคุณสามารถใช้e.preventDefault();สิ่งที่เหมือนกัน แต่ง่ายต่อการเข้าใจและอ่าน


4
return false;และe.preventDefault();ไม่เหมือนกันทุกประการ ดูstackoverflow.com/a/1357151/607874
Jose Rui Santos

4

ตัวอย่างของ pure js เมื่อไปทางซ้ายหรือขวา

        window.addEventListener('keydown', function (e) {
            // go to the right
            if (e.keyCode == 39) {

            }
            // go to the left
            if (e.keyCode == 37) {

            }
        });

3

คุณสามารถใช้การผูก jQuery:

$(window).bind('keydown', function(e){
    if (e.keyCode == 37) {
        console.log('left');
    } else if (e.keyCode == 38) {
        console.log('up');
    } else if (e.keyCode == 39) {
        console.log('right');
    } else if (e.keyCode == 40) {
        console.log('down');
    }
});

2

คุณสามารถตรวจสอบสภาพอากาศที่arrow keyถูกกดโดย:

$(document).keydown(function(e){
    if (e.keyCode > 36 && e.keyCode < 41) { 
       alert( "arrowkey pressed" );
       return false;
    }
});

0

ป้องกันลูกศรใช้ได้เฉพาะกับวัตถุอื่นที่เลือกได้ดีจริง ๆ แล้วฉันยังไม่ได้ทดสอบกับวัตถุอื่น ๆ ฮ่า ๆ แต่มันสามารถหยุดลูกศรเหตุการณ์ในหน้าและประเภทอินพุต

ฉันพยายามบล็อกลูกศรซ้ายและขวาเพื่อเปลี่ยนค่าของวัตถุ SELECT โดยใช้ "e.preventDefault ()" หรือ "return false" บน "kepress" "keydown" และ "keyup" แต่ยังคงเปลี่ยนค่าวัตถุ แต่เหตุการณ์ยังคงบอกคุณว่าลูกศรถูกกด


0

ห้องสมุด Javascript ที่แข็งแกร่งสำหรับการจับแป้นพิมพ์และการป้อนคีย์ผสม มันไม่มีการพึ่งพา

http://jaywcjlove.github.io/hotkeys/

hotkeys('right,left,up,down', function(e, handler){
    switch(handler.key){
        case "right":console.log('right');break
        case "left":console.log('left');break
        case "up":console.log('up');break
        case "down":console.log('down');break
    }
});

0

ฉันมาที่นี่เพื่อหาวิธีง่ายๆในการปล่อยให้ผู้ใช้เมื่อจดจ่อกับอินพุตให้ใช้ปุ่มลูกศรเพื่อ +1 หรือ -1 ตัวเลขที่เป็นตัวเลข ฉันไม่เคยพบคำตอบที่ดี แต่ทำรหัสต่อไปนี้ซึ่งใช้งานได้ดี - ทำให้ไซต์นี้กว้างขึ้นในตอนนี้

$("input").bind('keydown', function (e) {
    if(e.keyCode == 40 && $.isNumeric($(this).val()) ) {
        $(this).val(parseFloat($(this).val())-1.0);
    } else if(e.keyCode == 38  && $.isNumeric($(this).val()) ) { 
        $(this).val(parseFloat($(this).val())+1.0);
    }
}); 

-1

กับกาแฟ & Jquery

  $(document).on 'keydown', (e) ->
    switch e.which
      when 37 then console.log('left key')
      when 38 then console.log('up key')
      when 39 then console.log('right key')
      when 40 then console.log('down key')
    e.preventDefault()
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.