jQuery: วิธีจับปุ่มกด TAB ภายในกล่องข้อความ


145

ฉันต้องการจับปุ่มกด TAB ยกเลิกการกระทำเริ่มต้นและเรียกใช้ฟังก์ชันจาวาสคริปต์ของฉันเอง

คำตอบ:


249

แก้ไข:เนื่องจากองค์ประกอบของคุณถูกแทรกแบบไดนามิกคุณต้องใช้การมอบหมายon()ในตัวอย่างของคุณ แต่คุณควรผูกมันไว้กับเหตุการณ์ keydown เนื่องจากเป็นความคิดเห็น @Marc ใน IE เหตุการณ์ keypress จะไม่จับคีย์ที่ไม่ใช่อักขระ:

$("#parentOfTextbox").on('keydown', '#textbox', function(e) { 
  var keyCode = e.keyCode || e.which; 

  if (keyCode == 9) { 
    e.preventDefault(); 
    // call custom function here
  } 
});

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


เมื่อฉันกด TAB ใน IE6 + เหตุการณ์จะไม่เริ่มทำงาน (มันจะใช้คีย์ตัวอักษรและตัวเลขใด ๆ ก็ตาม) ... ฉันต้องใช้. live ('keypress', fn)
Jon Erickson

หากใช้ได้กับการถ่ายทอดสดบางทีคุณอาจจะแทรกองค์ประกอบกล่องข้อความของคุณแบบไดนามิกหากองค์ประกอบที่มีอยู่แล้วในหน้ามันจะทำงานให้ตรวจสอบตัวอย่างนี้: jsbin.com/oguhe
CMS

ใช่กล่องข้อความจะถูกแทรกแบบไดนามิก ตัวอย่างของฉันที่มี ID #textbox เป็นเพียงเพื่อให้ง่ายต่อคำถาม =)
จอนเอริก

@ จอนเหตุผลที่คุณไม่ได้ใช้ $ (ตัวเลือก) .live ("keydown", fn) คืออะไร? CMS จะแนะนำการใช้ keydown เพราะใน IE ปุ่มกดไม่ทำงานสำหรับคีย์ noncharacter (เช่นแท็บ)
มาร์ค

5
@AppleGrew: มันบอกว่าใช่ แต่มันไม่เป็นความจริง - อย่างน้อยสำหรับ keypress สำหรับ Tab e.which คือ 0 และ e.keyCode คือ 9 (เท่าที่ควร) ทดสอบใน FF 3.5.16, jQuery 1.6.2
johndodo

19

ตัวอย่างการทำงานใน jQuery 1.9:

$('body').on('keydown', '#textbox', function(e) {
    if (e.which == 9) {
        e.preventDefault();
        // do your code
    }
});

2
ทำe.preventDefault();สองครั้งเพื่อป้องกันการแทรกช่องว่างในกล่องข้อความ
สไตล์

12
$('#textbox').live('keypress', function(e) {
    if (e.keyCode === 9) {
        e.preventDefault();
        // do work
    }
});

2
นอกจากนี้หากต้องการยกเลิกการกระทำเริ่มต้นให้ใช้ e.preventDefault (); ในบรรทัดแรกของฟังก์ชั่น
Josh Leitzel

@ จอนแป้นกดไม่จับคีย์ที่ไม่ใช่อักขระใน IE
Marc

@ Marc ฉันเห็นแล้วฉันจะเข้ากันได้กับ IE และ FF อย่างไร
Jon Erickson

4
^^ ประชด ... jQuery ควรจะเชื่อมช่องว่างระหว่าง broswers ดังนั้นคุณไม่ต้องกังวลเรื่องแบบนี้
Jagd

@Jagd, jQuery ไม่สามารถอนุมานความตั้งใจได้ keypress และ keydown นั้นไม่เทียบเท่ากันด้วยเหตุผลที่ดี มันเพิ่งเกิดขึ้นสถานการณ์นี้ไม่ต้องการความแตกต่าง
Marc

7

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

$('#textBox').live('keydown', function(e) {
    if (e.keyCode == 9) {
        e.preventDefault();
        alert('tab');
    }
});

5

ส่วนสำคัญของการใช้คีย์ลงบนแท็บคือการรู้ว่าแท็บนั้นจะพยายามทำบางสิ่งอยู่แล้วอย่าลืม "คืนเท็จ" ในตอนท้าย

นี่คือสิ่งที่ฉันทำ ฉันมีฟังก์ชั่นที่ทำงานบน. blur และฟังก์ชั่นที่สลับตำแหน่งโฟกัสของแบบฟอร์มของฉัน โดยทั่วไปจะเพิ่มอินพุตไปยังจุดสิ้นสุดของแบบฟอร์มและไปที่นั่นในขณะที่รันการคำนวณแบบเบลอ

$(this).children('input[type=text]').blur(timeEntered).keydown(function (e) {
        var code = e.keyCode || e.which;
        if (code == "9") {
            window.tabPressed = true;
            // Here is the external function you want to call, let your external
            // function handle all your custom code, then return false to
            // prevent the tab button from doing whatever it would naturally do.
            focusShift($(this));
            return false;
        } else {
            window.tabPressed = false;
        }
        // This is the code i want to execute, it might be different than yours
        function focusShift(trigger) {
            var focalPoint = false;
            if (tabPressed == true) {
                console.log($(trigger).parents("td").next("td"));
                focalPoint = $(trigger).parents("td").next("td");

            }
            if (focalPoint) {
                $(focalPoint).trigger("click");
            }
        }
    });


1

สมมติว่าคุณมีกล่องข้อความพร้อมรหัส txtName

$("[id*=txtName]").on('keydown', function(e) { 
  var keyCode = e.keyCode || e.which; 
  if (keyCode == 9) {
     e.preventDefault();
     alert('Tab Pressed');
 }
}); 

1

คุณสามารถจับภาพแท็บกิจกรรมโดยใช้นี้ JQuery API

$( "#yourInputTextId" ).keydown(function(evt) {
   if(evt.key === "Tab")
      //call your function
});

มันใช้งานได้สำหรับฉันหลังจากเพิ่ม evt.preventDefault (); ใน if
LowFieldTheory

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.