O que eu quero alcançar é que, sempre que o <select>
menu suspenso for alterado, desejo o valor do menu suspenso antes da alteração. Estou usando a versão 1.3.2 do jQuery e usando o evento change, mas o valor que estou recebendo lá é após a alteração.
<select name="test">
<option value="stack">Stack</option>
<option value="overflow">Overflow</option>
<option value="my">My</option>
<option value="question">Question</option>
</select>
Vamos dizer que atualmente a opção My está selecionada agora quando eu a altero para empilhar no evento onchange (ou seja, quando eu mudei para empilhar) eu quero o valor anterior, ou seja, o meu esperado neste caso.
Como isso pode ser alcançado?
Editar: no meu caso, estou tendo várias caixas de seleção na mesma página e quero que a mesma coisa seja aplicada a todas elas. Além disso, todos os meus select são inseridos após o carregamento da página através do ajax.
javascript
jquery
jquery-events
Alpesh
fonte
fonte
Respostas:
Combine o evento de foco com o evento de mudança para alcançar o que deseja:
Exemplo de trabalho: http://jsfiddle.net/x5PKf/766
fonte
$(this).blur();
no fim da função de mudançanão use uma var global para isso - armazene o valor anterior nos dados. Aqui está um exemplo: http://jsbin.com/uqupu3/2/edit
o código para ref:
acabei de ver que você tem muitas seleções na página - essa abordagem também funcionará para você, pois para cada seleção você armazenará o valor anterior nos dados da seleção
fonte
jQuery.data
qualquer maneira.select
! A resposta aceita vai quebrar como ele corresponde a todosselect
mas apenas armazena o valor da primeira.data
é a melhor maneira de fazer isso. +1 :)Eu vou para a solução de Avi Pinto que usa
jquery.data()
Usar o foco não é uma solução válida. Funciona na primeira vez que você altera as opções, mas se você permanecer nesse elemento selecionado, pressione a tecla "para cima" ou "para baixo". Não passará pelo evento de foco novamente.
Portanto, a solução deve ser mais parecida com a seguinte,
fonte
var $selectStatus = $('.my-select'); $selectStatus.on('change', function () { var newStatus = $(this).val(); var oldStatus = $(this).data('pre'); }).data('pre', $selectStatus.val());
$('mySelect').data('pre', $(this).val());
Deve ser como:$('mySelect').each(function() { $(this).data('pre', $(this).val()); });
Eu não tenho reputação suficiente para editar a resposta: /Acompanhe o valor manualmente.
fonte
fonte
Estou usando o evento "ao vivo", minha solução é basicamente semelhante ao Dimitiar, mas, em vez de usar o "foco", meu valor anterior é armazenado quando o "clique" é acionado.
fonte
mantenha o valor suspenso atualmente selecionado com o jquery escolhido em uma variável global antes de escrever a função de ação suspensa 'on change'. Se você deseja definir o valor anterior na função, pode usar a variável global.
fonte
Que tal usar um evento jQuery personalizado com uma interface do tipo de relógio angular;
fonte
Eu sei que esse é um tópico antigo, mas achei que poderia acrescentar um pouco mais. No meu caso, eu queria passar o texto, val e alguns outros dados attr. Nesse caso, é melhor armazenar toda a opção como um valor anterior, em vez de apenas o valor.
Exemplo de código abaixo:
EDITAR:
Esqueci de adicionar .clone () ao elemento. ao não fazer isso, quando você tenta recuperar os valores, acaba puxando a nova cópia do select em vez da anterior. O uso do método clone () armazena uma cópia do select em vez de uma instância dele.
fonte
Bem, por que você não armazena o valor selecionado atual e, quando o item selecionado é alterado, o valor antigo é armazenado? (e você pode atualizá-lo novamente como desejar)
fonte
Use o código a seguir, eu testei e seu funcionamento
fonte
fonte
Eu gostaria de contribuir com outra opção para resolver esse problema; uma vez que as soluções propostas acima não resolveram o meu cenário.
Isso usa jQuery para que def. é uma dependência aqui, mas isso pode ser adaptado para funcionar em javascript puro. (Adicione um ouvinte ao corpo, verifique se o destino original era uma função de seleção, execução, ...).
Ao anexar o ouvinte de alterações ao corpo, você pode ter certeza de que isso será acionado após ouvintes específicos para as seleções; caso contrário, o valor de 'data-previous' será substituído antes que você possa lê-lo.
Obviamente, isso pressupõe que você prefere usar ouvintes separados para o valor definido anteriormente e o valor de verificação. Ele se encaixa perfeitamente no padrão de responsabilidade única.
Nota: Isso adiciona essa funcionalidade 'anterior' a todas as seleções; portanto, faça o ajuste fino dos seletores, se necessário.
fonte
Esta é uma melhoria na resposta @thisisboris. Ele adiciona um valor atual aos dados, para que o código possa controlar quando uma variável definida para o valor atual é alterada.
fonte
Melhor solução:
fonte
Existem várias maneiras de alcançar o resultado desejado, esta é a minha humilde maneira de fazê-lo:
Deixe o elemento manter seu valor anterior, então adicione um atributo 'previousValue'.
Depois de inicializado, 'previousValue' agora poderia ser usado como um atributo. Em JS, para acessar o valor anterior deste, selecione:
Depois de terminar de usar 'previousValue', atualize o atributo para o valor atual.
fonte
Eu precisava revelar uma div diferente com base na seleção
É assim que você pode fazer isso com a sintaxe jquery e es6
HTML
JS
fonte