J'utilise le plugin select2 dans une boîte de dialogue jquery mais cela ne fonctionne pas. Lors de la descente, la cible se déplace sur le contrôle d’entrée mais en sort immédiatement, ne me permettant pas de taper quoi que ce soit.
C'est le HTML:
<div id="asignar_servicio" title="Asignar servicios a usuarios">
<input type="hidden" class="bigdrop" id="a_per_id" />
</div>
Et voici le code javascript:
$( "#asignar_servicio" ).dialog({
autoOpen: false,
height: 500,
width: 450,
modal: true,
buttons: {
"Cancelar": function () {
$('#asignar_servicio').dialog('close');
}
}
});
$("#a_per_id").select2({
placeholder: "Busque un funcionario",
width: 400,
minimumInputLength: 4,
ajax: {
url: "@Url.Action("Search", "Personal")",
dataType: 'json',
data: function (term, page) {
return {
q: term,
page_limit: 10,
};
},
results: function (data, page) {
return { results: data.results };
}
}
}).on("change", function (e) {
var texto = $('lista_personal_text').val().replace(/ /g, '');
if (texto != '')
texto += ',';
texto += e.added.text;
var ids = $('lista_personal_id').val().replace(/ /g, '');
if (ids != '')
ids += ',';
ids += e.added.id;
});
J'ai ce même code dans une autre page et cela fonctionne.
Toute aide serait appréciée,
merci Jaime
J'ai trouvé cette solution de contournement. https://github.com/ivaynberg/select2/issues/1246
Vive Jame
le lien de jstuardo est bon, mais il y a beaucoup à parcourir sur cette page. Voici le code dont vous avez besoin:
$.ui.dialog.prototype._allowInteraction = function(e) {
return !!$(e.target).closest('.ui-dialog, .ui-datepicker, .select2-drop').length;
};
Ajoutez-le simplement à côté de l'endroit où vous définissez le menu déroulant select2.
Un moyen facile:
$.ui.dialog.prototype._allowInteraction = function (e) {
return true;
};
ajoutez ceci après ou vous avez choisi select2
Ou essayez ceci à partir de: Select2 ne fonctionne pas lorsqu'il est intégré à un modal d'amorçage
Supprimer tabindex="-1"
du div modal
La meilleure solution que j'ai trouvée consistait simplement à faire en sorte que le dialogue ne soit pas un dialogue modal en supprimant modal: true. Une fois que vous faites cela, la page fonctionnera comme vous le souhaitez.
Après un moment de lutte avec cela, j'ai trouvé une autre option qui vous permet de garder le dialogue comme modal. Si vous modifiez le css pour select2 comme suit:
.select2-drop {
z-index: 1013;
}
.select2-results {
z-index: 999;
}
.select2-result {
z-index: 1010;
}
gardez à l'esprit que cela fonctionne. Toutefois, si vous ouvrez de nombreux dialogues sur la même page, ils dépasseront éventuellement l'index z spécifié, mais dans mon cas d'utilisation, ces chiffres ont permis d'accomplir cette tâche.
Il existe une nouvelle version du correctif pour select2 4.0 à partir du fil de discussion github concernant ce problème :
if ($.ui && $.ui.dialog && $.ui.dialog.prototype._allowInteraction) {
var ui_dialog_interaction = $.ui.dialog.prototype._allowInteraction;
$.ui.dialog.prototype._allowInteraction = function(e) {
if ($(e.target).closest('.select2-dropdown').length) return true;
return ui_dialog_interaction.apply(this, arguments);
};
}
Il suffit d’exécuter cette opération avant de créer les boîtes de dialogue modales contenant select2.
Ajoutez ceci après votre déclaration select2 ().
$.ui.dialog.prototype._allowInteraction = function (e) {
return !!$(e.target).closest('.ui-dialog, .ui-datepicker, .select2-dropdown').length;
};
Pas assez de réputation pour commenter un post précédent, mais je voulais ajouter ce bout de code:
$('#dialogDiv').dialog({
title: "Create Dialog",
height: 410,
width: 530,
resizable: false,
draggable: false,
closeOnEscape: false,
//in order for select2 search to work "modal: true" cannot be present.
//modal: true,
position: "center",
open: function () { },
close: function () { $(this).dialog("distroy").remove(); }
});
$("#displaySelectTwo")select2();
La mise à jour vers les versions plus récentes de JQuery et Select2 n’est pas une option dans notre application pour le moment. (en utilisant JQueryUI v1.8 et Select2 v1)
Je pourrais résoudre ce problème en supprimant l'option "modal: true" des options de la boîte de dialogue.
Cela a bien fonctionné.
J'ai utilisé le correctif suivant avec succès:
$.fn.modal.Constructor.prototype.enforceFocus = function () {
var that = this;
$(document).on('focusin.modal', function (e) {
if ($(e.target).hasClass('select2-input')) {
return true;
}
if (that.$element[0] !== e.target && !that.$element.has(e.target).length) {
that.$element.focus();
}
});
}