【问题标题】:prevent bootstrap modal from opening when a button is clicked防止单击按钮时打开引导模式
【发布时间】:2015-03-08 04:07:38
【问题描述】:

我有一个包含几个引导模式的页面:

data-toggle="modal" data-target="#modal-12345"

问题是,我有一个可点击的整个表格行,比如

<tr data-toggle="modal" data-target="#modal-12345">

模态内容位于正下方的另一个隐藏表格行中,然后是下一个可点击行,依此类推。现在,这一行还包含一个按钮,单击该按钮将转到另一个页面。

我需要整行可点击,这样它才能打开模式,除非点击了转到其他页面的按钮,然后我需要阻止模式打开。

我需要这样的东西

<script>
$('.ID').on('click', '.btn', function(e) { e.stopPropagation(); })
</script>

但是针对这个:

data-toggle="modal"

我还尝试给 TR 一个“modaltoggle”类,然后使用 javascript 将其作为 .modaltoggle 调用,但这也不起作用。

【问题讨论】:

    标签: javascript jquery html css twitter-bootstrap


    【解决方案1】:

    为您不想触发模式的项目添加某种标识符,例如no-modal 之类的类,然后在您的jQuery 中为模式的show.bs.modal 事件添加代码。捕获相关元素,这是触发事件的元素,然后查看它是否具有您要查找的类。如果是,请运行e.stopPropagation()

    BOOTPLY

    jQuery

    $('#myModal').on('show.bs.modal', function (e) {
      var button = e.relatedTarget;
      if($(button).hasClass('no-modal')) {
        e.stopPropagation();
      }  
    });
    

    HTML

    <button type="button" class="btn btn-primary btn-lg" data-toggle="modal" data-target="#myModal">
      Launch demo modal
    </button>
    
    <button type="button" class="btn btn-primary btn-lg no-modal" data-toggle="modal" data-target="#myModal">
      Launch demo modal
    </button>
    
    <div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
      <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">×</span></button>
            <h4 class="modal-title" id="myModalLabel">Modal Header</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">Save changes</button>
          </div>
        </div>
      </div>
    </div>
    

    如您所见,第二个按钮有一个名为no-modal 的类。单击时,jQuery 会检查该类是否存在,如果存在,它会阻止模式弹出。单击第一个按钮会导致模态框正常弹出,因为它没有该类。

    Bootstrap 模态框会在它们被页面上的元素弹出时触发特定事件,从它们被触发的那一刻到它们完全弹出的那一刻。您可以通过查看官方文档中的 Events section 的 Bootstrap modals 来了解这些事件以了解您可以使用它们。

    【讨论】:

    • 这个答案不正确。它仅“起作用”,因为 stopPropegation 未定义,它会停止执行。正确的调用是使用“a”而不是 e 的 stopPropagation,但我试过了; stopPropagation 本身不能有效地阻止对话框出现。事实上,AoN 的解决方案更接近。我不确定为什么因为“返回错误”而被否决;确实正确地停止了执行和对话框的出现。如果要添加 return false;到 stopPropagation 之后的事件处理程序,它会正常工作。 (事实上​​,即使没有 stopPropagation 调用,它也可以工作。)
    • 是的,我也试过这个——同样的场景,其中一个单元格中有一行和一个按钮。 e 总是指行,而不是按钮。
    • 我试过 e.stopPropegation();它对我不起作用。我使用了 e.preventDefault(); e.stopImmediatePropagation();并工作。
    • 你有一个错字,stopPropegation 应该是 stopPropagation
    • 在 Bootstrap 3 中只有 e.preventDefault();return false; 可以正常工作。但请注意,如果您有处理程序在打开之前将模式的 id 添加到 url 哈希中,那么您可能需要先将其删除 (location.hash=''; return false;) 否则将无法正常工作。
    【解决方案2】:

    这是一个 JSFiddle 来演示我将要解释的内容:http://jsfiddle.net/68y4zb3g/

    正如 MattD 解释和演示的那样,阻止模态启动相当容易,尽管他的示例适用于标准模态应用程序。由于您在脚本代码中使用了.btn,因此我假设您已将其应用于所有相关按钮。我还假设您保留了类似于 Bootstrap 演示页面上的模式代码。如果您提供实际的表格代码,我可以根据您已有的内容对其进行专门定制。

    $('tr .btn').on('click', function(e) {
       e.stopPropagation();
    });
    td {
        border: 1px #000000 solid;
        padding: 10px;
    }
    <link href="http://getbootstrap.com/dist/css/bootstrap.min.css" rel="stylesheet"/>
    <link href="http://getbootstrap.com/dist/css/bootstrap-theme.min.css" rel="stylesheet"/>
    <script src="http://getbootstrap.com/assets/js/ie-emulation-modes-warning.js"></script>
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
    <script src="http://getbootstrap.com/dist/js/bootstrap.min.js"></script>
    
    <table>
        <tr data-toggle="modal" data-target="#modal-12345">
            <td>Launch modal 12345</td>
            <td><button id="btn-12345" class="btn">12345</button></td>
        </tr>
        <tr>
            <td colspan="2" class="modal fade" id="modal-12345" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
                <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" id="myModalLabel">Modal title</h4>
                        </div>
                        <div class="modal-body">
                            12345
                        </div>
                        <div class="modal-footer">
                            <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
                        </div>
                    </div>
                </div>
            </td>
        </tr>
    </table>

    注意:我用DIV 替换了TD,它通常用作模式的外部包装器,并添加了一些CSS 以便更容易看到内容中的分隔。

    通过使用应用于所有按钮的类,您不必为每个 ID 编写函数。话虽如此,我建议使用自定义类作为触发器。 .btn 是 Bootstrap 核心中的标准类,因此请尝试使用 .modalBtn,以防止与合法的 Bootstrap 功能发生任何冲突。

    希望这会有所帮助。 ^^

    【讨论】:

    • 这个答案是更正确的答案,值得标记为解决方案。我唯一的评论是它比 OP 要求的要多一点。也许是因为部分不相关而被否决。
    • 我也在尝试为自己使用这个解决方案。一旦模态被阻止一次,它就不会再次打开。我在打开模态之前进行了一些验证,如果验证失败,我不希望打开模态。我想提醒用户注意错误,一旦他们修复了错误,模式应该能够打开。
    • @BrentConnor 很好。老实说,我没有发现这一点。我已经修改了脚本来解决这个问题,让它忽略对TR 的点击,而不是试图阻止.modal 的启动。
    • @AoN 你能帮我解决一下my question too吗?
    【解决方案3】:
    $('#myModal').on('show.bs.modal', function (e) {
     return e.preventDefault(); 
    });
    

    <button type="button" class="custom" data-toggle="modal" data-target-custom="#myModal">Launch demo modal</button>
    <script>
    target = $(".custom").attr('data-target-custom');
    if(condition) {
     $(target).modal('show');
    }
    </script>
    

    e.stopPropagation();或 e.preventDefault();如果您要重新打开模式或页面中使用了多个模式,它将不起作用。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-19
    • 1970-01-01
    • 2018-05-10
    • 2017-12-12
    • 2020-06-21
    • 2015-07-07
    相关资源
    最近更新 更多