เหตุการณ์การเปลี่ยนแปลงทริกเกอร์ () เมื่อตั้งค่าของ <select> ด้วยฟังก์ชัน val ()


133

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

ฉันคาดหวังว่าจะรันโค้ดต่อไปนี้

$('select#some').val(10);

หรือ

$('select#some').attr('value',  10);

จะส่งผลให้เกิดเหตุการณ์การเปลี่ยนแปลงซึ่งฉันคิดว่าเป็นตรรกะที่ดีที่ต้องทำ ขวา?

มันไม่ใช่อย่างนั้น คุณต้องทำ triger change () เหตุการณ์โดยทำสิ่งนี้

$('select#some').val(10).change();

หรือ

$('select#some').val(10).trigger('change');

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


องค์ประกอบ javascript บริสุทธิ์ addEventListener?
Manuel Bitto

4
$ ('select # some'). val (10) .change (); ค่อนข้างทันทีสำหรับผู้ใช้
Dimitri

@ มานูเอลฉันพยายามแล้ว iv'e ใช้ object.change = function (.... และ object.addEventListener (... แต่ไม่มี object.value, $ (object) .val () และ $ (object) .attr ('value') จะทำให้เกิดรายชื่อนั้น
Goran Radulovic

คำตอบ:


126

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

$('#selectField').change(function(){
    if($('#selectField').val() == 'N'){
        $('#secondaryInput').hide();
    } else {
        $('#secondaryInput').show();
}
});

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

$('#selectField').val(valueFromDatabase).change();

ดังนั้นถ้าค่าที่มีอยู่จากฐานข้อมูลเป็น 'N' มันจะซ่อนฟิลด์อินพุตสำรองในแบบฟอร์มของฉันทันที


นี่คือสิ่งที่ฉันต้องการ อะไรคือวิธีที่ดีที่สุดในการค้นหาวิธีทริกเกอร์ตัวจัดการเหตุการณ์ DOM แบบไดนามิก jQuery ทำเอกสารได้ดีหรือไม่? ขอบคุณ!
Con Antonakos

2
$ ("# discount_type") .val (2) .trigger ('เปลี่ยน');
ซาตานและทิวา

$ ('# add_itp_spt_parent_id'). val (add_fpt_val) .trigger ('เปลี่ยน'); $ ('# add_itp_spt_parent_id') เปลี่ยน (); โซลูชันทั้งสองไม่ทำงาน
Kamlesh

ฟังก์ชันการเปลี่ยนแปลงที่กำหนดไว้ก่อนที่คุณจะใช้แก้ไขปัญหาของฉัน ขอบคุณ.
Kamlesh

45

สิ่งหนึ่งที่ฉันค้นพบ (วิธีที่ยาก) ก็คือคุณควรมี

$('#selectField').change(function(){
  // some content ...
});

กำหนดไว้ก่อนที่คุณจะใช้

$('#selectField').val(10).trigger('change');

หรือ

 $('#selectField').val(10).change();

4
โพสต์เก่า แต่สิ่งนี้ช่วยแก้ปัญหาของฉันได้ช่วยฉันจากการแตกสมองที่ยืดยาว ... คุณต้องกำหนดผู้ฟังก่อนใช้ แม้ใน JavaScript บริสุทธิ์
Temitayo

อธิบายละเอียดหน่อยได้ไหม ไม่มี "การเปลี่ยนแปลง ()" ด้วยเหตุนี้หรือไม่?
Dima R.

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

1
นี่คือสิ่งที่ฉันต้องการ เอาฉันตลอดไปเพื่อแก้ปัญหานี้ขอบคุณ
Jamie M.

ไชโย !!! "ฟังก์ชันการเปลี่ยนแปลงที่กำหนดไว้ก่อนที่คุณจะใช้" แก้ไขปัญหาของฉัน ขอบคุณที่รัก.
Kamlesh

17

คำตอบที่ตรงมีอยู่แล้วในคำถามที่ซ้ำกัน: เหตุใดเหตุการณ์การเปลี่ยนแปลง jquery จึงไม่ทริกเกอร์เมื่อฉันตั้งค่าของการเลือกโดยใช้ val ()

ดังที่คุณอาจทราบว่าการตั้งค่าการเลือกไม่ได้ทำให้เกิดเหตุการณ์เปลี่ยนแปลง () หากคุณกำลังมองหาเหตุการณ์ที่เริ่มทำงานเมื่อค่าขององค์ประกอบถูกเปลี่ยนผ่าน JS จะไม่มีเลย

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

เพิ่มโซลูชันนี้:
อีกวิธีหนึ่งที่เป็นไปได้คือการสร้าง.val()ฟังก์ชัน Wrapper ของคุณเองและให้มันทริกเกอร์เหตุการณ์ที่กำหนดเองหลังจากตั้งค่าผ่าน.val()จากนั้นเมื่อคุณใช้ Wrapper .val () ของคุณเพื่อตั้งค่าของ<select>มันจะทริกเกอร์เหตุการณ์ที่คุณกำหนดเอง ซึ่งคุณสามารถดักจับและจัดการได้

ต้องแน่ใจว่าreturn thisมันเป็นแบบ chainable แบบ jQuery


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

ทำไมจะไม่$('select').val(value).change()ทำงานตลอดเวลา? มีคำอธิบายที่ชัดเจนหรือไม่?
Istiaque Ahmed

3

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

วิธีแก้ปัญหาจะเป็นดังนี้ (ใช้งานได้ 100%):

var sortBySelect = document.querySelector("select.your-class"); 
sortBySelect.value = "new value"; 
sortBySelect.dispatchEvent(new Event("change"));

2

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

$("#selectField").change(function(){
  if(this.value === 'textValue1'){ $(".contentClass1").fadeIn(); }
  if(this.value === 'textValue2'){ $(".contentclass2").fadeIn(); }
});
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.