เหตุการณ์ 'อินพุต' jQuery


206

ฉันไม่เคยได้ยินเหตุการณ์ใน jQuery เรียกinputจนกระทั่งฉันเห็นjsfiddleนี้

คุณรู้ไหมว่าทำไมมันถึงทำงาน มันเป็นนามแฝงสำหรับkeyupหรือบางสิ่งบางอย่าง?

$(document).on('input', 'input:text', function() {});


12
ยกเว้นการchangeยิงเพียงครั้งเดียวเมื่อสนามโฟกัสไม่ได้ inputไฟทันที
jcsanyi

3
คุณลองค้นหาแล้วหรือยัง
ไม่ได้กำหนด

2
@undefined ใช่ฉันไม่เช่นนั้นฉันก็ไม่ได้สร้างคำถามขึ้นมา สิ่งเดียวที่เกิดขึ้นบน Google คือบทความเกี่ยวกับinput องค์ประกอบและวิธีแนบกิจกรรมเข้าด้วยกัน
Silkfire

3
คำถามนี้ตอบแนวคิดทั้งหมดได้อย่างสวยงาม - stackoverflow.com/questions/15727324/…
GemK

คำตอบ:


197

เกิดขึ้นเมื่อเนื้อหาข้อความขององค์ประกอบมีการเปลี่ยนแปลงผ่านส่วนติดต่อผู้ใช้

ไม่ใช่นามแฝงkeyupเพราะkeyupจะยิงแม้ว่ากุญแจจะไม่ทำอะไรเลย (ตัวอย่างเช่น: การกดแล้วปล่อยปุ่มควบคุมจะทำให้เกิดkeyupเหตุการณ์)

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

ดูหน้านี้และความคิดเห็นเกี่ยวกับคำตอบนี้สำหรับรายละเอียดเพิ่มเติม


11
คุณรู้หรือไม่ว่า jQuery ประกอบด้วยการสนับสนุนเบราว์เซอร์ที่หายไป? (IE8, IE9 ไม่สอดคล้องกัน ฯลฯ )
jcsanyi

4
ฉันเพิ่งป้อนเหตุการณ์ js อินพุตของ Google มีความสามารถพิเศษในการรู้ว่าจะใช้คำใดเพื่อค้นหาสิ่งที่คุณต้องการบน google; มันมาพร้อมกับประสบการณ์ และแน่นอนว่า google บันทึกทุกอย่างและใช้เพื่อเรียนรู้สิ่งที่คุณต้องการจริงๆ การค้นหาส่วนใหญ่ของฉันใช้สำหรับเอกสาร API และคำถามการเขียนโปรแกรมดังนั้นจึงได้เรียนรู้เมื่อเวลาผ่านไปเมื่อฉันค้นหาสิ่งต่าง ๆ มันอาจจะแสดงเอกสาร API และคำตอบการเขียนโปรแกรมให้ฉัน
J David Smith

3
ฉันกำลังค้นหา "jQuery input event" ฉันไม่รู้ว่ามันเป็นเหตุการณ์ JS ดั้งเดิม เช่นเดียวกันที่นี่ผลลัพธ์แรกมักมาจาก SO ซึ่งฉันคิดว่าส่วนใหญ่เป็นคำตอบที่แท้จริง / แหล่งข้อมูลอย่างเป็นทางการ
Silkfire

18
inputจริงๆแล้วเป็นมากกว่าตัวกรองkeyupตัวอย่างเช่นมันจะเริ่มทำงานเมื่อเลือกค่าจากรายการค่าที่ใช้ก่อนหน้านี้ ... มันเป็นสิ่งที่ยากมากที่จะจัดการหากไม่มีinputเหตุการณ์
szeryf

2
oninputและยังยิงเมื่อข้อความถูกเปลี่ยนด้วยเมาส์ (ผ่านการลากและวางหรือผ่านทางเมนูคลิกขวาหรือคลิกกลางเพื่อวาง)
Denilson Sá Maia

157

oninput เหตุการณ์มีประโยชน์มากในการติดตามการเปลี่ยนแปลงของฟิลด์อินพุต

แต่มันก็ไม่ได้รับการสนับสนุนใน IE เวอร์ชัน <9 แต่รุ่นเก่า IE มีเหตุการณ์ที่เป็นกรรมสิทธิ์ของตัวเองที่ไม่เหมือนกันกับonpropertychangeoninput

ดังนั้นคุณสามารถใช้วิธีนี้:

$(':input').on('input propertychange');

เพื่อรับการสนับสนุน crossbrowser อย่างเต็มรูปแบบ

เนื่องจากการเปลี่ยนแปลงคุณสมบัติสามารถถูกเรียกใช้สำหรับการเปลี่ยนแปลงคุณสมบัติใด ๆ ตัวอย่างเช่นคุณสมบัติที่ปิดใช้งานมีการเปลี่ยนแปลงดังนั้นคุณจึงต้องการรวมสิ่งนี้:

$(':input').on('propertychange input', function (e) {
    var valueChanged = false;

    if (e.type=='propertychange') {
        valueChanged = e.originalEvent.propertyName=='value';
    } else {
        valueChanged = true;
    }
    if (valueChanged) {
        /* Code goes here */
    }
});

10
สิ่งที่ฉันต้องการ ขอบคุณ. (ฉันเกลียดที่จะต้องสนับสนุน <IE9.)
DaleyKD

ข้อมูลเพิ่มเติมบางอย่าง: "Opera ไม่เริ่มการทำงานของอินพุตหลังจากปล่อยข้อความลงในช่องป้อนข้อมูล IE 9 ไม่เริ่มการทำงานของเหตุการณ์การป้อนข้อมูลเมื่อผู้ใช้ลบอักขระออกจากการป้อนข้อมูลด้วยแป้นพิมพ์การตัดหรือการลาก" developer.mozilla.org/en-US/docs/Web/Events/…
tkane2000

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

แต่ทำไมไม่ใช่แค่ฟังก์ชั่นแยกกันสองอย่าง? ด้วยวิธีนี้ไม่จำเป็นต้องตรวจสอบประเภทเหตุการณ์หรือชื่อคุณสมบัติ รหัสอาจเป็นฟังก์ชั่นที่ใช้ร่วมกันที่สาม
ADTC

17

การใช้ jQuery ต่อไปนี้เหมือนกันในลักษณะพิเศษ:

$('a').click(function(){ doSomething(); });
$('a').on('click', function(){ doSomething(); });

อย่างไรก็ตามด้วยinputเหตุการณ์รูปแบบที่สองเท่านั้นที่ดูเหมือนว่าจะทำงานในเบราว์เซอร์ที่ฉันได้ทดสอบ

ดังนั้นคุณคาดหวังว่าสิ่งนี้จะได้ผล แต่ก็ไม่ได้ (อย่างน้อยปัจจุบัน):

$(':text').input(function(){ doSomething(); });

อีกครั้งหากคุณต้องการยกระดับการมอบหมายกิจกรรม (เช่นการตั้งค่ากิจกรรม#containerก่อนที่คุณinput.textจะเพิ่มใน DOM) สิ่งนี้ควรคำนึงถึง:

$('#container').on('input', ':text', function(){ doSomething(); });

น่าเสียดายที่มันไม่สามารถใช้งานได้ในขณะนี้!

รูปแบบนี้ใช้งานได้เท่านั้น:

$(':text').on('input', function(){ doSomething(); });

แก้ไขด้วยข้อมูลปัจจุบันเพิ่มเติม

แน่นอนฉันสามารถยืนยันได้ว่ารูปแบบนี้:

$('#container').on('input', ':text', function(){ doSomething(); });

ทำงานได้แล้วในเบราว์เซอร์ 'มาตรฐาน' ทั้งหมด


2

ตามที่ claustrofob กล่าวว่า oninput รองรับ IE9 +

อย่างไรก็ตาม "เหตุการณ์ oninput เป็นบั๊กใน Internet Explorer 9 มันจะไม่ทำงานเมื่อลบอักขระจากฟิลด์ข้อความผ่านส่วนต่อประสานผู้ใช้เมื่อใส่อักขระเท่านั้นแม้ว่าเหตุการณ์ onpropertychange จะรองรับใน Internet Explorer 9 แต่คล้ายกับ เหตุการณ์ที่เกิดขึ้นมันก็เป็นรถก็ไม่ได้เป็นเชื้อเพลิงในการลบ

เนื่องจากสามารถลบอักขระได้หลายวิธี (ปุ่ม Backspace และ Delete, CTRL + X, คำสั่งตัดและลบในเมนูบริบท) จึงไม่มีวิธีที่ดีในการตรวจสอบการเปลี่ยนแปลงทั้งหมด หากตัวละครถูกลบโดยคำสั่งลบของเมนูบริบทจะไม่สามารถตรวจพบการดัดแปลงใน JavaScript ใน Internet Explorer 9 "

ฉันมีผลลัพธ์ที่ดีผูกพันกับทั้งอินพุตและคีย์อัพ (และคีย์ดาวน์หากคุณต้องการให้มันทำงานใน IE ในขณะที่กดปุ่ม Backspace ค้างไว้)



1

ฉันคิดว่า 'อินพุต' ทำงานได้ที่นี่เช่นเดียวกับ 'oninput' ในรูปแบบกิจกรรมระดับ DOM O

อนึ่ง:

เช่นเดียวกับที่ไหมแสดงความคิดเห็นฉันก็ googled สำหรับ 'jQuery input event' ดังนั้นฉันจึงถูกพาไปที่นี่และประหลาดใจที่ได้ทราบว่า 'อินพุต' เป็นพารามิเตอร์ที่ยอมรับได้สำหรับคำสั่งbind ()ของ jquery ในjQuery in Action (หน้า 102, 2008 ed.) 'อินพุต' ไม่ได้ถูกกล่าวถึงว่าเป็นเหตุการณ์ที่เป็นไปได้ (เทียบกับ 20 รายการจาก 'เบลอ' ถึง 'ยกเลิกการโหลด') มันเป็นความจริงว่าบนหน้า 92 อาจตรงกันข้ามจากการอ่านซ้ำ (เช่นจากการอ้างอิงถึงตัวระบุสตริงที่แตกต่างกันระหว่างโมเดลระดับ 0 และระดับ 2) นั่นค่อนข้างทำให้เข้าใจผิด


ขอบคุณสำหรับการป้อนข้อมูล (ไม่มีการเล่นสำนวนเจตนา) ดูเหมือนว่าจะเป็นกระทู้อย่างเป็นทางการตอนนี้ :)
Silkfire

0

jQuery มีลายเซ็นต่อไปนี้สำหรับ.on()วิธีการ:.on( events [, selector ] [, data ], handler )

กิจกรรมอาจเป็นรายการใดรายการหนึ่งในรายการอ้างอิงนี้:

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

แม้ว่ามันจะไม่ได้รับการสนับสนุนจากทุกเบราว์เซอร์

Mozilla ระบุสิ่งต่อไปนี้เกี่ยวกับเหตุการณ์อินพุต:

เหตุการณ์การป้อนข้อมูล DOM จะเริ่มทำงานพร้อมกันเมื่อค่าขององค์ประกอบหรือการเปลี่ยนแปลง นอกจากนี้มันจะทำการแก้ไขเนื้อหาที่แก้ไขได้เมื่อเนื้อหามีการเปลี่ยนแปลง


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