J'ai configuré une boîte de dialogue modale de l'interface utilisateur jQuery à afficher lorsqu'un utilisateur clique sur un lien. Il y a deux zones de texte (je n'affiche que le code pour 1 par souci de concision) dans cette balise div de boîte de dialogue et elle est modifiée pour devenir une zone de texte jQuery UI DatePicker qui réagit au focus.
Le problème est que la boîte de dialogue de l'interface utilisateur jQuery (`` ouverte '') déclenche en quelque sorte la première zone de texte d'avoir le focus, ce qui déclenche alors l'ouverture immédiate du calendrier du sélecteur de date.
Je cherche donc un moyen d'empêcher la mise au point de se produire automatiquement.
<div><a id="lnkAddReservation" href="#">Add reservation</a></div>
<div id="divNewReservation" style="display:none" title="Add reservation">
<table>
<tr>
<th><asp:Label AssociatedControlID="txtStartDate" runat="server" Text="Start date" /></th>
<td>
<asp:TextBox ID="txtStartDate" runat="server" CssClass="datepicker" />
</td>
</tr>
</table>
<div>
<asp:Button ID="btnAddReservation" runat="server" OnClick="btnAddReservation_Click" Text="Add reservation" />
</div>
</div>
<script type="text/javascript">
$(document).ready(function() {
var dlg = $('#divNewReservation');
$('.datepicker').datepicker({ duration: '' });
dlg.dialog({ autoOpen:false, modal: true, width:400 });
$('#lnkAddReservation').click(function() { dlg.dialog('open'); return false; });
dlg.parent().appendTo(jQuery("form:first"));
});
</script>
javascript
jquery
jquery-ui
slolife
la source
la source
Réponses:
jQuery UI 1.10.0 Changelog répertorie le ticket 4731 comme étant corrigé.
On dirait que focusSelector n'a pas été implémenté, mais une recherche en cascade de divers éléments a été utilisée à la place. À partir du billet:
Alors, marquez un élément avec l'
autofocus
attribut et c'est l'élément qui devrait obtenir le focus:Dans la documentation , la logique du focus est expliquée (juste sous la table des matières, sous le titre 'Focus'):
la source
Ajoutez une étendue cachée au-dessus, utilisez ui-helper-hidden-accessible pour la rendre cachée par un positionnement absolu. Je sais que vous avez cette classe parce que vous utilisez le dialogue de jquery-ui et c'est dans jquery-ui.
la source
Dans jQuery UI> = 1.10.2, vous pouvez remplacer la
_focusTabbable
méthode prototype par une fonction placebo:Violon
Cela affectera tous les
dialog
s de la page sans qu'il soit nécessaire de les modifier manuellement.La fonction d'origine ne fait rien d'autre que définir le focus sur le premier élément avec l'
autofocus
attribut /tabbable
élément / ou revenir au dialogue lui-même. Comme son utilisation consiste simplement à mettre l'accent sur un élément, il ne devrait y avoir aucun problème à le remplacer par unnoop
.la source
$.noop
, remplacez-le par une fonction qui note la boîte de dialogue active, puis enregistrez un gestionnaire d'événement clé global qui intercepteESC
et ferme la boîte de dialogue 'active' s'il y en a une.À partir de jQuery UI 1.10.0, vous pouvez choisir l'élément d'entrée sur lequel vous concentrer à l'aide de l' autofocus d' attribut HTML5 .
Tout ce que vous avez à faire est de créer un élément factice comme première entrée dans la boîte de dialogue. Cela absorbera l'attention pour vous.
Cela a été testé dans Chrome, Firefox et Internet Explorer (toutes les dernières versions) le 7 février 2013.
la source
J'ai trouvé le code suivant la fonction de dialogue de l'interface utilisateur jQuery pour ouvrir.
Vous pouvez contourner le comportement jQuery ou modifier le comportement.
tabindex -1 fonctionne comme une solution de contournement.
la source
focusSelector
option) est censé être dans jQueryUI 1.8, et nous sommes maintenant à 1.8.13 et je ne le vois pas dans la documentation de la boîte de dialogue jQueryUI . Qu'est-il arrivé à ça?Je viens de comprendre cela en jouant.
J'ai trouvé avec ces solutions pour supprimer le focus, a provoqué l' ESCarrêt de la touche (c'est-à-dire fermer la boîte de dialogue) lors de la première entrée dans la boîte de dialogue.
Si la boîte de dialogue s'ouvre et que vous appuyez immédiatement sur ESC, elle ne fermera pas la boîte de dialogue (si vous l'avez activée), car le focus est sur un champ caché ou quelque chose, et il ne reçoit pas d'événements de pression de touche.
La façon dont je l'ai corrigé était d'ajouter ceci à l'événement open pour supprimer le focus du premier champ à la place:
Cela définit le focus sur la boîte de dialogue, qui n'est pas visible, puis la ESCclé fonctionne.
la source
Définissez le tabindex de l'entrée sur -1, puis définissez dialog.open pour restaurer tabindex si vous en avez besoin plus tard:
la source
Ma solution de contournement:
la source
:first
sélecteur ou.first()
dans FF / Chrome / IE9. Le jeter dans ladialogopen
reliure fonctionne aussi.open: function(){ $('a').blur(); // no autofocus on links }
J'avais un contenu plus long que le dialogue. À l'ouverture, la boîte de dialogue se déplacerait jusqu'au premier: tabbable qui était en bas. Voici ma solution.
la source
$('...').blur();
au lieu de faire défiler.Solution de contournement simple:
Créez simplement un élément invisible avec tabindex = 1 ... Cela ne focalisera pas le sélecteur de date ...
par exemple.:
la source
Voici la solution que j'ai implémentée après avoir lu le ticket d'interface utilisateur jQuery # 4731 , initialement publié par slolife en réponse à une autre réponse. (Le ticket a également été créé par lui.)
Tout d'abord, quelle que soit la méthode que vous utilisez pour appliquer la saisie semi-automatique à la page, ajoutez la ligne de code suivante:
Cela désactive le comportement de "mise au point automatique" de jQuery. Pour vous assurer que votre site reste largement accessible, encapsulez vos méthodes de création de boîte de dialogue afin que du code supplémentaire puisse être ajouté, et ajoutez un appel pour focaliser le premier élément d'entrée:
Pour améliorer l'accessibilité lorsque les options de saisie semi-automatique sont sélectionnées via le clavier, nous remplaçons le rappel de saisie semi-automatique "select" de jQuery UI et ajoutons du code supplémentaire pour garantir que textElement ne perd pas le focus dans IE 8 après avoir effectué une sélection.
Voici le code que nous utilisons pour appliquer la saisie semi-automatique aux éléments:
la source
Vous pouvez fournir cette option pour concentrer le bouton de fermeture à la place.
la source
Cela peut être un problème de comportement du navigateur et non de plugin jQuery. Avez-vous essayé de supprimer le focus par programme après avoir ouvert la fenêtre contextuelle.
Je n'ai pas testé cela mais devrait fonctionner correctement.
la source
J'avais le même problème et je l'ai résolu en insérant une entrée vide avant le sélecteur de date, qui vole le focus à chaque fois que la boîte de dialogue est ouverte. Cette entrée est masquée à chaque ouverture de la boîte de dialogue et réapparue à la fermeture.
la source
Eh bien, c'est cool que personne n'ait trouvé la solution pour l'instant, mais il semble que j'ai quelque chose pour toi. La mauvaise nouvelle est que la boîte de dialogue attrape le focus dans tous les cas, même si aucune entrée et aucun lien ne se trouvent à l'intérieur. J'utilise la boîte de dialogue comme info-bulle et je dois absolument rester concentré sur l'élément d'origine. Voici ma solution:
utiliser l'option [autoOpen: false]
Alors que la boîte de dialogue est invisible, le focus n'est défini nulle part et reste à son emplacement d'origine. Il fonctionne pour les info-bulles avec juste un texte brut, mais n'a pas été testé pour les boîtes de dialogue plus fonctionnelles où il peut être important d'avoir une boîte de dialogue visible au moment de l'ouverture. Cela fonctionnera probablement très bien dans tous les cas.
Je comprends que le message original était juste pour éviter de se concentrer sur le premier élément, mais vous pouvez facilement décider où le focus devrait être après l'ouverture de la boîte de dialogue (après mon code).
Testé dans IE, FF et Chrome.
J'espère que cela aidera quelqu'un.
la source
A mon avis cette solution est très sympa:
Trouvé ici: impossible-de-supprimer-autofocus-in-ui-dialog
la source
J'ai le même problème. J'ouvre une boîte de dialogue d'erreur lorsque la validation échoue et qu'elle saisit le focus, tout comme Flugan le montre dans sa réponse . Le problème est que même si aucun élément à l'intérieur de la boîte de dialogue ne peut être tabulé, la boîte de dialogue elle-même est toujours focalisée. Voici le code original non minimisé de jquery-ui-1.8.23 \ js \ jquery.ui.dialog.js:
Le commentaire est le leur!
C'est vraiment mauvais pour moi pour plusieurs raisons. Le plus ennuyeux est que la première réaction de l'utilisateur est de frapper le retour arrière pour supprimer le dernier caractère, mais à la place, il est invité à quitter la page, car le retour arrière est frappé en dehors d'un contrôle d'entrée.
J'ai trouvé que la solution de contournement suivante fonctionne assez bien pour moi:
la source
Je cherchais un problème différent mais la même cause. Le problème est que la boîte de dialogue met le focus sur le premier
<a href="">.</a>
qu'elle trouve. Donc, si vous avez beaucoup de texte dans votre boîte de dialogue et que des barres de défilement apparaissent, vous pourriez avoir la situation où la barre de défilement défilera vers le bas. Je pense que cela corrige également la question des premières personnes. Bien que les autres le fassent aussi.Le correctif simple et facile à comprendre.
<a id="someid" href="#">.</a>
comme première ligne de votre div de dialogue.EXEMPLE:
Où votre dialogue est lancé
Ce qui précède n'aura rien de focalisé et les barres de défilement resteront en haut à sa place. L'
<a>
objet obtient le focus mais est ensuite masqué. L'effet global est donc l'effet souhaité.Je sais que c'est un vieux fil, mais en ce qui concerne les documents de l'interface utilisateur, il n'y a pas de solution à ce problème. Cela ne nécessite pas de flou ni de mise au point pour fonctionner. Je ne sais pas si c'est le plus élégant. Mais cela a du sens et est facile à expliquer à n'importe qui.
la source
Si vous n'avez qu'un seul champ sous la forme de la boîte de dialogue Jquery et que c'est celui qui a besoin de Datepicker, vous pouvez également définir le focus sur le bouton Fermer (croix) de la boîte de dialogue dans la barre de titre de la boîte de dialogue:
Appelez cette boîte de dialogue APRÈS avoir été initialisée, par exemple:
Parce que le bouton de fermeture est rendu après l'
.dialog()
appel de.la source
Si vous utilisez des boutons de dialogue, définissez simplement l'
autofocus
attribut sur l'un des boutons:la source
J'ai le même problème.
La solution de contournement que j'ai faite est d'ajouter la zone de texte factice en haut du conteneur de dialogue.
la source
Comme mentionné, il s'agit d'un bogue connu avec l'interface utilisateur jQuery et devrait être corrigé relativement bientôt. Jusque là...
Voici une autre option, pour ne pas avoir à jouer avec tabindex:
Désactivez temporairement le sélecteur de date jusqu'à ce que la boîte de dialogue s'ouvre:
Travaille pour moi.
Dupliquer la question: comment brouiller la première entrée de formulaire à l'ouverture de la boîte de dialogue
la source
Pour développer certaines des réponses précédentes (et en ignorant l'aspect du sélecteur de date auxiliaire), si vous voulez empêcher l'
focus()
événement de concentrer le premier champ de saisie lorsque votre boîte de dialogue s'ouvre, essayez ceci:la source
J'ai eu un problème similaire et je l'ai résolu en me concentrant sur la boîte de dialogue après ouverture:
Mais dans mon cas, le premier élément est une ancre, donc je ne sais pas si dans votre cas cela laissera le sélecteur de date ouvert.
EDIT: ne fonctionne que sur IE
la source
trouver dans jquery.ui.js
et remplacer par
la source
jQuery 1.9 est publié et il ne semble pas y avoir de correctif. Tenter d'empêcher le focus de la première zone de texte par certaines des méthodes suggérées ne fonctionne pas dans 1.9. Je pense que parce que les méthodes tentent de brouiller la mise au point ou de déplacer la mise au point, APRÈS que la zone de texte de la boîte de dialogue ait déjà gagné le focus et fait son sale boulot.
Je ne vois rien dans la documentation de l'API qui me fasse penser que quelque chose a changé en termes de fonctionnalités attendues. Désactivé pour ajouter un bouton d'ouverture ...
la source
J'ai eu un problème similaire. Sur ma page, la première entrée est une zone de texte avec le calendrier de l'interface utilisateur jQuery. Le deuxième élément est le bouton. Comme la date a déjà une valeur, j'ai mis le focus sur le bouton, mais j'ajoute d'abord un déclencheur pour le flou sur la zone de texte. Cela résout le problème dans tous les navigateurs et probablement dans toutes les versions de jQuery. Testé en version 1.8.2.
la source
Ceci est vraiment important pour les smartphones et les tablettes car le clavier se lève lorsqu'une entrée a le focus. C'est ce que j'ai fait, ajoutez cette entrée au début du div:
Ne fonctionne pas avec la taille
0px
. Je suppose que c'est encore mieux avec une vraie image transparente, soit.png
ou.gif
mais je n'ai pas essayé.Fonctionne très bien jusqu'à présent sur iPad.
la source
Vous pouvez ajouter ceci:
...
...
la source
comme première entrée:
<input type="text" style="position:absolute;top:-200px" />
la source