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.