当我在引导模式下使用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>

  </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嵌入引导模态时不起作用

评论

也就是说,从元素中删除属性tabindex =“-1”。

dboswell的答案是正确的解决方案,但是,dropdownParent不应位于根div上,而应位于更深的位置,例如具有modal-content类的div,否则滚动模态时下拉位置会变得混乱。

#1 楼

好的,我已经可以使用了。
(从模式中删除tabindex =“-1”)

评论


可能还有其他解决方案吗?因为模态窗口不会被Esc键关闭。

– woto
13-10-20在15:47

删除tabindex =“-1”对我不起作用。我刚刚将
更改为


–维森
13年11月27日在8:49

请选择pymarco答案作为正确答案,此解决方案会破坏ESC键,而他不会。不错的尝试。

–古怪
17年4月25日在10:11

@woto还有其他解决方案吗?我遇到了像你一样的问题。删除tabindex =“-1”后,我的模型没有在Esc键上关闭。

–ankit suthar
17年6月28日在9:26

删除taxindex有副作用吗?

–诺伯特·卡多斯(Norbert Kardos)
18年1月31日在14:45

#2 楼

对于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

评论


这对我有效(使用v4.0.2),但是我必须使用dropdownParent:$(“#myModal”),而不是dropdownParent:“ #myModal”。

– Saxon Druce
16年4月12日在7:58

@Kevin Brown:由于dropdownParent:启用使用v4.0.1版本的模式输入时,仍需要$(“#myModal”)来更新您的帖子;我刚刚进行了测试。您可以还原您的更新,以使@dboswell的答案仍然有意义和有意义。

– nyedidikeke
16年8月29日在17:07

@nyed我所做的唯一编辑是我强制dropdownParent使用jQuery对象。该更新已经存在,并且我无法对其进行验证。

–凯文·布朗
16年8月29日在17:09

FWIW,在我的情况下,我需要将dropdownParent设置为模态的主体,将其附加到模态本身并不能使z索引足够高。例如dropdownParent:$('。modal-body','#myModal')

–DrewInTheMountains
17年12月14日在18:03

@DrewInTheMountains我在将dropdownParent设置为模态的根时也遇到了问题,选择主体确实更好,否则滚动时会遇到严重的定位错误。我将我的类设置为div,其类为modal-content,它的工作方式就像一个魅力!

– Shahin Dohan
18年11月4日在1:47

#3 楼

我在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下拉列表附加到主体,这可以有效地防止您在文本字段中输入任何内容。
您可以通过覆盖将事件注册到模式上的forceFocus函数来快速修复此问题


评论


我刚刚解决了在Bootstrap 2.3.2模态窗口中使用CKEditor的问题。这个函数被称为很多,因此,如果您修改if语句,则必须非常小心,不要使浏览器崩溃。我建议在现有if中放置任何附加子句-不要在if后面附加它们。 (例如,如果(现有条件){如果(您的条件){希望有所帮助。

–JonRed
13-10-25在3:34

该代码放在哪里,应该处理什么功能?抱歉,这里的JS菜鸟,我尝试将其作为select2 JS的一部分,或将其放在页面的顶部/结尾,但均未成功。 $ .fn.modal.Constructor.prototype.enforceFocus = $ .noop;

– Armitage2k
16-11-27在0:59

如果您将data-focus =“ false”设置为模式(
)_enforceFocus永远不会为此模式调用。在Bootstrap 4.1.3中进行了测试并成功运行...原始答案github.com/twbs/bootstrap/issues/19971#issuecomment-275901368

– Ashokbharathi
19年1月3日在8:13

#4 楼

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

这里是一个示例:

<div id="myModal" class="modal fade" role="dialog" style="overflow:hidden;">
    <!---content modal here -->
</div>


评论


它有效,但是当我有很长的模态时,我不能向下滚动!

–塔雷克·卡拉吉(Tarek Kalaji)
18年3月17日在16:40

试图删除tabindex但还不够。添加溢出:如果模式框很长,则隐藏很有用...

–安慰剂
Apt 2 '18 at 11:17

为我工作,删除标签索引属性。

– Glen
18年6月4日在11:25

仅供参考:删除tab-index attr将删除通过esc按钮关闭模式弹出窗口的功能。

–好奇男孩
18年7月28日在7:10

如果您使用的是yii2引导程序模式,请使用选项设置:'options'=> ['tabindex'=> false,“ style” =>“ overflow:hidden;”],

– Opad
18-10-13在17:12



#5 楼

.select2-close-mask{
    z-index: 2099;
}
.select2-dropdown{
    z-index: 3051;
}


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

评论


除此之外,所有解决方案都不适用于select2 4.0.0。非常感谢。

– Neel
15年6月26日在10:15

如果Select2(v4.0.0)位于弹出窗口中,则会发生相同的问题。在bootstrap.css中,.popover的z索引设置为1060,因此此修复程序也可以正常使用。我喜欢它,因为它很简单,并且可以用创建问题的方式解决问题:在样式表中设置z-index。

– Paul
15年7月2日在18:02



我已经在css文件中添加了以上内容,但没有任何更改。我正在使用jQuery Mobile。有什么建议吗?

– Sahil Khanna
16-2-20在7:03

@Sahil 1.确保已成功覆盖原始文件。简单的方法是将其添加到所有默认的CSS文件之后2.检查z-index,确保其大于对话框的

–迪鲁卡W
16-2-22在8:55

从模式中删除tabindex =“-1”以使此解决方案有效。

– RenanStr
19-10-17在13:50

#6 楼

设置dropdownParent。我必须将其设置为模态内的.modal-content,否则文本最终会居中。

$("#product_id").select2({
    dropdownParent: $('#myModal .modal-content')
});


评论


.modal-content确实有所作为。感谢您指出👍

–林俊杰
19年4月18日在4:10

#7 楼

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

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


也不需要删除tabindex

#8 楼

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

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


更新: @breq建议

评论


您需要使用@breq答案来实现这一点,以使其起作用。

– Ryan Arief
17年6月11日在3:40

#9 楼

根据官方的select2文档,发生此问题的原因是Bootstrap模态倾向于将焦点从模态之外的其他元素中窃取。模态”。

而是使用dropdownParent设置将下拉列表附加到模态本身: org / troubleshooting / common-problems

评论


好。在添加dropdownParent选项后,它无法正常工作,现在还不能正常工作。

– Yogesh Saroya
19年11月18日在14:44

#10 楼

Jus在Document.read()

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

上使用此代码

评论


正确的函数名称为“ $(document).ready”。因此代码应类似于:$(document).ready(function(){$ .fn.modal.Constructor.prototype.enforceFocus = function(){};});

–莱希·奥辛斯基(LechOsiński)
17年11月2日14:04



@LechOsiński-感谢您实际描述了如何使用这一小段代码。您的解决方案是唯一对我有用的解决方案。 +1

– Francis Bartkowiak
18-10-18在0:50

#11 楼

此问题解决了为我工作的单个Jquery函数

$('#myModal .select2').each(function() {  
   var $p = $(this).parent(); 
   $(this).select2({  
     dropdownParent: $p  
   });  
});


#12 楼

更改select2.css文件

评论


那是我唯一的作品(jquery-ui-1.10.3.css,jquery-ui-1.9.1.js和select2 3.4.0)。我有2个jquery UI对话框,一个在另一个之上,而select2在第二个之上。我还把//允许SELECT2,日期和时间选择器的交互作用放在jQuery UI对话框$ .ui.dialog.prototype._allowInteraction = function(e){return !! $(e.target).closest('。ui-对话框,.ui-datepicker,.select2-drop')。length; };我不知道是否有帮助。

– Adrian P.
16-2-9在17:29



#13 楼

只是为了更好地理解tabindex元素如何工作以完成已接受的答案:顺序键盘导航,如果可以的话,在什么位置。它可以采用多个值:
-负值表示元素应该是可聚焦的,但不能通过顺序键盘导航到达;

-0表示元素应该是可聚焦的并且可通过顺序键盘导航达到,但其相对顺序由平台约定定义;它的相对顺序由属性的值定义:依次跟随tabindex的数量递增。如果多个元素共享相同的tabindex,则它们的相对顺序将遵循它们在文档中的相对位置。


来自:Mozilla Devlopper Network

#14 楼

就我而言,我有两个模态的相同问题,所有问题都使用以下方法解决:

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


与项目问题#41中的用户说的一样。

#15 楼

如果您的iPad键盘有问题,请在单击select2输入时隐藏引导程序模式,则可以通过在select2输入初始化后添加以下规则来解决此问题: >
来自https://github.com/angular-ui/bootstrap/issues/1812#issuecomment-135119475

编辑:如果未正确显示您的选项,则需要使用初始化dropdownParent时的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
}


祝你好运(:

#16 楼

基于@pymarco的答案,我写了这个解决方案,虽然不是完美的解决方案,但解决了select2焦点问题并保持制表符序列在模式内部工作

#17 楼

$("#IlceId").select2({
    allowClear: true,
    multiple: false,
    dropdownParent: $("#IlceId").parent(),
    escapeMarkup: function (m) {
        return m;
    },
});


该代码有效。谢谢。

#18 楼

好吧,我知道我迟到了。但是,请允许我与您分享对我有用的方法。在select2网站上。

#19 楼

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




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




评论


我正在使用jQuery Mobile,并在弹出窗口中嵌入了Select2。您提供的代码在PC浏览器上效果很好。但是,当我在移动浏览器上运行此代码时,选择任何值时,弹出窗口都会关闭并重新打开。您能提出我需要做的任何更改吗?

– Sahil Khanna
16-2-20在7:03

#20 楼

我在select2中使用bootstrap modal遇到相同的问题,解决方法是删除overflow-y: auto;overflow: hidden;来自.modal-open.modal classes

下面是使用jQuery删除overflow-y的示例:

$('.modal').css('overflow-y','visible');
$('.modal').css('overflow','visible');


#21 楼

我以前有这个问题,我正在使用yii2并以这种方式解决了

$.fn.modal.Constructor.prototype.enforceFocus = $.noop;


#22 楼

我在应用程序中遇到一个半相关的问题,所以我将其放在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();
});


#23 楼

$('.modal').on('shown.bs.modal', function (e) {
    $(this).find('.select2me').select2({
        dropdownParent: $(this).find('.modal-content')
    });
})


#24 楼

我在我的项目中通过重载select2 -function解决了这一问题。现在,它将检查是否没有dropdownParent,以及是否在具有div.modal类型的父元素的元素上调用该函数。如果是这样,它将在下拉菜单中将该模式添加为父模式。 br />
 (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];
    }
})();
 


#25 楼

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

$(".select2").select2({ 
                width: '120' 
            });


#26 楼

要在服务器端(ajax或json数据内联)中使用bootstrap 4.0,您需要添加以下所有内容:
select2:

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


评论


您可以在模式html代码上指定data-focus =“ false”属性,而不是全局禁用引导程序模式的焦点功能。 https://getbootstrap.com/docs/4.5/components/modal/#options

–itsyub
20年8月11日在19:29



除此答案外,没有其他答案对我有用,如果您手动打开模态,则此答案是可行的

–VeRJiL
20-11-29在23:13

#27 楼

我只是通过包含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>


#28 楼

我遇到了类似的问题,并使用
    $('#CompId').select2({
              dropdownParent: $('#AssetsModal')
    });

和使用select的模态进行了修复,但我不知道为什么选择菜单比其他字段小

,开始使用select2时,它的启动就这样。当我删除它时,一切都很好。
有没有人可以分享一些有关此的经验。

#29 楼

如果您使用stisla并使用firemodal:
$('#modal-create-promo').click(()=>{
    setTimeout(()=>{
        $('#fire-modal-1').removeAttr('tabindex');
    });
});

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

对我来说是工作

#30 楼

就我而言,我做到了,而且行得通。我使用捆绑软件加载它,在这种情况下,它对我有用

 $(document).on('select2:select', '#Id_Producto', function (evt) {
   // Here your code...
  });


最近发表