A mudança do jQuery .val não altera o valor de entrada

103

Eu tenho uma entrada HTML com um link no valor.

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

Estou usando o jQuery para alterar o valor de um determinado evento.

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

O código acima altera o valor da caixa de texto, mas não altera o valor no código (value = 'http://www.link.com' permanece inalterado). Eu preciso que o valor = '' mude também.

Lukas
fonte
O que você quer dizer com in the code? Você está olhando para a fonte original (portanto, não modificada) da página?
Frédéric Hamidi
Usando o elemento de inspeção do Chrome.
Lukas
3
@Luke O valor mudará, mas o valor visível do elemento HTML no inspetor do Chrome não. Tente alertar o valor ou enviá-lo para o console e você verá que ele mudou. Veja, mudou: jsfiddle.net/a8SxF
TheZ
Sim, eu vejo isso agora. Estou usando o zClip para copiar o valor para a área de transferência, mas está copiando o valor antigo depois de ser alterado. Acho que posso consertar com um pouco de bagunça.
Lukas

Respostas:

177

Use em seu attrlugar.
$('#link').attr('value', 'new value');

demo

Ricardo Alvaro Lohmann
fonte
6
Isso é totalmente correto, usando setAttributeou jQuery attrvocê também afetará o valor do elemento DOM: jsfiddle.net/a8SxF/1
TheZ
4
@TheZ é porque o sinalizador de valor incorreto da entrada é falso. Tente interagir com a entrada (o valor fica incorreto após a entrada do usuário) e, em seguida, setAttribute
Esailija
5
Mas quando você quiser obter html com .html(), então ainda haverá o mesmo valor antigo, não importa, se você usar .val('new value')ou attr('value', 'new value')... :(
Legionar
6
Codifiquei um monte de funções enormes e complicadas usando .val (como sugerido por tudo que li anteriormente) e tive exatamente o mesmo problema. Muito irritante! Esta resposta deve ser o primeiro ponto de chamada para qualquer novato em jQuery que esteja procurando atualizar os elementos do formulário dinamicamente. Teria me poupado algumas horas se eu lesse isso primeiro!
Grant
2
É por isso que é tão difícil começar a trabalhar com JavaScript / JQuery, tantas advertências como essa. Isso me ajudou muito. Obrigado!
eaglei22
13

Alterar a propriedade value não altera o defaultValue. No código (recuperado com .html()ou innerHTML), o atributo de valor conterá a propriedade defaultValue, não a de valor.

Kevin B
fonte
1
Isso explica tudo. A digitação também não altera o valor de <input id = 'a'> mas afeta o resultado de $ ("# a"). Val (). Uma pergunta apenas para ter certeza: $ ("# a"). Val (value) é realmente a maneira correta de alterar o valor de um elemento de entrada, de modo que o valor correto seja enviado?
Daniel Katz
1
Sim, está correto. alterar o atributo não alterará o que está sendo enviado.
Kevin B
8

para expandir um pouco a resposta de Ricardo: https://stackoverflow.com/a/11873775/7672426

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

sobre val ()

Definir valores usando este método (ou usando a propriedade de valor nativo) não causa o despacho do evento de mudança. Por esse motivo, os tratadores de evento relevantes não serão executados. Se você quiser executá-los, deve chamar .trigger ("alterar") após definir o valor.

Landan Jackson
fonte
2

Este é apenas um cenário possível que aconteceu comigo. Bem, se isso ajuda alguém, ótimo: eu escrevi um aplicativo complicado que em algum lugar ao longo do código usei uma função para limpar todos os valores das caixas de texto antes de mostrá-los. Algum tempo depois, tentei definir um valor de caixa de texto usando jquery val ('valor'), mas não percebi que logo depois invoquei o método ClearAllInputs ... então, isso também pode acontecer.

amira
fonte
0

Meu problema semelhante foi causado por ter caracteres especiais (por exemplo, pontos) no seletor.

A solução foi escapar dos caracteres especiais:

$("#dots\\.er\\.bad").val("mmmk");
WiredIn
fonte
Concordo, muito ruim, você não deve escapar, você deve renomear o id do seu elemento.
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'>
ikerya
fonte
1
Sim, isso não atualiza o valor real. Ele atualiza a caixa de texto na tela, mas quando você tenta enviar um formulário, o valor é o que era quando a página foi carregada originalmente.
Grant
-1

Para mim, o problema era que alterar o valor deste campo não funcionou:

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

Nenhuma das soluções acima funcionou para mim, então investiguei mais e descobri:

De acordo com a Especificação de Evento DOM Nível 2: O evento de mudança ocorre quando um controle perde o foco de entrada e seu valor foi modificado desde que ganhou o foco. Isso significa que o evento de mudança é projetado para disparar na mudança pela interação do usuário. As alterações programáticas não fazem com que este evento seja disparado.

A solução foi adicionar a função de gatilho e fazer com que ela acione o evento de mudança como este:

$('#cardNumber').val(maskNumber).trigger('change');
Ivan Jancic
fonte
-2

Verifique novamente se há mais de um elemento com id não exclusivo! Essa era a minha situação com loop foreach e duplicação dos meus ids.

Stefan Pavlov
fonte