jQuery .val thay đổi không thay đổi giá trị đầu vào


103

Tôi có một đầu vào HTML với một liên kết trong giá trị.

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

Tôi đang sử dụng jQuery để thay đổi giá trị trên một sự kiện nhất định.

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

Đoạn mã trên thay đổi giá trị của hộp văn bản nhưng không thay đổi giá trị trong mã (giá trị = 'http://www.link.com' không thay đổi). Tôi cũng cần giá trị = '' để thay đổi.


Ý bạn là in the codegì Bạn có đang xem nguồn gốc (do đó, chưa sửa đổi) của trang không?
Frédéric Hamidi

Sử dụng phần tử kiểm tra của Chrome.
Lukas

3
@Luke Giá trị sẽ thay đổi, nhưng giá trị hiển thị của phần tử HTML trong trình kiểm tra của Chrome thì không. Sau đó, hãy thử thông báo giá trị hoặc xuất nó ra bảng điều khiển và bạn sẽ thấy nó đã thay đổi. Hãy xem, nó đã thay đổi: jsfiddle.net/a8SxF
TheZ

Vâng, tôi thấy điều đó ngay bây giờ. Tôi đang sử dụng zClip để sao chép giá trị vào khay nhớ tạm nhưng nó đang sao chép giá trị cũ sau khi nó đã thay đổi. Tôi nghĩ rằng tôi có thể sửa chữa nó với một chút lộn xộn xung quanh.
Lukas

Câu trả lời:


177

Sử dụng attrthay thế.
$('#link').attr('value', 'new value');

bản giới thiệu


6
Điều này hoàn toàn chính xác, bằng cách sử dụng setAttributehoặc jQuery, attrbạn cũng sẽ ảnh hưởng đến giá trị của phần tử DOM: jsfiddle.net/a8SxF/1
TheZ

4
@TheZ đó là do cờ giá trị bẩn của đầu vào là sai. Thử tương tác với đầu vào (giá trị bị bẩn sau khi người dùng nhập) và sau đó setAttribute
Esailija

5
Nhưng khi bạn muốn lấy html bằng .html(), thì vẫn có giá trị cũ như cũ, không thành vấn đề, nếu bạn sử dụng .val('new value')hoặc attr('value', 'new value')... :(
Legionar

6
Đã mã hóa một loạt các hàm lớn và phức tạp bằng cách sử dụng .val (như được đề xuất bởi mọi thứ tôi đã đọc trước đây) và gặp vấn đề chính xác này. Khó chịu đẫm máu! Câu trả lời này nên là điểm đầu tiên cho bất kỳ người mới jQuery nào muốn cập nhật động các phần tử biểu mẫu. Sẽ giúp tôi tiết kiệm được vài giờ nếu tôi đọc nó trước!
Grant

2
Đây là lý do tại sao rất khó để bắt đầu chạy với JavaScript / JQuery, rất nhiều cảnh báo như thế này. Điều này đã giúp tôi rất nhiều. Cảm ơn bạn!
Eaglei22

13

Thay đổi thuộc tính giá trị không thay đổi defaultValue. Trong mã (được truy xuất bằng .html()hoặc innerHTML), thuộc tính value sẽ chứa thuộc tính value defaultValue, không phải thuộc tính value.


1
Giải thích nó. Việc nhập cũng không thay đổi giá trị <input id = 'a'> nhưng ảnh hưởng đến kết quả của $ ("# a"). Val (). Một câu hỏi chỉ để chắc chắn: $ ("# a"). Val (value) có thực sự là cách chính xác để thay đổi giá trị của phần tử đầu vào, để giá trị phù hợp sẽ được gửi không?
Daniel Katz,

1
Vâng, điều đó là chính xác. thay đổi thuộc tính sẽ không thay đổi những gì đang được gửi.
Kevin B

8

để mở rộng một chút về câu trả lời của Ricardo: https://stackoverflow.com/a/11873775/7672426

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

về val ()

Việc đặt giá trị bằng phương pháp này (hoặc sử dụng thuộc tính giá trị gốc) không gây ra sự kiện thay đổi. Vì lý do này, các trình xử lý sự kiện có liên quan sẽ không được thực thi. Nếu bạn muốn thực thi chúng, bạn nên gọi .trigger ("thay đổi") sau khi thiết lập giá trị.


2

Đây chỉ là một kịch bản có thể xảy ra với tôi. Chà nếu nó giúp ích cho ai đó thì thật tuyệt: Tôi đã viết một ứng dụng phức tạp mà ở đâu đó dọc theo đoạn mã, tôi đã sử dụng một chức năng để xóa tất cả các giá trị hộp văn bản trước khi hiển thị chúng. Đôi khi sau đó, tôi đã cố gắng đặt giá trị hộp văn bản bằng jquery val ('value') nhưng tôi không nhận thấy rằng ngay sau đó tôi đã gọi phương thức ClearAllInputs .. vì vậy, điều này cũng có thể xảy ra.


0

Vấn đề tương tự của tôi là do có các ký tự đặc biệt (ví dụ: dấu chấm) trong bộ chọn.

Cách khắc phục là thoát các ký tự đặc biệt:

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

Đồng ý, rất tệ, bạn không nên thoát, bạn nên đổi tên id phần tử của mình.
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
Vâng, điều này không cập nhật giá trị thực tế. Nó cập nhật hộp văn bản trên màn hình, nhưng khi bạn cố gắng gửi một biểu mẫu, giá trị là bất kỳ giá trị nào khi trang được tải ban đầu.
Grant

-1

Đối với tôi, vấn đề là việc thay đổi giá trị cho trường này không hoạt động:

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

Không có giải pháp nào ở trên phù hợp với tôi vì vậy tôi đã điều tra thêm và nhận thấy:

Theo Đặc tả sự kiện cấp độ 2 của DOM: Sự kiện thay đổi xảy ra khi một điều khiển mất tiêu điểm đầu vào và giá trị của nó đã được sửa đổi kể từ khi đạt được tiêu điểm. Điều đó có nghĩa là sự kiện thay đổi đó được thiết kế để kích hoạt sự thay đổi bằng cách tương tác của người dùng. Các thay đổi có lập trình không làm cho sự kiện này bị kích hoạt.

Giải pháp là thêm chức năng kích hoạt và khiến nó kích hoạt sự kiện thay đổi như sau:

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

-2

Kiểm tra kỹ để tìm nhiều hơn một phần tử có id không phải là duy nhất! Đó là tình huống của tôi với vòng lặp foreach và sao chép id của tôi.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.