Ce que je veux réaliser, c'est que chaque fois que la <select>
liste déroulante est modifiée, je veux la valeur de la liste déroulante avant le changement. J'utilise la version 1.3.2 de jQuery et j'utilise l'événement on change, mais la valeur que j'obtiens là-bas est après le changement.
<select name="test">
<option value="stack">Stack</option>
<option value="overflow">Overflow</option>
<option value="my">My</option>
<option value="question">Question</option>
</select>
Disons que l'option actuellement My est sélectionnée maintenant lorsque je la change en pile dans l'événement onchange (c'est-à-dire quand je la change en pile) Je veux que sa valeur précédente soit ma attendue dans ce cas.
Comment cela peut il etre accompli?
Edit: Dans mon cas, j'ai plusieurs cases de sélection sur la même page et je veux que la même chose soit appliquée à toutes. De plus, toutes mes sélections sont insérées après le chargement de la page via ajax.
la source
Réponses:
Combinez l' événement focus avec l' événement change pour obtenir ce que vous voulez:
Exemple de travail: http://jsfiddle.net/x5PKf/766
la source
$(this).blur();
à la fin de la fonction de changementveuillez ne pas utiliser de var globale pour cela - stockez la valeur précédente dans les données voici un exemple: http://jsbin.com/uqupu3/2/edit
le code pour ref:
vient de voir que vous avez de nombreux choix sur la page - cette approche fonctionnera également pour vous car pour chaque sélection, vous stockerez la valeur précédente sur les données de la sélection
la source
jQuery.data
toute façon.select
! La réponse acceptée sera rompue car elle correspond à tous,select
mais ne stocke que la valeur de la première.data
est la meilleure façon de le faire. +1 :)Je choisis la solution d'Avi Pinto qui utilise
jquery.data()
L'utilisation de focus n'est pas une solution valable. Cela fonctionne la première fois que vous modifiez les options, mais si vous restez sur cet élément de sélection, et appuyez sur la touche "haut" ou "bas". Il ne passera plus par l'événement focus.
Donc, la solution devrait ressembler davantage à ce qui suit,
la source
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());
Cela devrait être comme:$('mySelect').each(function() { $(this).data('pre', $(this).val()); });
Je n'ai pas assez de réputation pour éditer la réponse: /Suivez la valeur à la main.
la source
la source
J'utilise l'événement "live", ma solution est fondamentalement similaire à Dimitiar, mais au lieu d'utiliser "focus", ma valeur précédente est stockée lorsque "click" est déclenché.
la source
conservez la valeur déroulante actuellement sélectionnée avec jquery choisi dans une variable globale avant d'écrire la fonction d'action déroulante 'on change'. Si vous souhaitez définir la valeur précédente dans la fonction, vous pouvez utiliser la variable globale.
la source
Que diriez-vous d'utiliser un événement jQuery personnalisé avec une interface de type montre angulaire;
la source
Je sais que c'est un vieux fil, mais j'ai pensé pouvoir ajouter un petit plus. Dans mon cas, je voulais transmettre le texte, val et quelques autres données attr. Dans ce cas, il vaut mieux stocker toute l'option en tant que valeur précédente plutôt que juste la valeur.
Exemple de code ci-dessous:
ÉDITER:
J'ai oublié d'ajouter .clone () sur l'élément. à ne pas le faire lorsque vous essayez de retirer les valeurs que vous finissez par extraire la nouvelle copie de la sélection plutôt que la précédente. L'utilisation de la méthode clone () stocke une copie de la sélection au lieu d'une instance de celle-ci.
la source
Eh bien, pourquoi ne stockez-vous pas la valeur sélectionnée actuelle, et lorsque l'élément sélectionné est modifié, vous conserverez l'ancienne valeur? (et vous pouvez le mettre à jour à votre guise)
la source
Utilisez le code suivant, je l'ai testé et son fonctionnement
la source
la source
Je voudrais contribuer une autre option pour résoudre ce problème; car les solutions proposées ci-dessus n'ont pas résolu mon scénario.
Cela utilise jQuery pour que def. est une dépendance ici, mais cela peut être adapté pour fonctionner en javascript pur. (Ajoutez un écouteur au corps, vérifiez si la cible d'origine était une fonction select, execute, ...).
En attachant l'écouteur de modification au corps, vous pouvez être sûr que cela se déclenchera après des écouteurs spécifiques pour les sélections, sinon la valeur de 'data-previous' sera écrasée avant même que vous ne puissiez la lire.
Cela suppose bien sûr que vous préférez utiliser des écouteurs séparés pour votre valeur précédente et votre valeur de contrôle. Cela correspond parfaitement au modèle de responsabilité unique.
Remarque: Cela ajoute cette fonctionnalité «précédente» à toutes les sélections, veillez donc à affiner les sélecteurs si nécessaire.
la source
Il s'agit d'une amélioration par rapport à la réponse @thisisboris. Il ajoute une valeur actuelle aux données, afin que le code puisse contrôler quand une variable définie sur la valeur actuelle est modifiée.
la source
Meilleure solution:
la source
Il existe plusieurs façons d'atteindre le résultat souhaité, c'est ma façon humble de le faire:
Laissez l'élément conserver sa valeur précédente, alors ajoutez un attribut 'previousValue'.
Une fois initialisé, «previousValue» pouvait désormais être utilisé comme attribut. Dans JS, pour accéder à la valeur précédente de cette sélection:
Une fois que vous avez terminé d'utiliser «previousValue», mettez à jour l'attribut à sa valeur actuelle.
la source
Je devais révéler un div différent en fonction de la sélection
Voici comment vous pouvez le faire avec la syntaxe jquery et es6
HTML
JS
la source