【问题标题】:How to get Twitter Bootstrap Modal's invoker element?如何获取 Twitter Bootstrap Modal 的调用者元素?
【发布时间】:2012-07-19 04:45:06
【问题描述】:

我有一个a 用于调用模态的元素:

<a class="btn" data-toggle="modal" data-target="#myModal" href="http://some-url" >Launch Modal</a>

而且,说这是我的模态:

<div class="modal hide" id="myModal">
  <div class="modal-header">
    <button type="button" class="close" data-dismiss="modal">×</button>
    <h3>Modal header</h3>
  </div>
  <div class="modal-body">
    <p>One fine body…</p>
  </div>
  <div class="modal-footer">
    <a href="#" class="btn" data-dismiss="modal">Close</a>
    <a href="#" class="btn btn-primary">Save changes</a>
  </div>
</div>

我可以将函数绑定到模态触发的事件:

$('#myModal').on('hidden', function () {
  // do something…
})

我的问题是:如何从我的事件订阅者函数访问 a 元素 - 它调用了模态 -?

【问题讨论】:

  • $("a[href='#myModal']") 将选择 a 标记。这就是你要找的东西吗?
  • 不,实际上并非如此。因为它可以是任何东西而不是#mymodal。我正在寻找的是:event.relatedTarget 或 event.OriginalTarget 或类似的东西。
  • 不是必须是#mymodal 才能启动模态mymodal 吗?您可以将“mymodal”替换为包含事件所在元素的 ID 的变量。
  • 当然但是,模态的内容将使用 ajax 加载。所以可以有多个 a 元素指向同一个模态。我需要找到点击的元素,获取它的 href 属性并将其加载到模态中。
  • 我不明白...您想在单击链接时触发事件吗?为什么模态的加载方式很重要?如果您有多个链接启动一个模式,您是否需要从单击的模式中获取另一个(唯一)属性?

标签: javascript twitter-bootstrap modal-dialog


【解决方案1】:

目前它不能开箱即用。如果您想自己编辑引导模式代码,则有一个功能请求和解决方法。

here

【讨论】:

  • 有一个pull request 提交,但由于某种原因被拒绝。这是我非常希望看到的功能。
【解决方案2】:

就像你说的那样,我不得不绑定一些与“调用者”相关的数据。 我设法通过将“点击”事件绑定到它并使用如下数据来解决它:

调用者

<img id="element" src="fakepath/icon-add.png" title="add element" data-toggle="modal" data-target="#myModal" class="add">

获取调用者相关数据的JS(只是一些代码示例)

$('#element').on('click', function () { // Had to use "on" because it was ajax generated content (just an example)
    var self = $(this);
});

像这样,您可以随心所欲地处理与调用者相关的数据。

【讨论】:

    【解决方案3】:

    你必须听:

    $('[data-toggle="modal"]').on('click', function() {
        $($(this).attr('href')).data('trigger', this);
    });
    $('.modal').on('show.bs.modal', function() {
        console.log('Modal is triggered by ' + $(this).data('trigger'));
    });
    

    您当然可以用show.bs.modal 或它们触发的任何其他事件替换show.bs.modal。 请注意,这适用于 Bootstrap 3.0.0。如果您使用的是 2.3.2,则需要摆脱 .bs.modal(我认为)。

    我喜欢这个解决方案的一点:您不必记住谁是thisselfthat等代理调用的变通办法。

    当然,你要测试href属性是否不是真正的链接(动态模式加载选项)。

    【讨论】:

    • 对我来说最好的选择。而且,是的,在 2.3.2 中,您需要删除 .bs.modal。
    • 非常聪明的解决方案!我希望我能多次支持这个解决方案。我的问题是一个模态是从多个元素触发的,我希望在单击模态内的按钮时触发元素。虽然使用show.bs.modalevent.relatedTarget 的传统路线是可能的,但我最终会进行不必要的unbind() 调用和/或牺牲性能。再次干杯!
    【解决方案4】:

    感谢event.relatedTarget,它已在 Bootstrap 3.0.0 中解决。

    $('#your-modal').on('show.bs.modal', function (e) {
      var $invoker = $(e.relatedTarget);
    });
    

    【讨论】:

    • 如果我想知道调用隐藏模式的元素怎么办?
    • 好问题 axel,目前似乎还没有什么。
    • 优雅的解决方案,比在元素上注册点击事件要好得多
    【解决方案5】:

    模态元素有一个名为modal 的数据对象,它保存了所有传递的选项。您可以在触发模式的元素上设置“源”数据属性,将其设置为源的 ID,然后稍后从 options 变量中检索它。

    触发器是:

    <a id="launch-modal-1" class="btn" data-toggle="modal" data-target="#myModal" href="http://some-url" data-source="#launch-modal-1">Launch Modal</a>
    

    在事件回调中,获取modal数据对象,查看source选项:

    $('#myModal').on('hidden', function () {
      var modal = $(this).data('modal');
      var $trigger = $(modal.options.source);
      // $trigger is the #launch-modal-1 jQuery object
    });
    

    【讨论】:

    • 这最初似乎对我有用,但一旦我有多个来源,它就停止工作了。模态似乎保留了第一次调用时的选项,因此无论您首先单击哪个锚点,它都会在所有后续操作中使用该锚点的数据源。
    猜你喜欢
    • 2012-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-25
    相关资源
    最近更新 更多