Twitter引导程序-专注于单击模式中的textarea


69

刚开始使用引导程序,这真是太神奇了。

我正在尝试解决这个问题。我在模态窗口中有一个textarea供反馈。效果很好。但是,我希望当您单击按钮以激活模式时,焦点将集中在文本区域上。而且我似乎无法正常工作。

这是一个小提琴:http : //jsfiddle.net/denislexic/5JN9A/4/

这是代码:

<a class="btn testBtn" data-toggle="modal" href="#myModal" >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">
      <textarea id="textareaID"></textarea>
  </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>

这是JS

$('.testBtn').on('click',function(){
    $('#textareaID').focus();
});​

继续 当我单击“启动模态”时,我希望模态显示出来,并将焦点放在文本区域上。

谢谢你的帮助。


Answers:


205

它不起作用,因为当您单击按钮时,模态尚未加载。您需要将焦点吸引到事件上,然后进入引导程序的模态页面,我们将看到事件shown,即is fired when the modal has been made visible to the user (will wait for css transitions to complete)。这正是我们想要的。

尝试这个:

$('#myModal').on('shown', function () {
    $('#textareaID').focus();
})
​

这是您的小提琴更新:http : //jsfiddle.net/5JN9A/5/


更新:

@MrDBA所述,在Bootstrap 3中,事件名称更改shown.bs.modal。因此,对于Bootstrap 3,请使用:

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

Bootstrap 3的新提琴:http : //jsfiddle.net/WV5e7/


11
注意:如果您的模态具有“淡入淡出”属性,则此方法可能不起作用,具体取决于似乎有些晦涩的计时条件(即模态不存在,无法完全接受焦点请求,直到完全聚焦淡入)。我只能通过删除衰落属性来设置对模态项的关注,这时我可以在.show()调用之后立即执行$('#textareaID')。focus()调用。YMMV,我想...
Jim Miller

1
谢谢Jim,这真让我烦恼,为什么没有设置焦点,但这是因为我渐渐淡了。如果可以的话,那会很棒。
chrisb 2013年

@chrisb您的意思是fade向您的模态添加一个类?它为我工作:jsfiddle.net/5JN9A/16如果我可以看到一个失败的示例,我可以尝试找到一种解决方法:P
scumah

6
FYI Bootstrap v3已将事件名称更改为show.bs.modal
MrDBA

6
注意事件名称。它必须是“ shown.bs.modal”,而不是“ show.bs.modal”。而且由于页面窗口未激活,因此无法通过Chrome在控制台中设置焦点。要解决此问题,您可以使用setTimeout
S3RK

21

我想要一个声明性的版本,因此我进行了以下操作:

$(document).ready(function() {
    $(".modal").on('shown.bs.modal', function () {
        $("[data-modalfocus]", this).focus();
    });
});

然后,您可以简单地将data-modalfocus属性添加到您的字段中,如下所示:

<input type="text" data-modalfocus />

当模式弹出时,您的领域将获得关注。


11

Bootstrap3

$(window.document).on('shown.bs.modal', '.modal', function() {
    window.setTimeout(function() {
        $('[autofocus]', this).focus();
    }.bind(this), 100);
});

引导程序2

$(window.document).on('shown', '.modal', function() {
    window.setTimeout(function() {
        $('[autofocus]', this).focus();
    }.bind(this), 100);
});

我的模态逐渐消失,所以我不得不将超时时间增加到500ms,但是除此之外,这个效果很好。
克里斯·布罗斯基

出色的Bootstrap3通用修复程序。高能量!
亚伦·休顿


1

如果您的模态具有“淡入淡出”属性:

这将起作用,但是您可能需要调整超时的持续时间,并且显然需要调整ID:

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

1

我在Chrome上遇到了重大问题...希望对您有所帮助。

//When user clicks link
$('#login-modal-link').on('click',function() {
        setTimeout(function(){
                //If modal has class
            if ($('#login-modal').hasClass('modal')) {
                //Whatever input you want to focus in
                $('#user_login_modal').focus();
            }
        },100);

    });

由于某些原因,所有回复均无效。.因此,以上帖子是我的解决方案,只是有人遇到与我相同的问题。
戴维斯

在jQuery 1.10.2中测试过| Bootstrap v3.0.3
Davis

1

如评论之一所述,您需要fade从模态中删除。所以这对我有用:

 <div id="myModal" class="modal">
    ...
    <textarea class="form-control" rows="5" id="note"></textarea>
  </div>

  <script>
    $('#myModal').on('shown.bs.modal', function () {
        $('#note').focus();
    })
  </script>

1

我想要一些通用的东西

    $(window.document).on('shown.bs.modal', '.modal', function () {
        var timer = window.setTimeout(function () {
            $('.firstInput', this).focus();
            typeof timer !== 'undefined' && window.clearTimeout(timer);
        }.bind(this), 100);
    });

这样,我就给了我想要CSS类firstInput所需的任何控件。设置焦点时会稍有延迟,使其具有一定的才能。


0

我不知道为什么,但是选择的解决方案对我不起作用。我改为使用以下代码片段:

$('#annul-modal').on('show', function() {
    setTimeout(function() {$('textarea:first', '#annul-form').focus();}, 400);
});

我知道它不是很漂亮,但至少可以正常工作。Bootstrap v2.3.0


0

如果您使用的是Bootstrap v3,并且同时使用了模式对话框和wysihtml5文本编辑器,则可以进行以下工作(假设#basic是模式窗体的ID):

    $('#basic').on('shown.bs.modal', function () {
    editor.composer.element.focus()
})

0

将事件直接附加到模式屏幕对我不起作用。我改用下面的代码:

$('body').on('shown.bs.modal', '.modal', function () {
  $('[id$=myField]').focus();
})

使用此代码,我只需要更改myField即可获取要获得焦点的控件的ID,它还允许我为多个模式屏幕定义焦点,例如:

      $('body').on('shown.bs.modal', '.modal', function () {
        $('[id$=YesCancel]').focus();
        $('[id$=YesInverted]').focus();
        $('[id$=cancelAddCustomer]').focus();
        $('[id$=closeHistoryModal]').focus();
      });

来源http://xcellerant.net/2014/08/06/set-focus-on-a-field-when-showing-a-bootstrap-3-modal/


1
为什么不使用直接$('#myField')。focus?
伊夫·马丁

@YvesMartin是的,应该只有一个具有相同名称的ID,并且在您指出时应选择该ID
LdN 2016年

是! 这样可行。我正在"shown.bs.modal"模态上直接尝试(即"#modalName"),但未触发事件。将其移动到身体是可行的。不幸的是,这意味着您在不进行测试的情况下并不真正知道触发了哪个模态...或者像您一样,将任何模态的第一项的焦点都放在了焦点上。
Alexis Wilke

0

发现正在做:

$(document).on('shown.bs.modal', function () {
  $(this).find('.form-control:visible:first').focus();
});

运作良好,因为它只是找到第一个表单控件,而不需要特定的id等。正是大多数时候需要的东西。


-1
<a href="" id="btnmoverCategoriaRaiz">Mover para a raiz...</a> 
      <script>
         $(function(){
            $("#btnmoverCategoriaRaiz").click(function(){
                $("#novoPlaylist").modal();
                return false;
            });
         });

       </script>    
 <div id="novoPlaylist" class= "modal  hide">
          <div class="modal-header">
            <h3>Novo Playlist</h3>
          </div>
          <div class="modal-body">
            <form class="form-horizontal">
              <?echo $form->input("Playlist.nome", array("label"=>"Nome:")) ?>
            </form>
          </div>
              <div class="modal-footer">
                 <a href="javascript:;" class="btn" data-dismiss="modal">Cancelar</a>
                 <a href="javascript:;" class="btn btn-primary" id="SalvarNomePlaylist" data-loading-text="Aplicando..."> Savar</a>
              </div>
      </div>

3
您应该就自己的所作所为发表一些评论,而不是强迫人们尝试改变
Dallas
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.