Bootstrap 从 jQuery UI 调用的模态对话框:超出最大调用堆栈大小
Bootstrap modal called from jQuery UI Dialog: Maximum call stack size exceeded
我遇到了一个奇怪的问题。我正在调用一个 Bootstrap 模式,同时有一个 jQuery UI 对话框打开并且在控制台中得到 RangeError: Maximum call stack size exceeded.
奇怪的是,只有当我在对话框打开时调用模式时才会发生这种情况。
它似乎没有任何明显的副作用,但我宁愿错误不存在。
当我点击 Bootstrap 模式中的任一按钮时,我也会遇到同样的错误。
我正在使用 Bootstrap 版本 4.1.0,jQuery 版本 3.3.1 和 jQuery UI 版本 1.12.1
由于应用程序的构建方式,我需要对话框是模态的,但是当在所述对话框中执行特定操作时,Bootstrap 模态会在其顶部弹出。
在显示 Bootstrap 模态之前更改对话框的模态状态似乎也无法解决问题。
虽然我觉得这可能与将两者都设置为模态有关,但我在这里遗漏了什么明显的东西吗?
整个项目复杂而庞大,所以我在下面放了几个片段:
//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">×</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>
您可以尝试在打开的对话框中调用另一个对话框。 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;
}
正如 Recep Karadas 评论的那样,post 有答案。
在 Bootstrap 4 中,enforceFocus 已重命名为 _enforceFocus。
从模态中删除 tabindex="-1"
对我有用:
<div class="modal fade" id="bootStrapModal" role="dialog" aria-labelledby="ModalCenterTitle" aria-hidden="true">
我遇到了一个奇怪的问题。我正在调用一个 Bootstrap 模式,同时有一个 jQuery UI 对话框打开并且在控制台中得到 RangeError: Maximum call stack size exceeded.
奇怪的是,只有当我在对话框打开时调用模式时才会发生这种情况。 它似乎没有任何明显的副作用,但我宁愿错误不存在。
当我点击 Bootstrap 模式中的任一按钮时,我也会遇到同样的错误。
我正在使用 Bootstrap 版本 4.1.0,jQuery 版本 3.3.1 和 jQuery UI 版本 1.12.1
由于应用程序的构建方式,我需要对话框是模态的,但是当在所述对话框中执行特定操作时,Bootstrap 模态会在其顶部弹出。 在显示 Bootstrap 模态之前更改对话框的模态状态似乎也无法解决问题。
虽然我觉得这可能与将两者都设置为模态有关,但我在这里遗漏了什么明显的东西吗?
整个项目复杂而庞大,所以我在下面放了几个片段:
//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">×</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>
您可以尝试在打开的对话框中调用另一个对话框。 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;
}
正如 Recep Karadas 评论的那样,post 有答案。
在 Bootstrap 4 中,enforceFocus 已重命名为 _enforceFocus。
从模态中删除 tabindex="-1"
对我有用:
<div class="modal fade" id="bootStrapModal" role="dialog" aria-labelledby="ModalCenterTitle" aria-hidden="true">