【问题标题】:Bootstrap modal 'loaded' event on remote fragment远程片段上的引导模式“加载”事件
【发布时间】:2013-09-23 12:29:56
【问题描述】:

我目前正在使用 Twitter Bootstrap 模态组件,我遇到了一个问题,我在使用 data-remote 属性远程加载的内容中的输入字段上使用 jquery 验证插件。

由于在 dom 中运行 jquery 验证后才加载内容,因此不会对新加载的元素进行验证。

我有一个解决方案,我修改 bootstrap.js(模态类),见下文。

  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)

    this.options.remote && this.$element.find('.modal-body').load(this.options.remote, $.proxy(function () {
        this.$element.trigger('loaded')
    }, this)) //my additions
  }

我触发加载外部 html 片段的调用的“加载”事件。

我已经连接了这个事件,我在新加载的元素上调用了验证。

$('#myModal').on('loaded', function () {
                $.validator.unobtrusive.parse($(this));
            });

我的问题是我必须修改 bootstrap.js 来实现这一点,有没有办法可以在不修改 bootstrap.js 的情况下让它在外部工作?有没有办法访问页面上的模态对象并将“加载”事件附加到它?我想在外部脚本或页面中执行此操作,因此我无需担心引导版本。

【问题讨论】:

  • 在模态的shown 事件中进行验证是否有问题?
  • @mccannf 对于远程内容,在加载新元素之前显示的触发器。

标签: javascript asp.net-mvc-4 twitter-bootstrap jquery-validate unobtrusive-validation


【解决方案1】:

这里只是更新:

Bootstrap 添加了加载事件。

http://getbootstrap.com/javascript/#modals

捕获模态框上的“loaded.bs.modal”事件

$('#myModal').on('loaded.bs.modal', function (e) {
  // do cool stuff here all day… no need to change bootstrap
})

【讨论】:

  • 谢谢你让我的头上不再有头发!
  • 请去掉最后一行的'。它应该是 }) 而不是 }')
  • 此事件仅在模态内容使用远程选项加载时有效,如果内容嵌入到 html 模态中不起作用
  • 知道什么时候添加的吗?它不适合我
  • 当我们需要在 bootstrap remote modal 中加载脚本后调用函数时工作。谢谢。
【解决方案2】:

根据这两个问题:

https://github.com/twbs/bootstrap/issues/5169

https://github.com/twbs/bootstrap/pull/6846

..截至目前,Bootstrap 开发人员正在全力以赴,拒绝在 Bootstrap 中添加loaded 事件。

因此,他们建议您避免使用 data-remote 标记并自己将数据加载到模式中:

$('#myModal').modal(your_options).find('.modal-body').load('request_url', function () {
  // do cool stuff here all day… no need to change bootstrap
}')

【讨论】:

【解决方案3】:

'loaded.bs.modal' 事件对我不起作用,所以我尝试了 'shown.bs.modal' 事件,它工作正常:

$('#myModal').on('shown.bs.modal', function () {
   // do cool stuff here...
});

该事件在模态显示后被捕获。

我希望这会对某人有所帮助:)

【讨论】:

  • 模态框先显示,然后加载远程内容,所以不起作用
  • 这与问题无关。该问题涉及 ajax 加载的内容,并且“显示”永远不会作为 ajax 响应的产物而触发。
  • 也为我工作。我的 modal-body 加载了 ajax,然后显示。也许与问题无关,但对我们中的一些人有帮助:-)
【解决方案4】:

我有一个相当有趣的问题,在我的例子中,在本地主机上,事件 loaded.bs.modal 正在触发事件 shown.bs.modal 之前,因为在本地主机上从“ remote" url(这是本地 btw),甚至在引导程序完成其转换并触发 shown.bs.modal 事件之前就立即发生了。

但在网络服务器上,事件按感知顺序触发。

首先触发了shown.bs.modal,然后由于远程URL的实际延迟,触发了事件loaded.bs.modal

我想要的是抓住最后发生的事件。

所以为了解决这个问题,我想出了我自己的实现,如下所示。 YMMV,现在这里有很多假设,所以把下面的代码当作一个 POC 和一粒盐,而不是一个完整的代码。

jQuery('#myModal').on('shown.bs.modal', function () {
    if (jQuery(this).find('.resetFlag').length) {
        // Do something ONLY IF "loaded.bs.modal" hasn't yet been triggered
    }
});
jQuery('#myModal').on('loaded.bs.modal', function (e) {

    if (jQuery(this).find('.resetFlag').length) {
        // Do something ONLY IF "shown.bs.modal" hasn't yet been triggered
        } else  {
        // Do something ONLY IF "shown.bs.modal" hasn already been triggered
        }
});
jQuery('#myModal').on('hidden.bs.modal', function () {
    jQuery('#myModal .modal-content').html('<div class="resetFlag" style="display:none;"></div>');
    showModalLoader();
});

【讨论】:

    【解决方案5】:

    Boostrap 3.3 的模态事件有loaded.bs.modal 事件。

    但是在Bootstrap 4 的模态事件中没有这个事件。我建议使用 shown.bs.modal 事件,因为它在 CSS 渲染后触发

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-10-11
      • 2013-07-16
      • 1970-01-01
      • 2016-04-17
      • 2012-09-27
      • 1970-01-01
      • 2019-04-21
      相关资源
      最近更新 更多