Изменение jQuery .val не меняет входное значение

103

У меня есть ввод HTML со ссылкой в ​​значении.

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

Я использую jQuery для изменения значения определенного события.

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

Приведенный выше код изменяет значение текстового поля, но не меняет значение в коде (value = 'http://www.link.com' остается без изменений). Мне также нужно изменить значение = ''.

Лукас
источник
Что вы имеете в виду in the code? Вы смотрите на исходный (т.е. немодифицированный) источник страницы?
Фредерик Хамиди
Использование элемента проверки Chrome.
Лукас
3
@Luke Значение изменится, но видимое значение элемента HTML в инспекторе Chrome не изменится. Затем попробуйте предупредить значение или вывести его на консоль, и вы увидите, что оно изменилось. Смотрите, это изменилось: jsfiddle.net/a8SxF
TheZ 08
Да, теперь я это вижу. Я использую zClip для копирования значения в буфер обмена, но он копирует старое значение после его изменения. Я думаю, что смогу исправить это, немного повозившись.
Лукас
1
возможный дубликат метода html () неверен при изменении входного значения
Esailija 08

Ответы:

180

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свойство value, а не свойство value.

Кевин Б.
источник
1
Что объясняет его. Ввод также не меняет значение <input id = 'a'>, но влияет на результат $ ("# a"). Val (). Вопрос на всякий случай: действительно ли $ ("# a"). Val (value) - это правильный способ изменить значение входного элемента, чтобы было отправлено правильное значение?
Дэниел Кац
1
Да, это правильно. изменение атрибута не изменит то, что отправляется.
Kevin B
8

чтобы немного расширить ответ Рикардо: https://stackoverflow.com/a/11873775/7672426

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

о val ()

Установка значений с помощью этого метода (или использования собственного свойства значения) не вызывает отправку события изменения. По этой причине соответствующие обработчики событий не будут выполняться. Если вы хотите выполнить их, вы должны вызвать .trigger ("изменить") после установки значения.

Лэндан Джексон
источник
2

Это всего лишь возможный сценарий, который случился со мной. Что ж, если это кому-то поможет, тогда отлично: я написал сложное приложение, в котором где-то в коде я использовал функцию для очистки всех значений текстовых полей перед их отображением. Некоторое время спустя я попытался установить значение текстового поля с помощью jquery val ('value'), но я не заметил, что сразу после этого я вызвал метод ClearAllInputs ... так что это тоже могло произойти.

Амира
источник
1
$('#link').prop('value', 'new value');

Объяснение: Attr будет работать с jQuery 1.6, но с jQuery 1.6.1 все изменилось. В большинстве случаев prop () делает то, что раньше делал attr (). Замена вызовов attr () на prop () в вашем коде обычно работает. Attr предоставит вам значение element, как оно было определено в html при загрузке страницы, а prop дает обновленные значения элементов, которые изменяются с помощью jQuery.

Рауль
источник
Попробуйте также объяснить свой ответ
Винот Кришнан,
0

Моя аналогичная проблема была вызвана наличием в селекторе специальных символов (например, точек).

Исправление заключалось в том, чтобы избежать специальных символов:

$("#dots\\.er\\.bad").val("mmmk");
WiredIn
источник
Согласен, очень плохо, вы не должны сбегать, вы должны переименовать свой идентификатор элемента.
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);

Ни одно из приведенных выше решений не помогло мне, поэтому я продолжил исследование и обнаружил:

Согласно спецификации события уровня 2 DOM: событие изменения происходит, когда элемент управления теряет фокус ввода и его значение было изменено с момента получения фокуса. Это означает, что событие изменения запускается при изменении при взаимодействии с пользователем. Программные изменения не вызывают запуск этого события.

Решением было добавить функцию триггера и заставить ее запускать событие изменения следующим образом:

$('#cardNumber').val(maskNumber).trigger('change');
Иван Янчич
источник
-2

Дважды проверьте наличие более одного элемента с неуникальным идентификатором! Это была моя ситуация с циклом foreach и дублированием моих идентификаторов.

Стефан Павлов
источник