Bootstrap模态框完全加载显示后触发事件的技术问询
解决Bootstrap模态框加载远程内容后读取控件值的问题
嘿,我明白你的困扰——用remote加载模态框时,hidden.bs.modal完全不对路子,那是模态框隐藏时触发的事件,根本帮不上忙。要等模态框完全加载内容并显示在页面上之后再读取控件,你可以根据Bootstrap版本用下面的方案:
Bootstrap 3 解决方案
Bootstrap 3的remote选项会自动加载远程内容到模态框,而shown.bs.modal事件刚好是在模态框完全显示(包括动画结束)、且远程内容已经插入DOM之后触发的,这正是你要的时机!
你可以这么写代码:
// 打开模态框 $('#myModal').modal({ remote: '/AccountsContact/ModalAssignCustomer?iACCO_KEY=' + iACCO_KEY }); // 绑定shown事件,确保内容加载完且模态框显示后执行 $('#myModal').off('shown.bs.modal').on('shown.bs.modal', function () { // 这里可以安全读取模态框内的控件了 const customerId = $(this).find('#customerIdInput').val(); const customerName = $(this).find('#customerNameSelect').val(); console.log('读取到的客户ID:', customerId); // 执行你的业务逻辑 });
这里用off('shown.bs.modal')是为了避免重复绑定事件——如果多次打开模态框,不会触发多次回调。
另外,如果你只需要等远程内容加载完成(不管模态框有没有显示),可以用loaded.bs.modal事件,但通常shown.bs.modal更符合“模态框显示后”的需求。
Bootstrap 4+ 解决方案
从Bootstrap 4开始,官方移除了remote选项,所以得手动用AJAX加载内容,再插入模态框后显示:
// 手动AJAX请求远程内容 $.get('/AccountsContact/ModalAssignCustomer?iACCO_KEY=' + iACCO_KEY, function (content) { // 将内容插入模态框的content区域 $('#myModal .modal-content').html(content); // 显示模态框并绑定shown事件 $('#myModal').modal('show').on('shown.bs.modal', function () { // 这里放心读取控件值 const targetValue = $(this).find('#yourControlId').val(); // ...你的操作 }); });
这种方式能完全掌控内容加载和模态框显示的时机,避免旧版remote的潜在问题。
为什么之前的方法不行?
hidden.bs.modal:这个事件是在模态框隐藏时触发的,和你“显示后读取”的需求完全相反,肯定用不了。- 直接在打开模态框后立即读取:此时远程内容还没加载,模态框里的控件根本没生成,自然读不到值。
内容的提问来源于stack exchange,提问作者FrenkyB
相关产品推荐
相关产品推荐

