กำลังตรวจจับการเปลี่ยนแปลงอินพุตใน jQuery หรือไม่


359

เมื่อใช้ jquery .changeกับinputเหตุการณ์จะถูกไล่ออกเมื่ออินพุตขาดโฟกัสเท่านั้น

ในกรณีของฉันฉันต้องโทรไปที่บริการ (ตรวจสอบว่าค่าถูกต้อง) ทันทีที่มีการเปลี่ยนแปลงค่าอินพุต ฉันจะทำสิ่งนี้ได้อย่างไร


3
อินพุตชนิดใด กล่องข้อความ? ช่องทำเครื่องหมาย? วิทยุ? textarea? มาดูกันว่าคุณมีอะไรเกิดขึ้นบ้าง
Patricia

ขออภัยมันเป็นข้อความป้อนเข้า และอย่างที่ฉันบอกว่าฉันได้ลองเปลี่ยนไปแล้ว แต่มันก็ไม่ได้เป็นไปตามที่ฉันต้องการ (สำหรับการเปลี่ยนแปลงทุกข้อความในอินพุต) ฉันได้ลองใช้การกดคีย์เพื่อทำงานนี้ฉันจะต้องติดตามหากอินพุตนั้น "สกปรก" หรือไม่
Banshee

2
หากพวกเขากดปุ่มมันจะเปลี่ยน 99% ของเวลาคุณสามารถตรวจสอบกุญแจที่ไม่ได้อยู่ในตัวจัดการเหตุการณ์ได้ตลอดเวลา
Patricia

คำตอบ:


545

อัปเดตสำหรับการชี้แจงและตัวอย่าง

ตัวอย่าง: http://jsfiddle.net/pxfunc/5kpeJ/

วิธีที่ 1. inputเหตุการณ์

ในเบราว์เซอร์ที่ทันสมัยใช้inputเหตุการณ์ เหตุการณ์นี้จะเริ่มขึ้นเมื่อผู้ใช้พิมพ์ลงในช่องข้อความวางวางเลิกทำโดยทั่วไปทุกครั้งที่ค่าเปลี่ยนจากค่าหนึ่งไปเป็นอีกค่า

ใน jQuery ทำเช่นนี้

$('#someInput').bind('input', function() { 
    $(this).val() // get the current value of the input field.
});

เริ่มต้นด้วย jQuery 1.7 แทนที่bindด้วยon:

$('#someInput').on('input', function() { 
    $(this).val() // get the current value of the input field.
});

วิธีที่ 2. keyupเหตุการณ์

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

$('#someInput').keyup(function() {
    $(this).val() // get the current value of the input field.
});

วิธีที่ 3 ตัวจับเวลา ( setIntervalหรือsetTimeout)

หากต้องการหลีกเลี่ยงข้อ จำกัด ของkeyupคุณสามารถตั้งเวลาให้ตรวจสอบค่าของอินพุตเป็นระยะเพื่อตรวจสอบการเปลี่ยนแปลงค่า คุณสามารถใช้setIntervalหรือsetTimeoutทำการตรวจสอบตัวจับเวลา ดูคำตอบที่ทำเครื่องหมายไว้ในคำถาม SO นี้: กล่องข้อความ jQuery เปลี่ยนเหตุการณ์หรือดูซอสำหรับตัวอย่างการใช้งานfocusและblurกิจกรรมเพื่อเริ่มและหยุดตัวจับเวลาสำหรับฟิลด์อินพุตที่ระบุ


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

เหตุการณ์อินพุต ไม่มีกิจกรรมอินพุตใน jQuery (ยัง) ... stackoverflow.com/q/11189136/104380
vsync

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

1
@AdiDarachi MutationObserver จะติดตามการเปลี่ยนแปลงองค์ประกอบ DOM อย่างไรก็ตามผู้ใช้ที่เปลี่ยนแปลงข้อมูลในช่องป้อนข้อมูลไม่ได้เรียกการเปลี่ยนแปลง MutationObserver ... ฉันตั้งค่ากรณีทดสอบเฉพาะการเปลี่ยนรหัส JS เป็นแอตทริบิวต์innerTextหรือvalue(การจำลองการป้อนข้อมูลผู้ใช้) จะทำให้เกิดเหตุการณ์MutationObserver 04chgpws / 1 (ดูที่ console.log สำหรับการบันทึกเหตุการณ์ MutationObserver) คุณมีกรณีทดสอบอื่นที่ฉันสามารถดูได้ไหม
MikeM

1
สิ่งนี้ไม่ทำงานเมื่อสคริปต์เปลี่ยนค่า
FalcoGer

189

หากคุณมี HTML5:

  • oninput (ยิงเฉพาะเมื่อมีการเปลี่ยนแปลงเกิดขึ้นจริง แต่จะทำทันที)

มิฉะนั้นคุณต้องตรวจสอบเหตุการณ์ทั้งหมดเหล่านี้ซึ่งอาจบ่งบอกถึงการเปลี่ยนแปลงค่าขององค์ประกอบอินพุต:

  • onchange
  • onkeyup( ไม่ใช่ keydownหรือkeypressเป็นค่าของอินพุตจะไม่มีการกดแป้นพิมพ์ใหม่ในนั้น)
  • onpaste (เมื่อรองรับ)

และอาจจะ:

  • onmouseup (ฉันไม่แน่ใจเกี่ยวกับอันนี้)

@ นาโอมิกจากการทดสอบของฉันมันใช้งานได้กับอินพุตช่องทำเครื่องหมาย; ยกเว้น IE / Edge ข้อยกเว้นอื่น ๆ บางอย่างอาจปรากฏขึ้น แต่ก็ฉลาดกว่าที่จะใช้ onchange สำหรับประเภทอินพุต (IMHO)
HellBaby

82

ด้วย HTML5 และไม่ใช้ jQuery คุณสามารถใช้inputเหตุการณ์ :

var input = document.querySelector('input');

input.addEventListener('input', function()
{
    console.log('input changed to: ', input.value);
});

สิ่งนี้จะเริ่มทำงานทุกครั้งที่มีการเปลี่ยนแปลงข้อความของอินพุต

รองรับ IE9 + และเบราว์เซอร์อื่น ๆ

ลองมันอาศัยอยู่ในjsFiddle ที่นี่



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

14

เป็นคนอื่น ๆ แนะนำแล้ววิธีการแก้ปัญหาในกรณีของคุณคือการสูดอากาศหลายเหตุการณ์
ปลั๊กอินที่ทำงานนี้มักจะฟังเหตุการณ์ต่อไปนี้:

$ การป้อนข้อมูล บน( 'เปลี่ยนปุ่มกด keydown keyup mousedown คลิก mouseup' , จัดการ);

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

ข้อควรสนใจ:โปรดทราบว่าการเปลี่ยนค่าขององค์ประกอบอินพุตด้วย JavaScript (เช่นผ่าน.val()วิธีjQuery ) จะไม่เริ่มต้นเหตุการณ์ใด ๆ ข้างต้น
(การอ้างอิง: https://api.jquery.com/change/ )


ฉันยังแนะนำให้เพิ่ม focusout เพื่อหลีกเลี่ยงปัญหาเกี่ยวกับการเติมข้อความอัตโนมัติ
binar

ฉันเห็น. ฉันค้นหาและ IE เน้นเฉพาะการสนับสนุนเท่านั้นและ Chrome บางส่วนเท่านั้นใช่ไหม
Emanuele Del Grande

5
ในการเพิ่มเหตุการณ์เล็กน้อยจาก jQuery คุณสามารถเรียกการกระทำที่เกี่ยวข้องหลังจาก.val()เช่นสำหรับเหตุการณ์การเปลี่ยนแปลงในฟิลด์อินพุตคุณจะทำสิ่งนี้ ... $('#element').val(whatever).change()
techknowcrat

2

หากคุณต้องการให้เหตุการณ์ถูกไล่ออกเมื่อใดก็ตามที่มีการเปลี่ยนแปลงภายในองค์ประกอบคุณสามารถใช้เหตุการณ์keyup


โอเค แต่นี่ไม่มากหรือน้อยเหมือนกับ keydown หรือไม่ ฉันจะต้องตรวจสอบว่าอินพุตเป็น "สกปรก" ด้วยตัวเองหรือไม่?
Banshee

@SnowJim หากคุณต้องการทำสิ่งต่าง ๆ เฉพาะเมื่อการป้อนข้อมูลมีการเปลี่ยนแปลงจริงคุณต้องใช้onchangeหรือติดตามสถานะด้วยตัวคุณเอง keydownไม่ทำงานเพราะไฟก่อนที่สถานะอินพุตจะเปลี่ยน
Alnitak

@Alnitak exacly และนั่นเป็นเหตุผลที่ฉันถามคำถามที่นี่ การเปลี่ยนไม่ทำงานเป็นเพียงการโยนทิ้งเมื่อป้อนข้อมูล
Banshee

ช้างในห้องแน่นอนเป็นมือถือ ค่อนข้างแน่ใจว่าจะไม่มีเหตุการณ์แป้นพิมพ์หรือเมาส์เกิดขึ้นมากมาย : p
Askdesigners

@Askdesigners Keyup / down events ยังคงสามารถใช้งานได้เหมือนเดิมบนมือถือ
Jivings

2

// .blur ถูกกระตุ้นเมื่อองค์ประกอบสูญเสียการโฟกัส

$('#target').blur(function() {
  alert($(this).val());
});

// หากต้องการเรียกใช้ด้วยตนเอง:

$('#target').blur();

1
. change เป็นอย่างที่ฉันบอกว่าโยนเฉพาะเมื่อ inout สูญเสียการโฟกัสและค่าจะเปลี่ยนฉันต้องได้รับทันทีที่อินพุต (ข้อความ) เปลี่ยนไป (ทันทีที่ข้อความในอินพุตเปลี่ยนแปลง) เบลอจะเรียกเฉพาะเมื่ออินพุตขาดโฟกัส
Banshee

1

มีเหตุการณ์ jQuery เช่นการกดคีย์และการกดปุ่มซึ่งคุณสามารถใช้กับองค์ประกอบ HTML ได้ คุณสามารถใช้เหตุการณ์เบลอ ()เพิ่มเติมได้


1
. change เป็นอย่างที่ฉันบอกว่าโยนเฉพาะเมื่อ inout สูญเสียการโฟกัสและค่าจะเปลี่ยนฉันต้องได้รับทันทีที่อินพุต (ข้อความ) เปลี่ยนไป (ทันทีที่ข้อความในอินพุตเปลี่ยนแปลง) เบลอจะเรียกเฉพาะเมื่ออินพุตขาดโฟกัส
Banshee

1
คุณไม่สามารถตรวจสอบค่าของอินพุตในระหว่างkeypressเหตุการณ์ได้อย่างน่าเชื่อถือเพราะคีย์ที่กดยังไม่เปลี่ยนค่านั้น
Alnitak

0

สิ่งนี้ครอบคลุมการเปลี่ยนแปลงทุกอย่างของอินพุตโดยใช้ jQuery 1.7 ขึ้นไป:

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