Bootstrap Twitter-Focus sur textarea à l'intérieur d'un modal sur le clic

commence juste à jouer avec bootstrap et c'est incroyable.

j'essaie de comprendre. J'ai un textarea pour commentaires à l'intérieur d'une fenêtre modale. Il fonctionne très bien. Mais je veux que l'accent soit mis sur le textarea lorsque vous cliquez sur le bouton pour activer le modal. Et je n'arrive pas à le faire fonctionner.

voici un violon: http://jsfiddle.net/denislexic/5JN9A/4/

voici le code:

<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>​

voici le JS

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

pour reprendre Lorsque je clique sur" Lancer modal", je veux que le modal apparaisse et que l'accent soit mis sur le textarea.

Merci pour votre aide.

68
demandé sur user2771704 2012-07-24 20:01:10

13 réponses

cela ne fonctionne pas parce que lorsque vous cliquez sur le bouton le modal n'est pas encore chargé. Vous devez accrocher la mise au point à un événement , et aller à la modals de bootstrap page nous voyons l'événement shown , que is fired when the modal has been made visible to the user (will wait for css transitions to complete) . Et c'est exactement ce que nous voulons.

essayez ceci:

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

Voici votre violon mis à jour: http://jsfiddle.net/5JN9A/5 /


mise à jour:

comme @MrDBA notes, dans Bootstrap 3 le nom de l'événement est changé en shown.bs.modal . Ainsi, pour Bootstrap 3 utiliser:

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

nouveau violon pour Bootstrap 3: http://jsfiddle.net/WV5e7 /

202
répondu scumah 2017-05-23 12:18:23

je voulais en avoir une version déclarative, donc je suis allé avec la suivante:

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

vous pouvez alors simplement ajouter une propriété data-modalfocus à votre champ, comme suit :

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

et quand le modal apparaît, votre champ se focalisera.

19
répondu Alexandre Roger 2016-12-16 11:57:39

Bootstrap3

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

Bootstrap 2

$(window.document).on('shown', '.modal', function() {
    window.setTimeout(function() {
        $('[autofocus]', this).focus();
    }.bind(this), 100);
});
11
répondu Jonas Sciangula Street 2016-06-08 15:11:40

vous pouvez utiliser l'élément autofocus html pour définir l'autofocus.

<textarea id="textareaID" autofocus="" ></textarea>

Violon ici (Clic)

4
répondu Chancho 2013-12-26 22:42:00

si votre modal possède la propriété "fade":

cela va fonctionner, mais vous pourriez avoir à ajuster la durée de la temporisation et évidemment les IDs où nécessaire:

$("#ID-of-modal").on('show', function(event){
                window.setTimeout(function(){
                  $(event.currentTarget).find('input#ID-of-input').first().focus()
                }, 0175);
              });
1
répondu Semaj Nekeerv 2013-08-23 18:09:35

j'avais des problèmes majeurs avec chrome... J'espère que cela aide quelqu'un.

//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);

    });
1
répondu Davis 2013-12-26 16:01:40

comme mentionné dans l'un des commentaires, vous devez supprimer fade de votre modal. Donc cela fonctionne pour moi:

 <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
répondu tokhi 2015-04-27 16:06:43

je voulais quelque chose de plus générique

    $(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);
    });

avec ceci, je donne n'importe quel contrôle que je veux la classe CSS premier débit. Il y a un léger retard dans la mise au point qui lui donne un certain flair.

1
répondu John Grabauskas 2016-02-19 21:46:22

Je ne sais pas pourquoi, mais la solution choisie ne fonctionne pas pour moi.. J'utilise l'extrait de code suivant à la place:

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

je sais que ce n'est pas si joli, mais au moins ça marche.. Bootstrap v2.3.0

0
répondu nKognito 2013-08-26 10:54:08

si vous utilisez bootstrap v3 et que vous utilisez à la fois le Dialogue modal et l'éditeur de texte wysihtml5, les travaux suivants (en supposant que #basic est L'ID de votre forme modale):

    $('#basic').on('shown.bs.modal', function () {
    editor.composer.element.focus()
})
0
répondu Ryan 2014-01-28 22:52:32

Fixation de l'événement directement à l'écran modal n'a pas fonctionné pour moi. J'utilise ce code à la place:

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

avec ce code j'ai seulement besoin de changer myField pour l'id du contrôle que je veux avoir le focus, il me permet aussi de définir le focus pour les écrans modaux multiples, j'ai quelque chose comme:

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

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

0
répondu Juan 2015-07-23 13:57:16

Trouvé en train de faire:

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

fonctionne bien car il trouve juste la première forme-contrôle plutôt que d'avoir besoin d'un id spécifique, etc. Être juste ce qui est nécessaire la plupart du temps.

0
répondu SimonKiteley 2015-08-12 13:30:58
<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>
-1
répondu Jeremias Pereira 2013-10-11 12:24:54