384

当我在引导模式中使用 select2(输入)时,我无法在其中输入任何内容。好像是残疾人?在模态 select2 之外工作正常。

在此处输入图像描述

工作示例:http: //jsfiddle.net/byJy8/1/ 代码:

<!-- Modal -->
<div id="myModal" class="modal hide fade" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
    <div class="modal-header">
        <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
        <h3 id="myModalLabel">Panel</h3>
    </div>
    <div class="modal-body" style="max-height: 800px">          
      <form class="form-horizontal">
        <!-- Text input-->
        <div class="control-group">
            <label class="control-label" for="vdn_number">Numer</label>
            <div class="controls">
                <!-- seleect2 -->
                <input name="vdn_number" type="hidden" id="vdn_number"  class="input-large" required=""  />
            </div>
        </div>
      </form>    
    </div>
    <div class="modal-footer">
        <button class="btn" data-dismiss="modal" aria-hidden="true">Close</button>
        <button class="btn btn-primary">Save changes</button>
    </div>
</div>

JS

$("#vdn_number").select2({
    placeholder: "00000",
    minimumInputLength: 2,
    ajax: {
        url: "getAjaxData/",
        dataType: 'json',
        type: "POST",
        data: function (term, page) {
            return {
                q: term, // search term
                col: 'vdn'
            };
        },
        results: function (data) { // parse the results into the format expected by Select2.
            // since we are using custom formatting functions we do not need to alter remote JSON data
            return {results: data};
        }
    }
});

答案:

在这里你可以找到一个快速修复

这是“正确的方法”:Select2 在嵌入引导模式时不起作用

4

34 回答 34

671

好的,我已经开始工作了。

改变

<div id="myModal" class="modal hide fade" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
    <div class="modal-header">
        <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
        <h3 id="myModalLabel">Panel</h3>
    </div>
    <div class="modal-body" style="max-height: 800px">

<div id="myModal" class="modal hide fade" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
    <div class="modal-header">
        <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
        <h3 id="myModalLabel">Panel</h3>
    </div>
    <div class="modal-body" style="max-height: 800px">

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

于 2013-08-28T12:07:07.490 回答
299

对于 Select2 v4:

用于dropdownParent将下拉菜单附加到模式对话框,而不是 HTML 正文。

<!-- Modal -->
<div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel">
  <div class="modal-dialog" role="document">
    <div class="modal-content">
      <div class="modal-header">
        <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
        <h4 class="modal-title" id="myModalLabel">Modal title</h4>
      </div>
      <div class="modal-body">
        <select id="select2insidemodal" multiple="multiple">
          <option value="AL">Alabama</option>
            ...
          <option value="WY">Wyoming</option>
        </select>
      </div>
      <div class="modal-footer">
        <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
        <button type="button" class="btn btn-primary">Save changes</button>
      </div>
    </div>
  </div>
</div>


<script>

$(document).ready(function() {
  $("#select2insidemodal").select2({
    dropdownParent: $("#myModal")
  });
});

</script>

这将附加 Select2 下拉列表,因此它位于模式的 DOM 中,而不是 HTML 正文(默认值)。见https://select2.org/dropdown#dropdown-placement

于 2015-11-24T01:53:17.207 回答
209

我在 github 上为 select2 找到了解决方案

https://github.com/ivaynberg/select2/issues/1436

对于引导程序 3,解决方案是:

$.fn.modal.Constructor.prototype.enforceFocus = function() {};

Bootstrap 4 将该enforceFocus方法重命名为_enforceFocus,因此您需要对其进行修补:

$.fn.modal.Constructor.prototype._enforceFocus = function() {};

从上面的链接复制的解释:

Bootstrap 为 focusin 事件注册了一个侦听器,该事件检查焦点元素是覆盖层本身还是它的后代——如果不是,它只是重新聚焦在覆盖层上。将 select2 下拉列表附加到正文,这有效地防止您在文本字段中输入任何内容。

您可以通过覆盖在模式上注册事件的 enforceFocus 函数来快速修复此问题

于 2013-10-24T18:46:18.807 回答
48

只需删除tabindex="-1"并添加样式overflow:hidden

这是一个例子:

<div id="myModal" class="modal fade" role="dialog" style="overflow:hidden;">
    <!---content modal here -->
</div>
于 2016-12-16T15:09:31.573 回答
39
.select2-close-mask{
    z-index: 2099;
}
.select2-dropdown{
    z-index: 3051;
}

这是我使用 select2 4.0.0 的解决方案。只需覆盖 select2.css 导入下方的 css。请确保 z-index 大于您的对话框或模式。我只是在默认值上添加 2000。因为我的对话框的 z-index 大约是 1000。

于 2015-05-06T08:25:27.323 回答
39

设置下拉父级。我必须将它设置在模态框内的 .modal-content 上,否则文本最终会居中。

$("#product_id").select2({
    dropdownParent: $('#myModal .modal-content')
});
于 2019-01-08T21:31:14.747 回答
14

在这里找到对我有用的答案:https ://github.com/select2/select2-bootstrap-theme/issues/41

$('select').select2({
    dropdownParent: $('#my_amazing_modal')
});

也不需要删除tabindex.

于 2017-11-29T14:53:30.383 回答
12

我有同样的问题,更新应该可以z-index解决问题。.select2-container确保您的模态z-index低于 select2。

.select2-container {
    z-index: 99999;
}

更新:如果上面的代码不能正常工作,也可以按照@breq 的建议从你的模态中删除 tabindexes

于 2017-05-18T08:54:32.610 回答
12

根据官方 select2 文档,之所以会出现此问题,是因为 Bootstrap 模态往往会从模态之外的其他元素中窃取焦点。

默认情况下,Select2 将下拉菜单附加到元素,它被认为是“在模式之外”。

而是使用 dropdownParent 设置将下拉菜单附加到模态本身:

$('#myModal').select2({
   dropdownParent: $('#myModal')
});

见参考:https ://select2.org/troubleshooting/common-problems

于 2019-03-20T12:03:33.853 回答
10

这个问题很适合为我工作单个 Jquery 函数

$('#myModal .select2').each(function() {  
   var $p = $(this).parent(); 
   $(this).select2({  
     dropdownParent: $p  
   });  
});
于 2018-10-09T05:50:13.383 回答
9

对于 bootstrap3 版本,只需在准备好的文档上使用此代码:

$(document).ready(function(){
    $.fn.modal.Constructor.prototype.enforceFocus = function () {};
});
于 2017-06-17T05:42:32.343 回答
8

就我而言,我在两个模态中遇到了同样的问题,所有问题都通过以下方式解决:

$('.select2').each(function() { 
    $(this).select2({ dropdownParent: $(this).parent()});
})

正如用户所说的项目问题#41 。

于 2019-10-10T11:15:03.640 回答
5

更改select2.css文件

z-index: 9998;
...
z-index: 9999;
...
z-index: 10000;

z-index: 10000;
...
z-index: 10001;
...
z-index: 10002;
于 2014-02-12T08:48:18.580 回答
5

只是为了更好地了解 tabindex 元素如何工作以完成接受的答案:

tabindex 全局属性是一个整数,指示元素是否可以获取输入焦点(可聚焦),是否应该参与顺序键盘导航,如果可以,在什么位置。它可以有几个值:
  - 负值意味着元素应该是可聚焦的,但不应该通过顺序键盘导航到达;
  -0 表示该元素应该可以通过顺序键盘导航获得焦点和访问,但其相对顺序由平台约定定义;
  - 一个正值意味着应该可以通过顺序键盘导航获得焦点和访问;它的相对顺序是由属性的值定义的:顺序跟随tabindex的增加数量。如果多个元素共享相同的 tabindex,则它们的相对顺序遵循它们在文档中的相对位置。

来自:Mozilla Devlopper Network

于 2016-06-05T18:05:44.250 回答
4
$('.modal').on('shown.bs.modal', function (e) {
    $(this).find('.select2me').select2({
        dropdownParent: $(this).find('.modal-content')
    });
})
于 2019-03-04T16:07:32.013 回答
4

我有一个类似的问题,我用

    $('#CompId').select2({
              dropdownParent: $('#AssetsModal')
    });

和模态选择

    <div class="modal fade" id="AssetsModal" role="dialog" 
    aria-labelledby="exampleModalCenterTitle" 
    aria-hidden="true"  style="overflow:hidden;" >
<div class="modal-dialog modal-dialog-centered" role="document">
  <div class="modal-content">
      <div class="modal-header">
            <h5 class="modal-title" id="exampleModalLongTitle" >Добави активи</h5>
            <button type="button" class="close" data-dismiss="modal" aria-label="Close">
              <span aria-hidden="true">&times;</span>
            </button>
      </div>
      <div class="modal-body">
          <form role="form" action="?action=dma_act_documents_assets_insert&Id=<?=$ID?>" 
                  method="post" name="dma_act_documents_assets_insert" 
                  id="dma_act_documents_assets_insert">
            <div class="form-group col-sm-12">
                  <label for="recipient-name" class="col-form-label">Актив:</label>
                  <span style="color: red">*</span>
                          <select class="form-control js-example-basic-single col-sm-12" 
                                 name="CompId" id="CompId">
                                  <option></option>
                          </select>
              </div>
          </form>
      </div>
  </div>
</div>

但我不知道为什么选择菜单比其他字段小 在此处输入图像描述

当开始使用select2时,它就这样开始了。当我删除它时,一切正常。

有没有人可以分享一些这方面的经验。

谢谢。

于 2020-09-17T05:56:00.550 回答
3

如果iPad键盘出现问题,在单击select2输入时隐藏引导模式,您可以通过在输入初始化添加以下规则来解决此问题:select2

if (navigator.userAgent.match(/iPhone|iPad|iPod/i)) {
   var styleEl = document.createElement('style'), styleSheet;
   document.head.appendChild(styleEl);
   styleSheet = styleEl.sheet;
   styleSheet.insertRule(".modal { position:absolute; bottom:auto; }", 0);
   document.body.scrollTop = 0; // Only for Safari
}

取自https://github.com/angular-ui/bootstrap/issues/1812#issuecomment-135119475

编辑:如果您的选项未正确显示,则需要dropdownParent在初始化时使用该属性select2

$(".select2").select2({
    dropdownParent: $("#YOURMODALID")
});

祝你好运 (:

于 2018-02-05T13:45:54.137 回答
3

基于@pymarco的回答我写了这个解决方案,它并不完美,但解决了select2焦点问题并保持标签序列在模态中工作

    $.fn.modal.Constructor.prototype.enforceFocus = function () {
        $(document)
        .off('focusin.bs.modal') // guard against infinite focus loop
        .on('focusin.bs.modal', $.proxy(function (e) {
            if (this.$element[0] !== e.target && !this.$element.has(e.target).length && !$(e.target).closest('.select2-dropdown').length) {
                this.$element.trigger('focus')
            }
        }, this))
    }
于 2018-03-07T13:45:14.940 回答
3

要将 bootstrap 4.0 与服务器端(ajax 或 json 数据内联)一起使用,您需要添加所有这些:

$.fn.modal.Constructor.prototype._enforceFocus = function() {};

然后当模态打开时,创建select2:

  // when modal is open
  $('.modal').on('shown.bs.modal', function () {
            $('select').select2({
                  // ....
            });
  });
于 2020-06-11T19:29:52.800 回答
2
$("#IlceId").select2({
    allowClear: true,
    multiple: false,
    dropdownParent: $("#IlceId").parent(),
    escapeMarkup: function (m) {
        return m;
    },
});

此代码正在运行。谢谢你。

于 2017-12-19T08:16:54.913 回答
2

好吧,我知道我迟到了。但是,让我与您分享对我有用的东西。tabindex 和 z-index 解决方案对我不起作用。

根据 select2 站点上列出的常见问题设置 select 元素的父级。

于 2018-07-02T11:30:17.380 回答
2

在您的页面上使用此代码

$(function () {
    $(".select2").select2({
        dropdownParent: $('#myModal')
    });

    $("#myModal").on('change', '#vdn_number', function () {
        var term = $(this).val();
        ajax: ({
            url: "getAjaxData/",
            dataType: 'json',
            type: "POST",
            data: function (term, page) {
                return {
                    q: term, // search term
                    col: 'vdn'
                };
            },
            results: function (data) { // parse the results into the format expected by Select2.
                // since we are using custom formatting functions we do not need to alter remote JSON data
                return { results: data };
            }
        });
    });
});

我想这会对你有所帮助

于 2021-11-29T10:29:32.353 回答
1

如果您使用 jquery 移动弹出窗口,您必须重写 _handleDocumentFocusIn 函数:

$.mobile.popup.prototype._handleDocumentFocusIn = function(e) {
  if ($(e.target).closest('.select2-dropdown').length) return true;
}

于 2015-04-16T14:57:59.570 回答
1

select2我对in有同样的问题,bootstrap modal解决方案是删除overflow-y: auto;and overflow: hidden; 从.modal-open.modal classes

这是使用jQuery删除的示例overflow-y

$('.modal').css('overflow-y','visible');
$('.modal').css('overflow','visible');
于 2017-04-28T10:46:11.807 回答
1

我之前遇到过这个问题,我正在使用yii2,我用这种方式解决了它

$.fn.modal.Constructor.prototype.enforceFocus = $.noop;
于 2017-05-16T16:11:53.693 回答
1

我通过重载select2-function 在我的项目中通常解决了这个问题。现在它将检查是否没有 dropdownParent 以及是否在具有 type 的父元素的元素上调用该函数div.modal。如果是这样,它将将该模式添加为下拉菜单的父级。

这样,您不必在每次创建 select2-input-box 时都指定它。

(function(){
    var oldSelect2 = jQuery.fn.select2;
    jQuery.fn.select2 = function() {
        const modalParent = jQuery(this).parents('div.modal').first();
        if (arguments.length === 0 && modalParent.length > 0) {
            arguments = [{dropdownParent: modalParent}];
        } else if (arguments.length === 1
                    && typeof arguments[0] === 'object'
                    && typeof arguments[0].dropdownParent === 'undefined'
                    && modalParent.length > 0) {
            arguments[0].dropdownParent = modalParent;
        }
        return oldSelect2.apply(this,arguments);
    };
    // Copy all properties of the old function to the new
    for (var key in oldSelect2) {
        jQuery.fn.select2[key] = oldSelect2[key];
    }
})();
于 2018-09-27T13:46:28.143 回答
1

我在应用程序中有一个半相关的问题,所以我将放入我的 2c。

我有多个模式,其中包含 select2 小部件的表单。打开模态 A,然后打开模态 A 内的另一个模态,会导致模态 B 内的 select2 小部件消失并且无法初始化。

这些模式中的每一个都通过 ajax 加载表单。

解决方案是在关闭模式时从 dom 中删除表单。

$(document).on('hidden.bs.modal', '.modal', function(e) {
    // make sure we don't leave any select2 widgets around 
    $(this).find('.my-form').remove();
});
于 2018-12-02T20:59:24.620 回答
1

您可以在 $(document) 中再次调用 select2 触发器

$(".select2").select2({ 
                width: '120' 
            });
于 2020-02-28T12:51:02.630 回答
1

这对所有人都有效

body .select2-container {
    z-index: 9999 !important;
}
于 2021-11-11T18:42:35.573 回答
0

我只是通过包含select2.min.css让它工作

试试看

我的引导程序 3 的模态 html 是

<div id="changeTransportUserRequestPopup" class="modal fade" role="dialog">
    <div class="modal-dialog" style="width: 40%!important; ">
        <div class="modal-content">
            <div class="modal-header">
                <button type="button" class="close" data-dismiss="modal">&times;</button>
                <h3>Warning</h3>
            </div>
            <div class="modal-body" id="changeTransportUserRequestPopupBody">
                <select id="cbTransport" class="js-example-basic-single" name="cbTransport" style="width:100%!important;"></select>
            </div>
            <div class="modal-footer">
                <button id="noPost" class="btn btn-default" name="postConfirm" value="false" data-dismiss="modal">Cancel</button>
                <button type="submit" id="yesChangeTransportPost" class="btn btn-success" name="yesChangeTransportPost" value="true" data-dismiss="modal">Yes</button>
            </div>
        </div>
    </div>
</div>
于 2018-09-06T01:39:48.020 回答
0

如果您使用stisla并使用 firemodal :

$('#modal-create-promo').click(()=>{
    setTimeout(()=>{
        $('#fire-modal-1').removeAttr('tabindex');
    });
});

    $("#modal-create-promo").fireModal({
    ...
});

这对我有用

于 2020-11-24T04:03:01.213 回答
0

从模态中删除tabindex="-1"。我检查了这个解决方案并且它有效。

参考:https ://github.com/select2/select2-bootstrap-theme/issues/41

于 2021-03-23T23:52:04.800 回答
0

您不应该按照大多数答案中的建议将下拉菜单固定在模式上。如果您的 select2 位于模态框的底部,并且您需要向下滚动才能找到它,那么您将遇到下拉菜单的位置问题,因为您将其卡在了模态框上。

相反,您应该将下拉父级设置为输入父级。在您的情况下,它应该看起来像这样

$(document).ready(function() {
  $("#vdn_number").select2({
    dropdownParent: $("#vdn_number").parent()
  });
});
于 2022-01-31T17:04:29.327 回答
-1

就我而言,我这样做了,它有效。我使用 bundle 来加载它,在这种情况下它对我有用

 $(document).on('select2:select', '#Id_Producto', function (evt) {
   // Here your code...
  });
于 2019-03-13T11:54:52.563 回答