我尝试在另一个模态内有一个模态。但是,我遇到了类似too much recursion
Firefox的错误。
我使用了最新的 jQuery 和 Twitter 引导程序,但仍然有这个问题。
这是显示错误的plunker
您可以在控制台Uncaught RangeError: Maximum call stack size exceeded
或too much recursion
有谁知道如何修理它?谢谢
我尝试在另一个模态内有一个模态。但是,我遇到了类似too much recursion
Firefox的错误。
我使用了最新的 jQuery 和 Twitter 引导程序,但仍然有这个问题。
这是显示错误的plunker
您可以在控制台Uncaught RangeError: Maximum call stack size exceeded
或too much recursion
有谁知道如何修理它?谢谢
您可以应用 maxisam 答案的第一个解决方案,而无需修改引导程序文件(如果您不能或不想)。
只需在包含引导程序文件后的某处写下这一行。
$.fn.modal.Constructor.prototype.enforceFocus = function () {};
注意:这仅在 Bootstrap 2 上测试过,没有在 Bootstrap 3 上测试过。
好吧,看来是发现了一个问题。
(显然我应该使用关键字“未捕获的范围错误:超出最大调用堆栈大小”而不是“递归过多”:()
以下是解决方案。
1.修改modal.js
在这篇文章中,https://github.com/twbs/bootstrap/pull/5022
@onassar 提出解决方案
跟进:对于使用 bootstrap-modal v2.2.0 的任何人,在 enforceFocus 方法中,注释掉 that.$element.focus() 似乎可以解决这个问题。
这样做的结果是模态不会被关注(pfft,我自己可以做到:P),因此,多个模态不会相互挑战焦点(这导致了无限循环,并且范围错误/递归循环)。
希望有帮助:)
我试过了,它有效。(笨蛋)
看起来它工作得很好。
3.等待官方解决。
在他们的路线图中,他们确实想在某个时候重写这个模态插件。
不幸的是,SmartLove 的回答不够完善;如果你要 no-op $.fn.modal.Constructor.prototype.enforceFocus
,你应该在你的模态关闭时重置它;以下直接来自我们的代码,我毫不犹豫地投入生产:
// Since confModal is essentially a nested modal it's enforceFocus method
// must be no-op'd or the following error results
// "Uncaught RangeError: Maximum call stack size exceeded"
// But then when the nested modal is hidden we reset modal.enforceFocus
var enforceModalFocusFn = $.fn.modal.Constructor.prototype.enforceFocus;
$.fn.modal.Constructor.prototype.enforceFocus = function() {};
$confModal.on('hidden', function() {
$.fn.modal.Constructor.prototype.enforceFocus = enforceModalFocusFn;
});
$confModal.modal({ backdrop : false });
4. 或者您可以在显示新模态时执行以下操作:
关闭新模态时,显示以前隐藏的模态
var showModal = function ($dialog) {
var $currentModals = $('.modal.in');
if ($currentModals.length > 0) { // if we have active modals
$currentModals.one('hidden', function () {
// when they've finished hiding
$dialog.modal('show');
$dialog.one('hidden', function () {
// when we close the dialog
$currentModals.modal('show');
});
}).modal('hide');
} else { // otherwise just simply show the modal
$dialog.modal('show');
}
};
注意:我$.one
过去只应用一次监听器而不关心bind
/ unbind
( on
/ off
)
对于 Bootstrap 4,替换 :
$.fn.modal.Constructor.prototype.**enforceFocus**
By
$.fn.modal.Constructor.prototype.**_enforceFocus**