当不在jquery模式对话框中时,select2插件工作正常

时间:2013-06-06 15:22:12

标签: dialog jquery-select2

我在jquery对话框中使用select2插件但是没有用。下降时,焦点移动到输入控件但立即离开它,不允许我输入任何内容。

这是HTML:

<div id="asignar_servicio" title="Asignar servicios a usuarios">
    <input type="hidden" class="bigdrop" id="a_per_id" />
</div>

这是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;
        });

我在其他页面中使用相同的代码并且它可以正常工作。

任何帮助将不胜感激,

感谢 海梅

11 个答案:

答案 0 :(得分:25)

jstuardo的链接很好,但在该页面上有很多要筛选的内容。这是您需要的代码:

$.ui.dialog.prototype._allowInteraction = function(e) {
    return !!$(e.target).closest('.ui-dialog, .ui-datepicker, .select2-drop').length;
};

只需将其添加到您设置select2下拉列表的任何位置旁边。

答案 1 :(得分:9)

一种简单的方法:

$.ui.dialog.prototype._allowInteraction = function (e) {
    return true;
};

在您设置select2

之后添加此项

答案 2 :(得分:5)

或者试试这个: Select2 doesn't work when embedded in a bootstrap modal

从模态div中删除tabindex="-1"

答案 3 :(得分:3)

我找到了这个解决方法。 https://github.com/ivaynberg/select2/issues/1246

干杯 詹姆斯

答案 4 :(得分:2)

我找到的最佳解决方案是通过删除modal:true来使对话框不是模态对话框。完成此操作后,页面将按照需要运行。

经过一段时间与此争斗后,我找到了另一个选项,允许您将对话框保持为模态。如果您将select2的css修改为以下内容:

 .select2-drop {
    z-index: 1013;
}

.select2-results {
    z-index: 999;
}

.select2-result {
    z-index: 1010;
}

请记住,如果你在同一页面上打开很多对话框,它最终会超过指定的z-index,但是在我的用例中这些数字完成了工作。

答案 5 :(得分:1)

没有足够的声誉来评论之前的帖子,但我想添加这段代码:

 $('#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();

目前,我们的应用程序中无法更新到更新版本的JQuery和Select2。 (使用JQueryUI v1.8和Select2 v1)

答案 6 :(得分:1)

在select2()声明后添加。

$.ui.dialog.prototype._allowInteraction = function (e) {
    return !!$(e.target).closest('.ui-dialog, .ui-datepicker, .select2-dropdown').length;
};

答案 7 :(得分:1)

github issue thread about this problem中有一个针对select2 4.0的新修补程序:

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

在创建其中包含select2的任何模态对话框之前运行它。

JSFiddle of this fix in action

答案 8 :(得分:0)

我成功使用了以下修复程序:

$.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();
            }
        });
    }

答案 9 :(得分:0)

我可以通过从对话框选项中删除选项:'modal:true'来解决这个问题 它运作良好。

答案 10 :(得分:0)

对于那些对Select2 v4.0.12感到困惑的人

我正在使用Select2选项dropdownParent

我设置了dropDownParent值,但仍然有问题。

dropdownParent: $("#ReportFilterDialog")

为我修复的问题是将值设置为选择模态对话框的外层:

dropdownParent: $("#ReportFilterDialog").parent()