ฉันจะรับ jquery .val () หลังจากเหตุการณ์การกดแป้นพิมพ์ได้อย่างไร


101

ฉันได้:

$(someTextInputField).keypress(function() {
  alert($(this).val());
});

ตอนนี้การแจ้งเตือนจะส่งคืนค่าก่อนการกดแป้นทุกครั้ง (เช่นช่องว่างฉันพิมพ์ 'a' และการแจ้งเตือนจะให้ฉัน '' จากนั้นฉันพิมพ์ 'b' และการแจ้งเตือนจะให้ 'a' ... ) แต่ฉันต้องการค่าหลังจากการกดแป้น - ฉันจะทำได้อย่างไร

พื้นหลัง: ฉันต้องการเปิดใช้งานปุ่มทันทีที่ช่องข้อความมีอักขระอย่างน้อยหนึ่งตัว ดังนั้นฉันจึงเรียกใช้การทดสอบนี้ในทุกเหตุการณ์การกดแป้นพิมพ์ แต่การใช้ val กลับ () ผลลัพธ์จะอยู่ข้างหลังหนึ่งก้าวเสมอ การใช้เหตุการณ์ change () ไม่ใช่ตัวเลือกสำหรับฉันเพราะปุ่มจะถูกปิดใช้งานจนกว่าคุณจะออกจากกล่องข้อความ หากมีวิธีที่ดีกว่านี้ฉันยินดีที่จะรับฟัง!


ปุ่มนี้ควรปิดใช้งานอีกครั้งหรือไม่หากข้อความถูกลบ ถ้าเป็นเช่นนั้นคุณอาจต้องกดแป้น
Brilliand

คำตอบ:


152

เปลี่ยนkeypressเป็นkeyup:

$(someTextInputField).on("keyup", function() {
  alert($(this).val());
});

keypressจะยิงเมื่อกดปุ่มลงkeyupจะยิงเมื่อปล่อยปุ่ม


@Brilliand คุณพูดถูก ฉันได้แก้ไขปัญหานี้แล้วซึ่งโพสต์ไว้ด้านล่าง
David Oliveros

7
คุณทำสิ่งนี้ให้สำเร็จบนอุปกรณ์ iPhone / Android ได้อย่างไร ไม่รองรับฟังก์ชั่น keyup
Merijn Den Houting

4
คำจำกัดความของการกดแป้นพิมพ์ไม่ถูกต้อง นั่นคือคำจำกัดความของคีย์ดาวน์ ดูquirksmode.org/dom/events/keys.html
Challet

59

แปลกใจที่ไม่มีใครพูดถึงเหตุการณ์ "input" js:

$(someTextInputField).on('input', function() {
  alert($(this).val());
});

แนะนำ.

https://developer.mozilla.org/en-US/docs/Web/Events/input


8
ว้าวนี่คือคำตอบสำหรับคำถาม SO ที่ยังไม่ได้รับคำตอบ / ตอบไม่ดี
Ben Racicot

4
นอกจากนี้ยังดีมากเมื่อคุณต้องการละเว้นการกดแป้นลูกศรการเลื่อน ฯลฯ ในช่องป้อนข้อมูล
hovado

2
caniuse.com/#search=inputการสนับสนุนเบราว์เซอร์ที่ค่อนข้างดี คำตอบที่ดีกว่าการฟังทุกปุ่ม
James Haug

1
ช่วยประหยัดวันของฉัน! ขอบคุณ. ฉันใช้รหัสต่อไปนี้: $ ('. subject_mark'). on ("input", function () {var $ th = $ (this); $ th.val ($ th.val (). replace (/ [^ 0-9] / g, function (str) {return '';}));
arsho


5

หรือคุณสามารถใช้เหตุการณ์คีย์ดาวน์โดยมีการหมดเวลาเป็น 0

ด้วยวิธีนี้การเปลี่ยนแปลงจะถูกนำไปใช้ทันทีแทนที่จะใช้เมื่อผู้ใช้หยุดกดปุ่ม

$(someTextInputField).on("keydown", function() {
  setTimeout(function($elem){
    alert($elem.val());
  }, 0, $(this));
});

สิ่งนี้จะยังคงทำงานแปลก ๆ ในกรณีที่กด Backspace ค้างไว้ ... บางทีการกดแป้นด้วยการหมดเวลาเป็น 0?
Brilliand

อ่าไม่เป็นไร OP ไม่ได้ระบุว่าจะเกิดอะไรขึ้นถ้าช่องข้อความถูกล้าง
Brilliand

4

คุณอาจต้องการเชื่อมต่อonchangeตัวจัดการเหตุการณ์แทนการใช้เหตุการณ์สำคัญใด ๆ

$(someTextInputField).change(function() {
    alert($(this).val());
});

การใช้Edit > Pasteหรือคลิกขวาแล้ววางจะทำให้เหตุการณ์การเปลี่ยนแปลงเริ่มทำงาน แต่ไม่ใช่เหตุการณ์สำคัญ โปรดทราบว่าเบราว์เซอร์บางตัวอาจจำลองเหตุการณ์สำคัญในการวาง (แม้ว่าฉันจะไม่รู้เลยก็ตาม) แต่คุณไม่สามารถนับพฤติกรรมนั้นได้


4

ลองทำสิ่งนี้:

$('#someField').keypress(function() {
  setTimeout(function() {
    if ($('#someField').val().length > 0)
      $('#theButton').attr('disabled', false);
  }, 1);
});

นั่นเป็นเพียงการแนะนำการหมดเวลาดังนั้นหลังจากวนเหตุการณ์ "กดแป้น" เสร็จสิ้นโค้ดของคุณจะทำงานเกือบจะทันทีหลังจากนั้น ช่วงเวลาที่สั้นเช่นนี้ (แม้ว่าเบราว์เซอร์จะปัดเศษขึ้น) จะไม่สามารถสังเกตเห็นได้

แก้ไข - หรือคุณสามารถใช้ "keyup" เหมือนที่ใคร ๆ พูดกันก็ได้แม้ว่าความหมายจะแตกต่างกัน


มันไม่ได้เป็นเรื่องของการ benig สมาร์ท เหตุการณ์คีย์อัพไม่ได้ให้ผลลัพธ์เดียวกัน คุณได้รับเหตุการณ์ที่แตกต่างกันสำหรับ shift, ctrl และอื่น ๆ ด้วยการกดปุ่ม - หากคุณต้องการรับอักขระจริงที่กำลังพิมพ์อยู่ (เช่นเครื่องหมายแอมเพอร์แซนด์) แทนที่จะเป็นชุดของเหตุการณ์สำคัญที่คุณต้องตรวจสอบสถานะของปุ่ม shift หรือ ctrl การกดแป้น คือหนทางที่จะไป
Ripside

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