Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 589|回复: 0

Bootstrap模态对话框嵌套bug的解决方案

[复制链接]
  • TA的每日心情
    奋斗
    3 小时前
  • 签到天数: 793 天

    [LV.10]以坛为家III

    2049

    主题

    2107

    帖子

    72万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    723458
    发表于 2021-7-10 00:36:28 | 显示全部楼层 |阅读模式

    最近在用Bootstrap做项目,越来越发现这是个很好的框架。不过在用的同时也遇到了不少的问题,不过都已经自行解决啦。下面是我对于Bootstrap模态对话框嵌套bug的研究。

    什么是模态对话框的嵌套

    Bootstrap不用多说了。Bootstrap自带有模态对话框插件,使用起来很方便,只需按照如下格式定义html,然后用js触发,或者用指定data属性的普通html元素来触发。下面来看一段出现问题的代码:

    <div id="part1" class="modal fade">
            <div class="modal-dialog">
              <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">技术部</h4>
                </div>
                <div class="modal-body">
                </div>
                <div class="modal-footer">
                  <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
                  <button type="button" class="btn btn-primary" data-dismiss="modal" data-toggle="modal" data-target="#signup">快速报名</button>
                </div>
              </div><!-- /.modal-content -->
            </div><!-- /.modal-dialog -->
          </div><!-- modal -->
    

    其中定义了data-dismiss="modal"属性的按钮用于关闭该模态对话框,称其为“关闭”按钮。一般情况下,这样的默认设置没有任何问题。但在项目中遇到的问题是:所设计设计的"modal-footer"里面的内容有一个按钮,包含另一个子模态对话框的定义时,问题就出现了。子模态对话框弹出之后,点击其“关闭”按钮,会顺带着把父模态对话框给关闭掉。要解决这样的问题,或者说是Bootstrap的一个bug,就需要查看源码了。

    Bootstrap相关的源码研究

    好不容易找到了相关的源码。查看Bootstrap 2.3.1版(未压缩)的源码,在872行可以找到如下函数,它定义了模态对话框类的构造函数:

    var Modal = function (element, options) {
        this.options = options
        this.$element = $(element)
          .delegate('[data-dismiss="modal"]', 'click.dismiss.modal', $.proxy(this.hide, this))
        this.options.remote && this.$element.find('.modal-body').load(this.options.remote)
      }
    

    Modal对象的构造在模态对话框显示之前进行。我们不用关心具体的实现细节,只需看到代码第3-4行将模态对话框的“隐藏”方法(hide)委托给带有data-dismiss="modal"属性的元素的click事件,通俗点说就是:找到父模态对话框中所有带data-dismiss="modal"属性的“关闭”元素,对其指定一个click事件处理函数,在这个函数中关闭该模态对话框。当子页面中包含“关闭”元素时,它也会被赋予父对话框的关闭操作,因此点击子页面(子模态对话框)的“关闭”元素就顺带把父模态对话框给关闭了!找到了问题的原因,我们只需根据需要,修改相应的选择器即可。只需在选择器后面添加一个:first过滤器,意为选择父模态对话框中的第一个“关闭”元素即可:

    var Modal = function (element, options) {
        this.options = options
        this.$element = $(element)
          .delegate('[data-dismiss="modal"]:first', 'click.dismiss.modal', $.proxy(this.hide, this))
        this.options.remote && this.$element.find('.modal-body').load(this.options.remote)
      }
    

    问题解决。

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-9-18 17:38 , Processed in 0.055891 second(s), 29 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表