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.


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


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.


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


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.


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");

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'>

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');

-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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.