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.
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 /
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.
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);
});
vous pouvez utiliser l'élément autofocus
html pour définir l'autofocus.
<textarea id="textareaID" autofocus="" ></textarea>
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);
});
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);
});
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>
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.
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
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()
})
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/
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.
<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>