J'ai un problème avec Select2 de jQuery.
Lorsque la page se charge, si O clique sur le résultat de la recherche, elle sélectionnera et déclenchera la modification de l'événement, mais seulement la première fois.
Si je cherche une autre fois, ce ne sera pas le cas.
Voici mon code (c'est une recherche basée sur Ajax):
jQuery('#search_code').select2({
'width': '600px',
'tokenSeparators': [',', ' '],
'closeOnSelect': false,
'placeholder': 'scan or type a SKU or product or ESN',
'minimumInputLength': 1,
'ajax': {
'url': 'lookProduct',
'dataType': 'json',
'type': 'POST',
'data': function (term, page) {
return {
barcode: term,
page_limit: 3,
page: page
};
},
'results': function (data, page) {
return {
results: data
};
}
}
}).on('change', function (e) {
var str = $("#s2id_search_code .select2-choice span").text();
DOSelectAjaxProd(this.value, str);
//this.value
}).on('select', function (e) {
console.log("select");
});
Voici ce que j'utilise:
$("#search_code").live('change', function(){
alert(this.value)
});
Pour les derniers utilisateurs de jQuery, celui-ci devrait fonctionner:
$(document.body).on("change","#search_code",function(){
alert(this.value);
});
Apparemment, l'événement de changement n'est pas déclenché si une sélection existe déjà lors de l'utilisation des données. J'ai fini par mettre à jour les données manuellement sur select pour résoudre le problème.
$("#search_code").on("select2-selecting", function(e) {
$("#search_code").select2("data",e.choice);
});
Je sais que c'est assez tard mais j'espère que cette réponse fera gagner du temps aux autres.
Depuis version 4.0. , des événements tels que select2-selecting
, ne fonctionne plus. Ils sont renommés comme suit:
- select2-close est maintenant select2: close
- select2-open est maintenant select2: open
- select2-Opening est maintenant Select2: Opening
- select2-selection est maintenant select2: selection
- select2-supprimé est maintenant select2: supprimé
- select2-remove est maintenant select2: unselecting
Réf: https://select2.org/programmatic-control/events
(function($){
$('.select2').select2();
$('.select2').on('select2:selecting', function(e) {
console.log('Selecting: ' , e.params.args.data);
});
})(jQuery);
body{
font-family: sans-serif;
}
.select2{
width: 100%;
}
<link href="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.3/css/select2.min.css" rel="stylesheet">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.3/js/select2.full.min.js"></script>
<select class="select2" multiple="multiple">
<option value="1">Option 1</option>
<option value="2">Option 2</option>
<option value="3">Option 3</option>
<option value="4">Option 4</option>
<option value="5">Option 5</option>
<option value="6">Option 6</option>
<option value="7">Option 7</option>
</select>
$('#search_code').select2({
.
.
.
.
}).on("change", function (e) {
var str = $("#s2id_search_code .select2-choice span").text();
DOSelectAjaxProd(e.val, str);
});
Cela est dû au fait que l'ID des articles est le même. Le changement ne se déclenche que si un identifiant d'élément différent est détecté lors de la sélection.
Vous avez donc 2 options: La première consiste à vous assurer que chaque élément a un identifiant unique lors de la récupération des données depuis ajax.
La seconde consiste à déclencher un nombre Rand à formatSelection pour l'élément sélectionné.
function getRandomInt(min, max) {
return Math.floor(Math.random() * (max - min + 1)) + min;
}
.
formatSelection: function(item) {item.id =getRandomInt(1,200)}
Définissez votre .on
écouteur pour rechercher des événements select2 spécifiques. L'événement "change" est le même que d'habitude mais les autres sont spécifiques au contrôle select2 donc:
Les noms sont explicites. Par exemple, select2-focus
se déclenche lorsque vous concentrez le contrôle.
Mon élément select2 ne déclenchait pas l'événement onchange
car la liste déroulante ne proposait qu'une seule valeur, ce qui rend impossible la modification de la valeur.
La valeur n'ayant pas changé, aucun événement n'a été déclenché et le gestionnaire n'a pas pu s'exécuter.
J'ai ensuite ajouté un autre gestionnaire pour effacer la valeur, avec le select2-open
gestionnaire en cours d'exécution avant le gestionnaire onchange
.
Le code source ressemble maintenant à:
el.on("select2-open", function(e) {
$(this).val('');
});
el.on('change', function() {
...
});
Le premier gestionnaire efface la valeur, permettant au deuxième gestionnaire de se déclencher même s'il sélectionne la même valeur.