ฉันจะใช้ onchange ของ <input type =“ text”> กับ jQuery ได้อย่างไร


คำตอบ:


219

คุณสามารถใช้ได้ .change()

$('input[name=myInput]').change(function() { ... });

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

หากที่ไม่ถูกต้องสำหรับคุณคุณสามารถใช้บางส่วนของอื่น ๆเหตุการณ์ jQueryเช่นkeyup , KeyDownหรือปุ่มกด - ขึ้นอยู่กับผลที่คุณต้องการ


น่าเสียดายที่นี่ใช้ไม่ได้กับอินพุตที่ซ่อนอยู่ วิธีแก้ปัญหาที่เป็นไปได้เมื่อต้องการ onchange บนอินพุตที่ซ่อนอยู่คือ: <input type = 'text' style = 'display: none' /> (with css) ..
NickGreen

304
โปรดทราบว่าchangeจะทำงานเฉพาะเมื่อองค์ประกอบอินพุตหายโฟกัส นอกจากนี้ยังมีinputเหตุการณ์ที่เกิดขึ้นเมื่อใดก็ตามที่กล่องข้อความอัปเดตโดยไม่จำเป็นต้องเสียสมาธิ ซึ่งแตกต่างจากเหตุการณ์สำคัญมันยังใช้งานได้สำหรับการวาง / ลากข้อความ
pimvdb

4
ความคิดเห็นยอดเยี่ยม @pimvdb ฉันใช้สิ่งนี้และเปลี่ยนเป็นคำตอบสำหรับคำถามนี้
iPadDeveloper2011

1
ขณะที่ฉันพยายามทำสิ่งนี้และเพิ่งได้เรียนรู้ว่าเหตุการณ์นั้นเกิดขึ้นเฉพาะเมื่อพบกับสองเงื่อนไข: 1) การเปลี่ยนแปลงมูลค่า และ 2) เบลอฉันสงสัยว่าหลายคนคาดหวังว่าการเปลี่ยนแปลง () จะได้รับการจัดการที่ดีขึ้นโดย keyup ()?
TARKUS

เนื่องจากchangeไม่ได้รับการสนับสนุนโดย IE9 คุณสามารถใช้focusoutเพื่อให้มีความเหมือนกัน
Soma

247

@pimvdb พูดในความคิดเห็นของเขา

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

(ดูเอกสารประกอบ )

มันมีประโยชน์มากมันคุ้มค่าที่จะตอบคำถามนี้ ปัจจุบัน (v1.8 *?) ไม่มี. input () ความสะดวกสบาย fn ใน jquery ดังนั้นวิธีที่จะทำคือ

$('input.myTextInput').on('input',function(e){
 alert('Changed!')
});

6
โดยเฉพาะ IE <9 ไม่รองรับเลย
dlo

13
เนื่องจากคุณสามารถผูกกับหลาย ๆ เหตุการณ์$('form').on('change input', function);ได้หลอกลวงสำหรับฉัน ขอบคุณ
justnorris

9
@Norris นั่นอาจจะเป็นการยิงสองครั้งเมื่อมีการเปลี่ยนแปลงองค์ประกอบ (ที่ 1) และสูญเสียการโฟกัส (ที่ 2) นั่นไม่ใช่ปัญหาสำหรับวัตถุประสงค์หลายอย่าง แต่ก็คุ้มค่าที่จะสังเกต
iPadDeveloper2011

ทดสอบที่ IE9 จะไม่มีการยิง
แบ็คสเปซ

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

79

ฉันขอแนะนำให้ใช้เหตุการณ์ keyup ดังต่อไปนี้:

$('elementName').keyup(function() {
 alert("Key up detected");
});

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

อัปเดต: ใช้งานได้กับอินพุตแบบแมนนวลเท่านั้นไม่ได้คัดลอกและวาง

สำหรับการคัดลอกและวางฉันอยากจะแนะนำสิ่งต่อไปนี้:

$('elementName').on('input',function(e){
 // Code here
});

ฉันขอแนะนำอันนี้สำหรับการป้อนข้อความ!
Vercas

20
เนื้อหาขององค์ประกอบอินพุตสามารถเปลี่ยนแปลงได้โดยไม่ต้องกดปุ่มคีย์ ตัวอย่างเช่นคุณสามารถวางข้อความโดยใช้เมาส์
celicni

นอกจากนี้การเปลี่ยนแปลงนั้นยังต้องมีการจับช่องทำเครื่องหมายด้วย
turbo2oh

30

นี่คือรหัสที่ฉันใช้:

$("#tbSearch").on('change keyup paste', function () {
    ApplyFilter();
});

function ApplyFilter() {
    var searchString = $("#tbSearch").val();
    //  ... etc...
}

<input type="text" id="tbSearch" name="tbSearch" />

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


22

มีวิธีที่เชื่อถือได้เพียงวิธีเดียวเท่านั้นและมีการดึงค่าในช่วงเวลาและเปรียบเทียบกับค่าแคช

เหตุผลที่เป็นวิธีเดียวคือเนื่องจากมีหลายวิธีในการเปลี่ยนฟิลด์อินพุตโดยใช้อินพุตต่างๆ (คีย์บอร์ด, เมาส์, วาง, ประวัติเบราว์เซอร์, ข้อความเสียง ฯลฯ ) และคุณไม่สามารถตรวจสอบได้ทั้งหมดโดยใช้เหตุการณ์มาตรฐานในการข้าม - เบราว์เซอร์สภาวะแวดล้อม

โชคดีที่ขอบคุณโครงสร้างพื้นฐานของกิจกรรมใน jQuery มันค่อนข้างง่ายที่จะเพิ่มเหตุการณ์การป้อนข้อมูลของคุณเอง ฉันทำที่นี่:

$.event.special.inputchange = {
    setup: function() {
        var self = this, val;
        $.data(this, 'timer', window.setInterval(function() {
            val = self.value;
            if ( $.data( self, 'cache') != val ) {
                $.data( self, 'cache', val );
                $( self ).trigger( 'inputchange' );
            }
        }, 20));
    },
    teardown: function() {
        window.clearInterval( $.data(this, 'timer') );
    },
    add: function() {
        $.data(this, 'cache', this.value);
    }
};

ใช้มันเหมือน: $('input').on('inputchange', function() { console.log(this.value) });

มีตัวอย่างที่นี่: http://jsfiddle.net/LGAWY/

หากคุณกำลังกลัวของช่วงหลายคุณสามารถผูก / ยกเลิกการเชื่อมโยงเหตุการณ์นี้บน/focusblur


มีความเป็นไปได้ที่จะทำให้การทำงานของรหัสของคุณเช่นนี้$('body').on('inputchange', 'input', function() { console.log(this.value) });? หรือไม่ตามที่กล่าวไว้ที่นี่: github.com/EightMedia/hammer.js/pull/98 ?
TheFrost

13
การเขียนและเรียกใช้โค้ดดังกล่าวถือเป็นความบ้าคลั่งที่มีผลกระทบอย่างรุนแรงต่อประสิทธิภาพ
Danubian Sailor

@ ŁukaszLechได้โปรดบอกฉันเกี่ยวกับเรื่องนี้ แต่ถ้าคุณกดจุดโฟกัส / เบลอเหตุการณ์ดังที่ผมได้กล่าวไปช่วงเวลานั้นจะวิ่งไปชั่วขณะ แน่นอนว่าแม้แต่ Intel 386 จากปี 1988 ก็สามารถจัดการกับช่วงเวลาเดียวได้หรือไม่?
เดวิดเฮลล์ซิงก์

5
<input id="item123" class="firstName" type="text" value="Hello there" data-someattr="CoolExample" />

$(".firstName").on('change keyup paste', function () {
   var element = $(this);
   console.log(element);
   var dataAttribute = $(element).attr("data-someattr");
   console.log("someattr: " + dataAttribute );
});

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


4

ข้อมูลต่อไปนี้จะใช้ได้แม้ว่าจะเป็นการโทรแบบไดนามิก / Ajax

สคริปต์:

jQuery('body').on('keyup','input.addressCls',function(){
  console.log('working');
});

HTML,

<input class="addressCls" type="text" name="address" value="" required/>

ฉันหวังว่ารหัสการทำงานนี้จะช่วยให้คนที่พยายามเข้าถึงแบบไดนามิก / โทรอาแจ็กซ์ ...



2

คุณสามารถทำงานกับ ID ได้

$("#your_id").on("change",function() {
    alert(this.value);
});

สิ่งนี้ไม่ได้เพิ่มคำตอบที่มีอยู่มากนัก
ปาง

2

คุณสามารถทำได้ด้วยวิธีที่แตกต่างกันการกดคีย์เป็นหนึ่งในนั้น แต่ฉันกำลังยกตัวอย่างด้านล่างเมื่อมีการเปลี่ยนแปลง

$('input[name="vat_id"]').on('change', function() {
    if($(this).val().length == 0) {
        alert('Input field is empty');
    }
});

หมายเหตุ: อินพุต [name = "vat_id"]แทนที่ด้วยIDอินพุตหรือชื่อของคุณ


2

หากคุณต้องการทริกเกอร์เหตุการณ์ขณะพิมพ์ให้ใช้สิ่งต่อไปนี้:

$('input[name=myInput]').on('keyup', function() { ... });

หากคุณต้องการทริกเกอร์เหตุการณ์เมื่อออกจากฟิลด์อินพุตให้ใช้สิ่งต่อไปนี้:

$('input[name=myInput]').on('change', function() { ... });

ด้วยเหตุผลบางอย่างสิ่งนี้ไม่ได้ผลสำหรับฉัน แต่สิ่งนี้ทำ:$(document).on('change', 'input[name=myInput]', function() { ... });
Stefan

1
@Stefan โค้ดในตัวอย่างของคุณเรียกว่าการมอบหมายกิจกรรม ช่องป้อนข้อมูลของคุณจะต้องเพิ่มขึ้นหลังจากการเริ่มต้นหน้าเว็บนั่นเป็นสาเหตุที่รหัสของฉันไม่ทำงานสำหรับคุณ
Usman Ahmed

1
$("input").change(function () {
    alert("Changed!");
});

4
ปัญหาของตัวเลือกนี้คือใช้งานได้เฉพาะเมื่อคุณสูญเสียโฟกัสอินพุต
Yises

ที่จะยังคงเหมาะกับบางกรณี
James Drinkard

1

สิ่งนี้ใช้ได้สำหรับฉัน ถ้าเขตที่มีชื่อfieldaมีการคลิกหรือคีย์ใด ๆ เข้าไปในการปรับปรุงข้อมูลที่มี ID FieldB

jQuery("input[name='fieldA']").on("input", function() {
    jQuery('#fieldB').val(jQuery(this).val());
});

0

.keypress()คุณสามารถใช้

ตัวอย่างเช่นพิจารณา HTML:

<form>
  <fieldset>
    <input id="target" type="text" value="Hello there" />
  </fieldset>
</form>
<div id="other">
  Trigger the handler
</div>

ตัวจัดการเหตุการณ์สามารถผูกกับฟิลด์อินพุต:

$("#target").keypress(function() {
  alert("Handler for .keypress() called.");
});

ฉันเห็นด้วยกับแอนดี้โดยสิ้นเชิง ทั้งหมดขึ้นอยู่กับว่าคุณต้องการให้มันทำงานอย่างไร


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