[jquery] 부트 스트랩 모달에 포함 된 경우 Select2가 작동하지 않습니다

부트 스트랩 모달에서 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가 작동하지 않습니다



답변

좋아, 나는 그것을 작동시켰다.

변화

<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” 제거 )


답변

Select2 v4의 경우 :

dropdownParentHTML 본문이 아닌 모달 대화 상자에 드롭 다운을 첨부하는 데 사용하십시오 .

<!-- 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 드롭 다운이 첨부되어 HTML 본문이 아닌 모달의 DOM에 속합니다 (기본값). https://select2.org/dropdown#dropdown-placement를 참조 하십시오.


답변

select2의 github에서 이에 대한 해결책을 찾았습니다.

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

부트 스트랩 3의 경우 해결책은 다음과 같습니다.

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

Bootstrap 4의 enforceFocus메소드 이름이로 바뀌 었 _enforceFocus으므로 대신 패치해야합니다.

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

위 링크에서 설명이 복사되었습니다.

부트 스트랩은 포커스 된 요소가 오버레이 자체인지 또는 하위 요소인지 여부를 확인하는 포커스 인 이벤트에 리스너를 등록합니다. select2 드롭 다운이 본문에 첨부되면 텍스트 필드에 아무것도 입력하지 못하게됩니다.

모달에 이벤트를 등록하는 enforceFocus 함수를 덮어 써서이를 신속하게 수정할 수 있습니다


답변

그냥 tabindex="-1"스타일을 제거 하고 추가하십시오overflow:hidden

예를 들면 다음과 같습니다.

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


답변

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

이것은 select2 4.0.0을 사용하는 솔루션입니다. select2.css 가져 오기 바로 아래의 CSS를 대체하십시오. z- 색인이 대화 상자 나 모달보다 큰지 확인하십시오. 기본 설정에 2000을 추가합니다. 내 대화 상자의 z-index가 약 1000입니다.


답변

dropdownParent를 설정하십시오. 모달 내의 .modal-content에 설정해야했습니다. 그렇지 않으면 텍스트가 가운데에 배치됩니다.

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


답변

나를 위해 일한 답변은 여기에 있습니다 : https://github.com/select2/select2-bootstrap-theme/issues/41

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

또한을 제거 할 필요가 없습니다 tabindex.