关闭第二模态后错误的焦点

时间:2017-09-08 11:49:22

标签: javascript vue.js components vuejs2 bootstrap-modal

我使用vue.js 2和bootsrap 3来打开一个打开第二个模态的模态。

几天前,我问了一个关于如何将注意力集中在第二模态中包含的控件上的问题。我找到了一个很好的answer解决了这个问题。

问题 打开第一个模态时,用户可以滚动查看其底部。但是在打开和关闭第二个模态后,焦点移动到包含第一个模态的页面。当用户滚动查看第一个模态的其余部分时,他会在第一个模态后面滚动页面。

特别是当模态大于屏幕高度时,使用起来非常不舒服。有办法防止这种情况吗?

要重现此问题,请打开answer,然后点击"展开代码段"

2 个答案:

答案 0 :(得分:2)

这是上一个答案的修改版本,在子模态关闭后将焦点设置回原始模态。

改变在这里:

$(this.$refs.submodal.$el).on("hidden.bs.modal", this.onShown)

这是在mounted处理程序中添加的。它为子模态的hidden.bs.modal事件添加了一个处理程序。它还会在组件被销毁时删除处理程序。

此外,因为关闭模态会删除模式打开时分配给正文的modal-open类,所以只要调用onShown,下面的代码就会将该类添加到正文中,以便滚动为不受父母模态的影响。

$("body").addClass("modal-open")

这是一个有效的例子。

console.clear()

Vue.component("sub-modal", {
  template: "#submodal",
  methods: {
    show() {
      $(this.$el).modal("show")
    },
    onShown(event) {
      console.log("submodal onshown")
      this.$refs.input.focus()
    }
  },
  mounted() {
   $(this.$el).on("shown.bs.modal", this.onShown)
  },
  beforeDestroy() {
    $(this.$el).off("shown.bs.modal", this.onShown)
  }
})

Vue.component("modal", {
  template: "#modal",
  methods: {
    show() {
      $(this.$refs.modal).modal("show")
    },
    showSubModal() {
      this.$refs.submodal.show()
    },
    onShown(event) {
      console.log("parent")
      this.$refs.input.focus()
      // Add the "modal-open" class back to the body in case
      // it was removed by the sub modal
      $("body").addClass("modal-open")
    }
  },
  mounted() {
    $(this.$refs.modal).on("shown.bs.modal", this.onShown)
    $(this.$refs.submodal.$el).on("hidden.bs.modal", this.onShown)
  },
  beforeDestroy() {
    $(this.$refs.modal).off("shown.bs.modal", this.onShown)
    $(this.$refs.submodal.$el).on("hidden.bs.modal", this.onShown)
  }
})

new Vue({
  el: "#app",
})
<link href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet" />


<script src="https://unpkg.com/vue@2.2.6/dist/vue.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/js/bootstrap.min.js"></script>
<div id="app">
  <modal ref="modal"></modal>
  <button @click="$refs.modal.show()" class="btn">Show Modal</button>
</div>

<template id="submodal">
  <div class="modal fade" tabindex="-1" role="dialog">
    <div class="modal-dialog" role="document">
      <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">Modal title</h4>
        </div>
        <div class="modal-body">
          <input ref="input" type="text" class="form-control">
        </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><!-- /.modal-content -->
    </div><!-- /.modal-dialog -->
  </div><!-- /.modal -->

</template>

<template id="modal">
  <div>
    <div ref="modal" class="modal fade" tabindex="-1" role="dialog">

      <div class="modal-dialog modal-lg" role="document">
        <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">Modal title</h4>
          </div>
          <div class="modal-body" style="height: 80vh">
            Stuff
            <input ref="input" type="text" class="form-control">
          </div>
          <div class="modal-footer">
            <button @click="showSubModal" type="button" class="btn btn-primary">Show Sub Modal</button>
          </div>
        </div><!-- /.modal-content -->
      </div><!-- /.modal-dialog -->
    </div><!-- /.modal -->
    <sub-modal ref="submodal"></sub-modal>
  </div>
</template>

答案 1 :(得分:1)

对我有用:

$('#my-modal').on('hidden.bs.modal', function () {
        $('body').addClass('modal-open');
    });