【问题标题】:How to prevent lost focus in bootstrap modal?如何防止在引导模式中失去焦点?
【发布时间】:2015-11-28 11:19:42
【问题描述】:

看看 boostrap 网站本身:

http://getbootstrap.com/javascript/#modals-related-target

虽然它与本段中的主题无关,但您可以打开带有输入字段的模式并尝试以下操作:聚焦输入字段,键入一些字符,切换到另一个窗口或浏览器选项卡,然后来回到模态。在 Firefox 中,焦点输入不再是焦点。

如何重新聚焦最后一个聚焦的元素?或者我怎么能防止焦点丢失?

更新:提交了一个问题on GitHub

【问题讨论】:

    标签: firefox twitter-bootstrap-3 focus bootstrap-modal


    【解决方案1】:

    除了@SHAZ 解决方案,您还需要$(window).focus() 函数在浏览器选项卡处于活动状态时聚焦输入

    $(function(){
       $('#myModal').on('shown.bs.modal', function () {
          $('#myTextId').focus()
       });
    });
    
    $(window).focus(function () {
       var input = document.getElementById("myTextId").focus();
    });
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" />
          
    <!-- Button trigger modal -->
    <button type="button" class="btn btn-primary" data-toggle="modal" data-target="#myModal">
      Launch demo modal
    </button>
    
    <!-- Modal -->
    <div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel">
      <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" id="myModalLabel">Modal title</h4>
          </div>
          <div class="modal-body">
            <input type="text" id="myTextId" class="form-control" autofocus/>
          </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>
    
    
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js"></script>

    Fiddle

    【讨论】:

    • 好的,这应该可以工作。它仍然要求 LAST 聚焦的元素重新聚焦(需要存储在某个地方),并且如果模式未打开,则 $(window).focus() 将关闭。
    【解决方案2】:

    bootstrap's modal 每次打开时,只需 focus() 您的输入字段。为此使用以下代码:

    $(function(){
       $('#myModal').on('shown.bs.modal', function () {
          $('#myTextId').focus()
       });
    });
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" />
          
    <!-- Button trigger modal -->
    <button type="button" class="btn btn-primary btn-lg" data-toggle="modal" data-target="#myModal">
      Launch demo modal
    </button>
    
    <!-- Modal -->
    <div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel">
      <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" id="myModalLabel">Modal title</h4>
          </div>
          <div class="modal-body">
            <input type="text" id="myTextId" class="form-control" autofocus/>
          </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>
    
    
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js"></script>

    【讨论】:

    • 对我不起作用。 AFAIK shown.bs.modal 仅触发一次:当模式打开时,而不是在焦点暂时位于其他位置后窗口再次获得焦点时。
    【解决方案3】:

    我一直致力于解决此类问题的可访问性修复(通过模态弹出保持键盘焦点)。

    这是我的代码:

    $("Your modal id").on('shown.bs.modal', function(event) {
        window.setTimeout(function(){
            $('.close').focus();
        }, 1000);
    });
    

    上面的代码将在模态弹出窗口中聚焦指向 CLOSE (X) 图标的指针。

    使用模态保持焦点(键盘标签导航):

    一旦标签焦点到达关闭按钮:

     <a class="btn btn-default grey_btn" align="center" data-dismiss="modal" onkeydown="focusToClose(event);" href="#" target="_self"><span class="text">Close</span></a>
    
        function focusToClose(e)
        {
            if((e.key == 'Tab' || e.code == 'Tab') && !e.shiftKey)
            {
                e.preventDefault();
                 $('#closeIcon').focus();
            }
        }
    

    CLOSE (X) 按钮代码:

    <button type="button" onKeyDown="blockFocus(event);" class="close" id="closeIcon" data-dismiss="modal" aria-label="Close">
        <span aria-hidden="true">&times;</span>
    </button>
    

    编码愉快.. :)

    【讨论】:

    • 请花几分钟时间来格式化您的答案。提示:行首有 4 个空格,以下文本将被格式化为代码。那可能不是你想要的。干杯。
    猜你喜欢
    • 2013-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-15
    • 2013-11-26
    相关资源
    最近更新 更多