Модал начальной загрузки, вызываемый из диалогового окна jQuery UI: превышен максимальный размер стека вызовов - PullRequest
0 голосов
/ 26 апреля 2019

У меня странная проблема. Я вызываю модал Bootstrap, пока открыто диалоговое окно jQuery UI, и я получаю RangeError: Maximum call stack size exceeded. в консоли

Странно, но это происходит только тогда, когда я вызываю модал, когда открыто диалоговое окно. Похоже, у него нет заметных побочных эффектов, хотя я бы предпочел, чтобы ошибки не было.

Я также получаю ту же ошибку, когда нажимаю любую кнопку в Модале начальной загрузки.

Я использую Bootstrap версии 4.1.0, jQuery версии 3.3.1 и jQuery UI версии 1.12.1

Из-за того, как приложение построено, мне нужно, чтобы диалог был модальным, а затем, чтобы поверх него появлялось модальное окно начальной загрузки, когда в указанном диалоге выполняется определенное действие. Изменение модального состояния диалога перед отображением модальной начальной загрузки, похоже, тоже не решает проблему.

Хотя у меня есть ощущение, что это может быть связано с тем, чтобы оба были установлены как модальные, есть ли что-то очевидное, что я здесь упустил?

Весь проект сложный и массивный, поэтому я поместил несколько фрагментов ниже:

//jQuery UI Dialog definition:

Dialog = $("#dialogContainer").dialog({
  autoOpen: false,
  height: 400,
  width: "80%",
  modal: true,
  show: {
    effect: "fade",
    duration: 250
  },
  hide: {
    effect: "fade",
    duration: 250
  },
  buttons: {
    "Save Sale": {
      text: "Save",
      id: "Module_Dialog_Save",
      click: function() {
        //Handler code
      }
    },
    Cancel: {
      text: "Cancel",
      id: "Module_Dialog_Cancel",
      click: function() {
        //Handler code
      }
    }
  },
  close: function() {
    //Handler code
  }
});
//Show dialog
$( "#dialogContainer" ).dialog( "open" );
function Delete(){
$('#bootStrapModal').modal("hide");
}
function Cancel(){
$('#bootStrapModal').modal("hide");
}
function buttonClick(){
$('#bootStrapModal').modal();
}
//Bootstrap modal call - error happens when this is called
<link href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" rel="stylesheet" />

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.min.js"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.0/js/bootstrap.min.js"></script>
<div id="dialogContainer"><button onClick="buttonClick()">This Errors</button></div>
<div class="modal fade" id="bootStrapModal" tabindex="-1" role="dialog" aria-labelledby="ModalCenterTitle" aria-hidden="true">
  <div class="modal-dialog" role="document">
	<div class="modal-content">
	  <div class="modal-header">
		<h5 class="modal-title" id="ModalCenterTitle">Delete?</h5>
		<button id="CloseButton" type="button" class="close" data-dismiss="modal" aria-label="Close">
		  <span aria-hidden="true">&times;</span>
		</button>
	  </div>
	  <div class="modal-body">
		  Are you sure you want to delete?<br>
		  Changes won't be saved until you click Save
	  </div>
	  <div class="modal-footer">
		<button id="CancelButton" type="button" class="btn btn-secondary" data-dismiss="modal" onClick="Cancel()">Close</button>
		<button id="DeleteButton" type="button" class="btn btn-danger" onClick="Delete()">Delete</button>
	  </div>
	</div>
  </div>
</div>

Ответы [ 2 ]

1 голос
/ 26 апреля 2019

Вы можете попробовать вызвать другой диалог внутри открытого.HTML будет выглядеть следующим образом:

<link href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" rel="stylesheet" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.min.js"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.0/js/bootstrap.min.js"></script>

<div id="dialogContainer">
    <button onClick="buttonClick()">This Errors</button>
</div>

<div id="another-dialogContainer" title="second Container">
    Second Modal here
</div>

, тогда на вашем javascript вы просто вызываете второе диалоговое окно, когда нажимаете кнопку

Dialog = $("#dialogContainer").dialog({
    autoOpen: false,
    height: 200,
    width: "50%",
    modal: true,
    show: {
           effect: "fade",
           duration: 250
          },
    hide: {
           effect: "fade",
           duration: 250
          },
    buttons: {
            "Save Sale": {
                        text: "Save",
                        id: "Module_Dialog_Save",
                        click: function() {
                              //Handler code
                         }
                       },
             Cancel: {
                       text: "Cancel",
                       id: "Module_Dialog_Cancel",
                       click: function() {
                        //Handler code
                          }
                        }
                      },
        close: function() {
           //Handler code
            }
         });
     //Show dialog
     $( "#dialogContainer" ).dialog( "open" );

function buttonClick(){
     $( "#another-dialogContainer" ).dialog('open');
  }

  //second dialog Container

$( "#another-dialogContainer" ).dialog({
    autoOpen: false,
    modal: true,
    buttons: {
        Cancel: function() {
            $(this).dialog('close');
        }
     }
 });

, тогда вы можете задать какой-нибудь стиль

.ui-dialog {
    top: 0;
    left: 0;
    padding: .2em;
    border:1px;

}
.ui-dialog .ui-dialog-titlebar {
    border:1px;
    display: none;
}
.ui-dialog .ui-dialog-content {
    border: 0;
    padding: 20px;
    font-size:18px;
    color:#CAAD75;
    background-color: #FDF8E4;
    overflow: auto;
}
.ui-dialog .ui-dialog-buttonpane {
    text-align: left;
    border-width: 1px 0 0 0;
    background-image: none;
    margin-top: .5em;
    padding: .3em 1em .5em .4em;
    background-color: #846733;
 }
.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset {
    float: right;

}
.ui-dialog .ui-dialog-buttonpane button {
    margin: .5em .4em .5em 0;
    cursor: pointer;

}
.ui-dialog .ui-resizable-se {
    width: 12px;
    height: 12px;
    right: -5px;
    bottom: -5px;
    background-position: 16px 16px;

}
.ui-draggable-handle {
    -ms-touch-action: none;
    touch-action: none;
}

фрагмент здесь

0 голосов
/ 29 апреля 2019

Как прокомментировал Реджеп Карадас, этот пост имеет ответ.

https://stackoverflow.com/a/48280549/1390791

В Bootstrap 4, forceceFocus был переименован в _enforceFocus.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...