2016-12-28 27 views
1

我正在開發一個Web應用程序(Asp.Net MVC 5),其中用戶必須使用映射到其他記錄來創建許多數據記錄。用戶必須能夠創建到現有或新創建記錄的映射。Bootstrap 3嵌套模態 - 背景z-index並點擊關閉模態

一個典型的例子是一個地址的創建:

  • 用戶打開該網站創建地址
  • 他進入像街道和街道等不正常領域
  • 他能從表中選擇現有的城市(地址所在的城市)
  • 如果所需的城市不存在,他可以創建一個新城市
  • ...對於城市,他可以選擇一個國家或創建地址(與地址和城市相同)

該選擇是使用引導模式實現的。 按下選擇按鈕(如選擇城市)顯示一個模式,其中包含一個表格,顯示錶格中的所有可選記錄。 與表格中的模式包含添加新按鈕以添加新實體,從而打開另一個模式。

爲了能夠重新使用我已經分裂在局部視圖中這樣的代碼的觀點:

  • _CreateAddress =>只包含的形式來創建地址
  • _CreateAddressModal =>將含有_CreateAddress模態
  • _SelectAddressModal =>一個模態,其中包含一個顯示所有地址的表格。模態還包含_CreateAddressModal當用戶點擊了添加新的按鈕將被顯示

  • _CreateCity =>只包含的形式來創建一個城市

  • _CreateCityModal =>將含有_CreateAddressModal模態
  • _SelectCityModal = >包含一張表格顯示所有城市的模式。該模式還包含_CreateCityModal當用戶點擊新建按鈕

這將顯示...等等

我有兩個問題:

  • 點擊背景不關閉打開的模態
  • 最高模態的背景比所有其他模態具有更低的Z-index,因此不會隱藏其他模態

我試着在模態顯示中設置背景的z-index,以確保它們隱藏了其他模態,但是這沒有奏效=>背景顯示在當前模態之上。

下面是該問題的一個小提琴:jsFiffle

SO並不讓我鏈接到的jsfiddle不添加代碼的問題,所以這裏是代碼:

HTML:

<!-- Create Address --> 
<div id="CreateAddress" class="modal fade fullScreen" tabindex="-1" role="dialog"> 
    <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">Create Address</h4> 
      </div> 
      <div class="modal-body"> 
       <div class="alert alert-info"> 
           <strong>Placeholder</strong> Here is the form to create an address 
        <button class="btn btn-default" id="selectCityButton">select city</button> 
         </div> 
       <button class="btn btn-primary">OK (not implemented)</button> 
       <button class="btn btn-default modalCloseButton" 
         data-modalid="CreateAddress">Cancel</button> 
      </div> 
     </div> 
    </div> 
</div> 

<!-- Select City --> 
<div id="SelectCity" class="modal fade fullScreen" tabindex="-1" role="dialog"> 
    <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">Select a City</h4> 
      </div> 
      <div class="modal-body"> 
       <div class="alert alert-info"> 
           <strong>Placeholder</strong> Here is a table to select an existing city 
         </div> 
       <button class="btn btn-success btn-block" id="createCityButton">Create new city</button> 
       <button class="btn btn-primary">OK (not implemented)</button> 
       <button class="btn btn-default modalCloseButton" 
         data-modalid="SelectCity">Cancel</button> 
      </div> 
     </div> 
    </div> 
</div> 

<!-- Create City --> 
<div id="CreateCity" class="modal fade fullScreen" tabindex="-1" role="dialog"> 
    <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">Create City</h4> 
      </div> 
      <div class="modal-body"> 
       <div class="alert alert-info"> 
           <strong>Placeholder</strong> Here is the form to create a city 
        <button class="btn btn-default" id="selectCountryButton">select country of city</button> 
         </div> 
       <button class="btn btn-primary">OK (not implemented)</button> 
       <button class="btn btn-default modalCloseButton" 
         data-modalid="CreateCity">Cancel</button>    
       <!-- Select Country --> 
       <div id="SelectCountry" class="modal fade fullScreen" tabindex="-1" role="dialog"> 
        <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">Select a Country</h4> 
          </div> 
          <div class="modal-body"> 
           <div class="alert alert-info"> 
            <strong>Placeholder</strong> Here is a table to select an existing country 
           </div> 
           <button class="btn btn-success btn-block" id="createCountryButton">Create new country</button> 
           <button class="btn btn-primary">OK (not implemented)</button> 
           <button class="btn btn-default modalCloseButton" 
             data-modalid="SelectCountry">Cancel</button> 
          </div> 
         </div> 
        </div> 
       </div> 
       <!-- Select Country END --> 
       <!-- Create Country --> 
       <div id="CreateCountry" class="modal fade fullScreen" tabindex="-1" role="dialog"> 
        <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">Create Country</h4> 
          </div> 
          <div class="modal-body"> 
           <div class="alert alert-info"> 
            <strong>Placeholder</strong> Here is the form to create a country 
           </div> 
           <button class="btn btn-primary">OK (not implemented)</button> 
           <button class="btn btn-default modalCloseButton" 
             data-modalid="CreateCountry">Cancel</button> 
          </div> 
         </div> 
        </div> 
       </div> 
       <!-- Create Country END --> 

      </div> 
     </div> 
    </div> 
</div> 

<button class="btn btn-primary btn-block" id="openModal">Open Modal</button> 

JS:

var zIndex = 10000; 
    // Displys the given modal on top of everything else 
    // modal: The modal to display as jQuery object 
    // Does not work => remove thw first two lines to see the problem 
    function displayModalOnTop(modal) { 
    // remove me 
    modal.modal('show'); 
    return; 
    // end remove 
     zIndex += 2; 
     modal.css('z-index', zIndex); 
     modal.modal('show'); 
     setTimeout(function() { 
      $('.modal-backdrop').not('.modal-stack').css('z-index', zIndex - 1).addClass('modal-stack'); 
     }, 0); 
    } 

$(function(){ 
    $('#openModal').on('click', function(){ 
     displayModalOnTop($('#CreateAddress')); 
    }); 

    // generic close modal handler 
    $('.modalCloseButton').on('click', function(){ 
     var $this = $(this); 
     var modalId = $this.attr('data-modalid'); 
     $('#' + modalId).modal('hide'); 
    }) 

    // Select city click 
    $('#selectCityButton').on('click', function(){ 
     displayModalOnTop($('#SelectCity')); 
    }); 

    // Create city click 
    $('#createCityButton').on('click', function(){ 
     displayModalOnTop($('#CreateCity')); 
    }); 

    // Select country click 
    $('#selectCountryButton').on('click', function(){ 
     displayModalOnTop($('#SelectCountry')); 
    }); 

    // Create country click 
    $('#createCountryButton').on('click', function(){ 
     displayModalOnTop($('#CreateCountry')); 
    }); 
}); 

CSS:

.modal.fullScreen { 
    padding-left: 0 !important; 
    padding-right: 0 !important; 
    margin-top: 48px; 
} 
.modal.fullScreen .modal-content { 
    height: auto; 
    min-height: 100%; 
    border-radius: 0; 
} 
.modal.fullScreen .modal-body.noPadding { 
    padding: 0; 
} 
.modal.fullScreen .modal-dialog { 
    width: 100%; 
    height: 100%; 
    padding: 0; 
    margin: 0; 
} 
.modal.fullScreen .modal-header { 
    background-color: #3276b1; 
    color: #fff; 
} 
.modal.fullScreen .modal-header .close { 
    color: #FFF; 
    text-decoration: none; 
    cursor: pointer; 
    opacity: 0.4; 
    font-size: 30px; 
} 
.modal.fullScreen .modal-header .close:hover { 
    opacity: 1 !important; 
} 

回答

0

的問題是模態所覆蓋的孔篩。由於模態的餘量,背景是可見的,但不可點擊,因爲它完全被模態覆蓋。 從模態中刪除餘量並將其添加到模態對話框中可解決問題。

0

寧可自己編寫這麼多的代碼,然後通過自己維護一切,你可以做的只是在下面的代碼片段中給出。

function simpleSHow(title) 
 
\t \t \t { 
 
\t \t \t \t var msg=$('#simple-div'); 
 
\t \t \t \t 
 
\t \t \t \t BootstrapDialog.show({ 
 
\t \t \t \t \t title : title, 
 
\t \t \t \t \t message: $('#simple-div'), 
 
\t \t \t \t \t onhide : function(){ 
 
\t \t \t \t \t \t $('#hidden-div').append(msg); 
 
\t \t \t \t \t } 
 
\t \t \t \t }); 
 
\t \t \t } 
 
\t \t \t 
 
\t \t \t function complexSHow(title) 
 
\t \t \t { 
 
\t \t \t \t var msg=$('#complex-div'); 
 
\t \t \t \t 
 
\t \t \t \t BootstrapDialog.show({ 
 
\t \t \t \t \t title : title, 
 
\t \t \t \t \t message: $('#complex-div'), 
 
\t \t \t \t \t onhide : function(){ 
 
\t \t \t \t \t \t $('#hidden-div').append(msg); 
 
\t \t \t \t \t } 
 
\t \t \t \t }); 
 
\t \t \t } 
 
\t \t \t 
 
\t \t \t function showDiv1(div_id) 
 
\t \t \t { 
 
\t \t \t \t var msg=$('#lavel-2_div-1'); 
 
\t \t \t \t BootstrapDialog.show({ 
 
\t \t \t \t \t title : 'Level 2 Title', 
 
\t \t \t \t \t message: $('#lavel-2_div-1'), 
 
\t \t \t \t \t onhide : function(){ 
 
\t \t \t \t \t \t $('#hidden-div').append(msg); 
 
\t \t \t \t \t } 
 
\t \t \t \t }); 
 
\t \t \t } 
 
\t \t \t 
 
\t \t \t function showDiv2(div_id) 
 
\t \t \t { 
 
\t \t \t \t var msg=$('#lavel-2_div-2'); 
 
\t \t \t \t BootstrapDialog.show({ 
 
\t \t \t \t \t title : 'Level 2 Title', 
 
\t \t \t \t \t message: $('#lavel-2_div-2'), 
 
\t \t \t \t \t onhide : function(){ 
 
\t \t \t \t \t \t $('#hidden-div').append(msg); 
 
\t \t \t \t \t } 
 
\t \t \t \t }); 
 
\t \t \t } 
 
\t \t \t 
 
\t \t \t function showDiv3(div_id) 
 
\t \t \t { 
 
\t \t \t \t var msg=$('#lavel-2_div-3'); 
 
\t \t \t \t BootstrapDialog.show({ 
 
\t \t \t \t \t title : 'Level 2 Title', 
 
\t \t \t \t \t message: $('#lavel-2_div-3'), 
 
\t \t \t \t \t onhide : function(){ 
 
\t \t \t \t \t \t $('#hidden-div').append(msg); 
 
\t \t \t \t \t } 
 
\t \t \t \t }); 
 
\t \t \t } 
 
\t \t \t 
 
\t \t \t function showDiv4(div_id) 
 
\t \t \t { 
 
\t \t \t \t var msg=$('#lavel-2_div-4'); 
 
\t \t \t \t BootstrapDialog.show({ 
 
\t \t \t \t \t title : 'Level 2 Title', 
 
\t \t \t \t \t message: $('#lavel-2_div-4'), 
 
\t \t \t \t \t onhide : function(){ 
 
\t \t \t \t \t \t $('#hidden-div').append(msg); 
 
\t \t \t \t \t } 
 
\t \t \t \t }); 
 
\t \t \t }
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet"> 
 
<link href="https://cdnjs.cloudflare.com/ajax/libs/bootstrap3-dialog/1.35.3/css/bootstrap-dialog.min.css" rel="stylesheet"> 
 

 

 
<script src="https://code.jquery.com/jquery-3.1.1.min.js"></script> 
 
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script> 
 
<script src="https://cdnjs.cloudflare.com/ajax/libs/bootstrap3-dialog/1.35.3/js/bootstrap-dialog.min.js"></script> 
 

 

 

 
<!-- This is a container Div which contains all the div to show when bootstrap dialog opens --> 
 
<div style="display : none" id="hidden-div"> 
 
    <div id="simple-div"> 
 
    <h1>This is H1 Heading</h1> 
 
    This is most simple coding 
 
    <br> 
 
    <button type="button" class="btn btn-primary" onclick="showDiv1()">Lavel-2 div-1</button> 
 
    <button type="button" class="btn btn-primary" onclick="showDiv2()">Lavel-2 div-2</button> 
 
    </div> 
 

 
    <div id="lavel-2_div-1"> 
 
    <h3>This is Level 2 Header</h3> 
 
    <span style="color : blue;">This is Level 2 Message 1</span> 
 
    </div> 
 

 
    <div id="lavel-2_div-2"> 
 
    <h3>This is Level 2 Header</h3> 
 
    <span style="color : greenyellow;">This is Level 2 Message 2</span> 
 
    </div> 
 

 
    <div id="lavel-2_div-3"> 
 
    <h3>This is Level 2 Header</h3> 
 
    <span style="color : pink;">This is Level 2 Message 3</span> 
 
    </div> 
 
    <div id="lavel-2_div-4"> 
 
    <h3>This is Level 2 Header</h3> 
 
    <span style="color : green;">This is Level 2 Message 4</span> 
 
    </div> 
 

 
    <div class="container-fluid" id="complex-div"> 
 

 
    <button type="button" class="btn btn-primary" onclick="showDiv3()">Lavel-2 div-3</button> 
 
    <button type="button" class="btn btn-primary" onclick="showDiv4()">Lavel-2 div-4</button> 
 
    <h2>Panels with Contextual Classes</h2> 
 
    <div class="panel-group"> 
 
     <div class="panel panel-default"> 
 
     <div class="panel-heading">Panel with panel-default class</div> 
 
     <div class="panel-body">Panel Content</div> 
 
     </div> 
 

 
     <div class="panel panel-primary"> 
 
     <div class="panel-heading">Panel with panel-primary class</div> 
 
     <div class="panel-body">Panel Content</div> 
 
     </div> 
 

 
     <div class="panel panel-success"> 
 
     <div class="panel-heading">Panel with panel-success class</div> 
 
     <div class="panel-body">Panel Content</div> 
 
     </div> 
 

 
     <div class="panel panel-info"> 
 
     <div class="panel-heading">Panel with panel-info class</div> 
 
     <div class="panel-body">Panel Content</div> 
 
     </div> 
 

 
     <div class="panel panel-warning"> 
 
     <div class="panel-heading">Panel with panel-warning class</div> 
 
     <div class="panel-body">Panel Content</div> 
 
     </div> 
 

 
     <div class="panel panel-danger"> 
 
     <div class="panel-heading">Panel with panel-danger class</div> 
 
     <div class="panel-body">Panel Content</div> 
 
     </div> 
 
    </div> 
 
    </div> 
 

 
</div> 
 

 
&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp; 
 
<button type="button" class="btn btn-primary" onclick="simpleSHow('Hello 1234')">Simple Div Show</button> 
 
&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp; 
 
<button type="button" class="btn btn-primary" onclick="complexSHow('Complex 1234')">Complex Div Show</button>

+0

感謝您的回答。實際上,我不用手寫這些代碼,代碼是由服務器端代碼生成的。 – musium