一旦出现,如何为Bootstrap模式中的特定字段设置焦点


182

关于引导程序模态,我已经看到了几个问题,但是没有一个完全像这样,所以我继续。

我有一个模态,我这样称呼onclick ...

$(".modal-link").click(function(event){
  $("#modal-content").modal('show');
});

这可以正常工作,但是当我显示模态时,我想关注第一个输入元素...在某些情况下,第一个输入元素的ID为#photo_name。

所以我尝试了

   $(".modal-link").click(function(event){
     $("#modal-content").modal('show');
     $("input#photo_name").focus();
   });

但这无济于事。最后,我尝试绑定到“ show”事件,但是即使如此,输入也不会集中。最后,仅出于测试目的,因为我怀疑这与js加载顺序有关,所以我设置了setTimeout只是为了查看是否延迟一秒钟,焦点会起作用,是的,它起作用了!但是这种方法显然是胡扯。有什么方法可以在不使用setTimeout的情况下达到与以下相同的效果?

  $("#modal-content").on('show', function(event){
    window.setTimeout(function(){
      $(event.currentTarget).find('input#photo_name').first().focus()
    }, 0500);
  });

Answers:


371

试试这个

这是旧的DEMO

编辑:( 这是使用Bootstrap 3和jQuery 1.8.3 的有效演示版

$(document).ready(function() {
    $('#modal-content').modal('show');
    $('#modal-content').on('shown', function() {
        $("#txtname").focus();
    })
});

启动引导程序3需要使用shown.bs.modal事件:

$('#modal-content').on('shown.bs.modal', function() {
    $("#txtname").focus();
})

3
谢谢。我没有看到“显示”事件。正是我想要的。
2012年

谢谢!演示不再起作用,但代码片段起作用了。
克雷克(Kreker)2014年

@keyur at codebins.com此事件在显示模态后开始,如果我必须在显示模态之前开始事件怎么办
Thomas Shelby

okej,我应该使用“ show.bs.modal”而不是“ shown.bs.modal”
Thomas Shelby

关于焦点处理程序,它需要一点延迟,因此您必须在setInterval中添加如下内容:setInterval(function(){$(“#your-input”)。focus();},50);
Nguyen Minh Hien

76

只是想说Bootstrap 3处理这个问题有所不同。事件名称为“ shown.bs.modal”。

$('#themodal').on('shown.bs.modal', function () {
   $("#txtname").focus();
});

或将焦点放在第一个可见的输入上,如下所示:

.modal('show').on('shown.bs.modal', function ()
{
    $('input:visible:first').focus();
})

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


它的工作对我来说,如果我用。对(“show.bs.modal”)未显示
彼得·格雷厄姆

我花了很多时间看到它应该是“ shown.bs ...”而不是“ show.bs ...”。节目没有为我工作。实际上,两者都在起作用,并且它们是不同的事件。对不起,请忽略我的第一句话。
Vladyn

@PeterGraham也许您正在使用bootstrap 2?
FindOutIslamNow18年

10

我在布局中使用它来捕获所有模态,并专注于第一个输入

  $('.modal').on('shown', function() {
     $(this).find('input').focus();
  });

甜。虽然我的第一个输入元素是隐藏的,所以我认为我必须这样做:$(this).find('input:not([type = hidden])')。focus();
jdkealy 2012年

2
$(this).find('input:visible').focus();
斯蒂芬·穆勒

2
如果您不想集中所有输入,则应为$(this).find('input')。first()。focus()
Jacek Pietal

9

我在使用引导程序3时遇到了同样的问题,单击链接时会出现焦点,但是在使用javascript触发事件时却没有。解决方案:

$('#myModal').on('shown.bs.modal', function () {
    setTimeout(function(){
        $('#inputId').focus();
    }, 100);
});

大概与动画有关!


模态动画肯定发生了一些事情。即使我在选项中关闭了模式淡入淡出,如果在模式弹出窗口之后有一个占用大量CPU的任务,它也不会呈现。使用此超时是使它正常工作的唯一方法。
krx

8

我遇到了“ shown.bs.modal”事件的问题。这是我的完美解决方案。

而是简单的on():

$('#modal').on 'shown.bs.modal', ->

将on()与委托元素一起使用:

$('body').on 'shown.bs.modal', '#modal', ->

6

似乎是因为启用了模态动画(fade在对话框的类中),调用后.modal('show'),该对话框不会立即可见,因此此时无法获得焦点。

我可以想到两种解决此问题的方法:

  1. fade从类中移除,因此调用后,对话框立即可见.modal('show')。您可以看到http://codebins.com/bin/4ldqp7x/4进行演示。(对不起,@ keyur,我错误地将其编辑并另存为示例的新版本)
  2. 像@keyur所写的那样focus()shown事件中调用。

谢谢。我希望我可以将两个答案标记为corrent:p。是的,我什至不希望“淡入淡出”有效,因此将其删除是可行的。我删除了淡入淡出并添加了所显示的事件。
2012年

4

我创建了一种动态方式来自动调用每个事件。专注于某个领域非常理想,因为它只调用一次事件,然后在使用后将其删除。

function modalEvents() {
    var modal = $('#modal');
    var events = ['show', 'shown', 'hide', 'hidden'];

    $(events).each(function (index, event) {
        modal.on(event + '.bs.modal', function (e) {
            var callback = modal.data(event + '-callback');
            if (typeof callback != 'undefined') {
                callback.call();
                modal.removeData(event + '-callback');
            }
        });
    });
}

你只需要打电话 modalEvents()文档即可。

用:

$('#modal').data('show-callback', function() {
    $("input#photo_name").focus();
});

因此,您可以使用相同的模式来加载所需的内容,而不必担心每次都会发生remove事件。


那就是我所需要的!多谢兄弟!
开发人员

3

我在bootstrap 3中遇到了同样的问题,并像这样解决了:

$('#myModal').on('shown.bs.modal', function (e) {
    $(this).find('input[type=text]:visible:first').focus();
})

$('#myModal').modal('show').trigger('shown');


0

引导模态秀事件

$('#modal-content').on('show.bs.modal', function() {
$("#txtname").focus();

})


-1

一个更干净,更模块化的解决方案可能是:

$(document).ready(function(){
    $('.modal').success(function() { 
        $('input:text:visible:first').focus();
    });  
});

或以您的ID为例:

$(document).ready(function(){
    $('#modal-content').modal('show').success(function() {
        $('input:text:visible:first').focus();
    });  
});

希望有帮助。


没有这样的功能成功。
阿维纳什(Avinash)2016年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.