jQuery .val เปลี่ยนไม่เปลี่ยนค่าอินพุต


104

ฉันมีอินพุต HTML พร้อมลิงก์ในค่า

<input type = 'text' value = 'http://www.link.com' id = 'link' />

ฉันใช้ jQuery เพื่อเปลี่ยนค่าของเหตุการณ์หนึ่ง ๆ

$('#link').val('new value');

โค้ดด้านบนจะเปลี่ยนค่าของกล่องข้อความ แต่ไม่เปลี่ยนค่าในโค้ด (ค่า = 'http://www.link.com' จะไม่เปลี่ยนแปลง) ฉันต้องการค่า = '' เพื่อเปลี่ยนเช่นกัน


คุณหมายถึงin the codeอะไร? คุณกำลังดูแหล่งที่มาดั้งเดิม (ซึ่งไม่ได้แก้ไข) ของหน้านี้หรือไม่?
— Frédéric Hamidi

ใช้องค์ประกอบการตรวจสอบของ Chrome
— Lukas

3
@Luke ค่าจะเปลี่ยนไป แต่ค่าที่มองเห็นได้ขององค์ประกอบ HTML ในตัวตรวจสอบของ Chrome จะไม่ ลองแจ้งเตือนค่าหรือส่งออกไปยังคอนโซลแล้วคุณจะเห็นว่ามีการเปลี่ยนแปลง ดูมันเปลี่ยนไป: jsfiddle.net/a8SxF
— TheZ

ใช่ฉันเห็นว่าตอนนี้ ฉันใช้ zClip เพื่อคัดลอกค่าไปยังคลิปบอร์ด แต่กำลังคัดลอกค่าเก่าหลังจากมีการเปลี่ยนแปลง ฉันคิดว่าฉันสามารถแก้ไขได้ด้วยการยุ่งเล็กน้อย
— Lukas

คำตอบ:


185

ใช้attrแทน
$('#link').attr('value', 'new value');

การสาธิต


6
สิ่งนี้ถูกต้องโดยสิ้นเชิงโดยการใช้setAttributeหรือ jQuery attrคุณจะส่งผลต่อค่าขององค์ประกอบ DOM ด้วย: jsfiddle.net/a8SxF/1
— TheZ

4
@TheZ นั่นเป็นเพราะค่าสถานะสกปรกของอินพุตเป็นเท็จ ลองโต้ตอบกับอินพุต (ค่าสกปรกหลังจากที่ผู้ใช้ป้อนข้อมูล) แล้ว setAttribute
— Esailija

5
แต่เมื่อคุณต้องการรับ html ด้วย.html()ก็จะยังคงมีค่าเดิมอยู่ไม่สำคัญว่าคุณจะใช้.val('new value')หรือattr('value', 'new value')... :(
— Legionar

6
รหัสฟังก์ชันจำนวนมากและซับซ้อนโดยใช้. val (ตามที่แนะนำโดยทุกสิ่งที่ฉันอ่านก่อนหน้านี้) และมีปัญหาเดียวกันนี้ น่ารำคาญ! คำตอบนี้ควรเป็นข้อเรียกร้องแรกสำหรับมือใหม่ jQuery ที่ต้องการอัปเดตองค์ประกอบของฟอร์มแบบไดนามิก จะช่วยฉันได้ไม่กี่ชั่วโมงถ้าฉันอ่านสิ่งนี้ก่อน!
— มอบให้

2
นี่คือเหตุผลว่าทำไมจึงเป็นเรื่องยากที่จะเริ่มต้นด้วย JavaScript / JQuery คำเตือนมากมายเช่นนี้ สิ่งนี้ช่วยฉันได้มาก ขอบคุณ!
— eaglei22

13

การเปลี่ยนคุณสมบัติค่าไม่ได้เปลี่ยนdefaultValue. ในโค้ด (เรียกด้วย.html()หรือinnerHTML) แอตทริบิวต์ value จะมีคุณสมบัติdefaultValueไม่ใช่ค่า


1
ที่อธิบายมัน การพิมพ์ยังไม่เปลี่ยน <input id = 'a' value> แต่จะส่งผลต่อผลลัพธ์ของ $ ("# a"). val () คำถามเพื่อให้แน่ใจ: $ ("# a"). val (value) เป็นวิธีที่ถูกต้องในการเปลี่ยนค่าขององค์ประกอบอินพุตเพื่อให้ส่งค่าที่ถูกต้องหรือไม่?
— Daniel Katz

1
ใช่ถูกต้อง การเปลี่ยนแอตทริบิวต์จะไม่เปลี่ยนแปลงสิ่งที่ส่ง
— Kevin B

8

เพื่อขยายความเกี่ยวกับคำตอบของ Ricardo: https://stackoverflow.com/a/11873775/7672426

http://api.jquery.com/val/#val2

เกี่ยวกับ val ()

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


2

นี่เป็นเพียงสถานการณ์ที่อาจเกิดขึ้นกับฉัน ถ้ามันช่วยใครบางคนได้ดี: ฉันเขียนแอพที่ซับซ้อนซึ่งอยู่ที่ไหนสักแห่งตามรหัสฉันใช้ฟังก์ชันเพื่อล้างค่ากล่องข้อความทั้งหมดก่อนที่จะแสดง บางครั้งต่อมาฉันพยายามตั้งค่ากล่องข้อความโดยใช้ jquery val ('value') แต่ฉันไม่ได้สังเกตว่าหลังจากนั้นฉันก็เรียกใช้เมธอด ClearAllInputs .. ดังนั้นสิ่งนี้อาจเกิดขึ้นได้


1
$('#link').prop('value', 'new value');

คำอธิบาย: Attr จะทำงานบน jQuery 1.6 แต่ในขณะที่ jQuery 1.6.1 มีการเปลี่ยนแปลง ในกรณีส่วนใหญ่ prop () ทำสิ่งที่ attr () เคยทำ โดยทั่วไปการแทนที่การโทรไปยัง attr () ด้วย prop () ในโค้ดของคุณจะใช้งานได้ Attr จะให้ค่าขององค์ประกอบตามที่กำหนดไว้ใน html ในการโหลดเพจและ prop จะให้ค่าที่อัปเดตขององค์ประกอบซึ่งแก้ไขผ่าน jQuery


ลองอธิบายคำตอบของคุณด้วย
— Vinoth Krishnan

0

ปัญหาที่คล้ายกันของฉันเกิดจากการมีอักขระพิเศษ (เช่นจุด) ในตัวเลือก

การแก้ไขคือการหลีกเลี่ยงอักขระพิเศษ:

$("#dots\\.er\\.bad").val("mmmk");

1
เห็นด้วยแย่มากคุณไม่ควรหนีคุณควรเปลี่ยนชื่อรหัสขององค์ประกอบของคุณ
— webaholik

-1
<script src="//code.jquery.com/jquery.min.js"></script>
<script>
function changes() {
$('#link').val('new value');
}
</script>
<button onclick="changes()">a</button>
<input type='text' value='http://www.link.com' id='link'>

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

-1

สำหรับฉันปัญหาคือการเปลี่ยนค่าสำหรับฟิลด์นี้ไม่ได้ผล:

$('#cardNumber').val(maskNumber);

วิธีแก้ปัญหาข้างต้นไม่ได้ผลสำหรับฉันดังนั้นฉันจึงตรวจสอบเพิ่มเติมและพบว่า:

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

วิธีแก้ปัญหาคือการเพิ่มฟังก์ชันทริกเกอร์และทำให้เกิดเหตุการณ์การเปลี่ยนแปลงดังนี้:

$('#cardNumber').val(maskNumber).trigger('change');

-2

ตรวจสอบองค์ประกอบมากกว่าหนึ่งรายการด้วยรหัสที่ไม่ซ้ำกัน! นั่นคือสถานการณ์ของฉันกับ foreach loop และการทำซ้ำ id ของฉัน

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