Ich habe ein modales Dialogfeld für die jQuery-Benutzeroberfläche eingerichtet, das angezeigt wird, wenn ein Benutzer auf einen Link klickt. In diesem div-Tag des Dialogfelds befinden sich zwei Textfelder (der Kürze halber zeige ich nur den Code für 1), und es wird in ein jQuery UI DatePicker-Textfeld geändert, das auf den Fokus reagiert.
Das Problem ist, dass der jQuery-UI-Dialog ('Öffnen') irgendwie das erste Textfeld auslöst, das den Fokus hat, wodurch der Datumsauswahlkalender sofort geöffnet wird.
Daher suche ich nach einer Möglichkeit, um zu verhindern, dass der Fokus automatisch erfolgt.
<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
quelle
quelle
Antworten:
jQuery UI 1.10.0 Changelog listet Ticket 4731 als behoben auf.
Es sieht so aus, als ob focusSelector nicht implementiert wurde, sondern stattdessen eine kaskadierende Suche nach verschiedenen Elementen verwendet wurde. Aus dem Ticket:
Markieren Sie also ein Element mit dem
autofocus
Attribut und das ist das Element, das den Fokus erhalten soll:In der Dokumentation wird die Fokuslogik erläutert (direkt unter dem Inhaltsverzeichnis unter dem Titel 'Fokus'):
quelle
Fügen Sie eine versteckte Spanne darüber hinzu und verwenden Sie ui-helper-hidden-Access, um sie durch absolute Positionierung auszublenden. Ich weiß, dass Sie diese Klasse haben, weil Sie den Dialog von jquery-ui verwenden und er in jquery-ui ist.
quelle
In jQuery UI> = 1.10.2 können Sie die
_focusTabbable
Prototypmethode durch eine Placebo-Funktion ersetzen :Geige
Dies wirkt sich auf alle
dialog
s auf der Seite aus, ohne dass jedes manuell bearbeitet werden muss.Die ursprüngliche Funktion setzt lediglich den Fokus auf das erste Element mit
autofocus
Attribut /tabbable
Element / oder greift auf den Dialog selbst zurück. Da bei der Verwendung nur der Fokus auf ein Element gelegt wird, sollte es kein Problem geben, es durch ein Element zu ersetzennoop
.quelle
$.noop
ersetzen, ersetzen Sie es durch eine Funktion, die den aktiven Dialog notiert, und registrieren Sie dann einen globalen Schlüsselereignishandler, derESC
den 'aktiven' Dialog abfängt und schließt, falls vorhanden.Ab jQuery UI 1.10.0 können Sie mithilfe des Autofokus des HTML5-Attributs auswählen, auf welches Eingabeelement Sie sich konzentrieren möchten .
Sie müssen lediglich ein Dummy-Element als erste Eingabe im Dialogfeld erstellen. Es wird den Fokus für Sie absorbieren.
Dies wurde am 7. Februar 2013 in Chrome, Firefox und Internet Explorer (alle neuesten Versionen) getestet.
quelle
Ich fand den folgenden Code die jQuery UI Dialogfunktion zum Öffnen.
Sie können entweder das jQuery-Verhalten umgehen oder das Verhalten ändern.
tabindex -1 dient als Problemumgehung.
quelle
focusSelector
Update (die Option) in jQueryUI 1.8 enthalten sein soll, und wir sind jetzt bei 1.8.13 und ich sehe es nicht in den jQueryUI-Dialogdokumenten . Was ist damit passiert?Ich habe es gerade herausgefunden, während ich herumgespielt habe.
Ich habe mit diesen Lösungen festgestellt, dass das Entfernen des Fokus dazu führte, dass der ESCSchlüssel nicht mehr funktionierte (dh den Dialog schloss), als ich zum ersten Mal in den Dialog ging.
Wenn das Dialogfeld geöffnet wird und Sie sofort drücken ESC, wird das Dialogfeld nicht geschlossen (sofern Sie dies aktiviert haben), da der Fokus auf einem versteckten Feld oder etwas anderem liegt und keine Tastendruckereignisse angezeigt werden.
Die Art und Weise, wie ich es behoben habe, bestand darin, dies dem offenen Ereignis hinzuzufügen, um stattdessen den Fokus aus dem ersten Feld zu entfernen:
Dadurch wird der Fokus auf das Dialogfeld gelegt, das nicht sichtbar ist, und dann ESCfunktioniert die Taste.
quelle
Setzen Sie den Tabindex der Eingabe auf -1 und setzen Sie dann dialog.open, um Tabindex wiederherzustellen, falls Sie es später benötigen:
quelle
Meine Problemumgehung:
quelle
:first
Selector oder.first()
in FF / Chrome / IE9. Das Werfen in diedialogopen
Bindung funktioniert auch.open: function(){ $('a').blur(); // no autofocus on links }
Ich hatte Inhalte, die länger waren als der Dialog. Beim Öffnen würde der Dialog zum ersten scrollen: tabbable, das sich unten befand. Hier war mein Fix.
quelle
$('...').blur();
anstatt zu scrollen.Einfache Problemumgehung:
Erstellen Sie einfach ein unsichtbares Element mit tabindex = 1 ... Dadurch wird der Datepicker nicht fokussiert ...
z.B.:
quelle
Hier ist die Lösung, die ich implementiert habe, nachdem ich das jQuery UI-Ticket Nr. 4731 gelesen habe, das ursprünglich von slolife als Antwort auf eine andere Antwort veröffentlicht wurde. (Das Ticket wurde auch von ihm erstellt.)
Fügen Sie zunächst bei jeder Methode, mit der Sie Autocompletes auf die Seite anwenden, die folgende Codezeile hinzu:
Dadurch wird das "Autofokus" -Verhalten von jQuery deaktiviert. Um sicherzustellen, dass Ihre Site weiterhin allgemein zugänglich ist, schließen Sie Ihre Methoden zur Dialogerstellung so ein, dass zusätzlicher Code hinzugefügt werden kann, und fügen Sie einen Aufruf hinzu, um das erste Eingabeelement zu fokussieren:
Um die Zugänglichkeit weiter zu verbessern, wenn Optionen für die automatische Vervollständigung über die Tastatur ausgewählt werden, überschreiben wir den Rückruf für die automatische Vervollständigung der jQuery-Benutzeroberfläche und fügen zusätzlichen Code hinzu, um sicherzustellen, dass das textElement nach einer Auswahl in IE 8 nicht den Fokus verliert.
Hier ist der Code, mit dem wir Autocompletes auf Elemente anwenden:
quelle
Sie können diese Option bereitstellen, um stattdessen die Schaltfläche zum Schließen zu fokussieren.
quelle
Dies kann ein Browserverhalten sein, das kein Problem mit dem jQuery-Plugin darstellt. Haben Sie versucht, den Fokus programmgesteuert zu entfernen, nachdem Sie das Popup geöffnet haben?
Habe das nicht getestet, sollte aber gut funktionieren.
quelle
Ich hatte das gleiche Problem und löste es, indem ich vor dem Datepicker eine leere Eingabe einfügte, die bei jedem Öffnen des Dialogfelds den Fokus stiehlt. Diese Eingabe wird bei jedem Öffnen des Dialogfelds ausgeblendet und beim Schließen erneut angezeigt.
quelle
Nun, es ist cool, dass im Moment niemand die Lösung gefunden hat, aber es sieht so aus, als hätte ich etwas für dich. Die schlechte Nachricht ist, dass der Dialog auf jeden Fall den Fokus erfasst, auch wenn keine Eingaben und Links vorhanden sind. Ich benutze den Dialog als Tooltip und brauche definitiv den Fokus, um im ursprünglichen Element zu bleiben. Hier ist meine Lösung:
benutze die Option [autoOpen: false]
Während der Dialog unsichtbar ist, wird der Fokus nirgendwo gesetzt und bleibt an der ursprünglichen Stelle. Es funktioniert für QuickInfos mit nur einem einfachen Text, wurde jedoch nicht für funktionalere Dialoge getestet, bei denen es möglicherweise wichtig ist, dass der Dialog beim Öffnen sichtbar ist. Wird wahrscheinlich auf jeden Fall gut funktionieren.
Ich verstehe, dass der ursprüngliche Beitrag nur dazu diente, den Fokus nicht auf das erste Element zu richten, aber Sie können leicht entscheiden, wo der Fokus liegen soll, nachdem der Dialog geöffnet wurde (nach meinem Code).
Getestet in IE, FF und Chrome.
Hoffentlich hilft das jemandem.
quelle
Meiner Meinung nach ist diese Lösung sehr schön:
Hier zu finden: Autofokus im UI-Dialog kann nicht entfernt werden
quelle
Ich habe ein ähnliches Problem. Ich öffne einen Fehlerdialog, wenn die Validierung fehlschlägt und der Fokus erfasst wird, so wie Flugan ihn in seiner Antwort zeigt . Das Problem ist, dass der Dialog selbst fokussiert ist, auch wenn kein Element im Dialogfeld tabellierbar ist. Hier ist der ursprüngliche nicht minimierte Code aus jquery-ui-1.8.23 \ js \ jquery.ui.dialog.js:
Der Kommentar gehört ihnen!
Das ist aus mehreren Gründen wirklich schlecht für mich. Das Ärgerlichste ist, dass die erste Reaktion des Benutzers darin besteht, die Rücktaste zu drücken, um das letzte Zeichen zu löschen. Stattdessen wird er aufgefordert, die Seite zu verlassen, da die Rücktaste außerhalb eines Eingabesteuerelements gedrückt wird.
Ich fand, dass die folgende Problemumgehung für mich ziemlich gut funktioniert:
quelle
Ich habe mich nach einem anderen Thema umgesehen, aber aus demselben Grund. Das Problem ist, dass der Dialog den Fokus auf den ersten
<a href="">.</a>
findet , den er findet. Wenn Sie also viel Text in Ihrem Dialogfeld haben und Bildlaufleisten angezeigt werden, kann es vorkommen, dass die Bildlaufleiste nach unten gescrollt wird. Ich glaube, dies behebt auch die Frage der ersten Person. Obwohl die anderen es auch tun.Die einfache, leicht verständliche Lösung.
<a id="someid" href="#">.</a>
als erste Zeile in Ihrem Dialog div.BEISPIEL:
Wo Ihr Dialog initiiert wird
Das Obige hat nichts Fokussiertes und die Bildlaufleisten bleiben oben, wo sie hingehören. Das
<a>
bekommt Fokus aber wird dann ausgeblendet. Der Gesamteffekt ist also der gewünschte Effekt.Ich weiß, dass dies ein alter Thread ist, aber was die UI-Dokumente betrifft, gibt es keine Lösung dafür. Dies erfordert keine Unschärfe oder Fokussierung, um zu arbeiten. Ich bin mir nicht sicher, ob es das eleganteste ist. Aber es macht einfach Sinn und ist einfach, es jedem zu erklären.
quelle
Wenn Sie nur ein Feld in Form eines Jquery-Dialogfelds haben und dieses Datepicker benötigt, können Sie alternativ einfach den Fokus auf die Schaltfläche Schließen (Kreuz) des Dialogfelds in der Titelleiste des Dialogfelds legen :
Rufen Sie dies auf, nachdem der Dialog initialisiert wurde, z.
Weil die Schaltfläche zum Schließen nach dem
.dialog()
Aufruf von gerendert wird.quelle
Wenn Sie Dialogschaltflächen verwenden, legen Sie einfach das
autofocus
Attribut auf einer der Schaltflächen fest:quelle
Ich habe das gleiche Problem.
Die Problemumgehung, die ich durchgeführt habe, besteht darin, das Dummy-Textfeld oben im Dialogcontainer hinzuzufügen.
quelle
Wie bereits erwähnt, ist dies ein bekannter Fehler in der jQuery-Benutzeroberfläche und sollte relativ bald behoben werden. Bis dann...
Hier ist eine weitere Option, damit Sie sich nicht mit tabindex anlegen müssen:
Deaktivieren Sie die Datumsauswahl vorübergehend, bis das Dialogfeld geöffnet wird:
Funktioniert bei mir.
Doppelte Frage: So verwischen Sie die erste Formulareingabe beim Öffnen des Dialogfelds
quelle
Wenn Sie verhindern möchten, dass das
focus()
Ereignis beim Öffnen Ihres Dialogfelds das erste Eingabefeld fokussiert, um einige der vorherigen Antworten zu erweitern (und den zusätzlichen Aspekt der Datumsauswahl zu ignorieren) , versuchen Sie Folgendes :quelle
Ich hatte ein ähnliches Problem und löste es, indem ich mich nach dem Öffnen auf den Dialog konzentrierte:
Aber in meinem Fall ist das erste Element ein Anker, daher weiß ich nicht, ob in Ihrem Fall der Datepicker geöffnet bleibt.
BEARBEITEN: funktioniert nur im IE
quelle
finden Sie in jquery.ui.js
und ersetzen durch
quelle
jQuery 1.9 ist veröffentlicht und es scheint keinen Fix zu geben. Der Versuch, die Fokussierung des ersten Textfelds durch einige der vorgeschlagenen Methoden zu verhindern, funktioniert in 1.9 nicht. Ich denke, weil die Methoden versuchen, den Fokus zu verwischen oder den Fokus zu verschieben, nachdem das Textfeld im Dialogfeld bereits den Fokus erhalten und seine Drecksarbeit erledigt hat.
In der API-Dokumentation ist nichts zu sehen, was mich glauben lässt, dass sich an der erwarteten Funktionalität etwas geändert hat. Aus, um einen Öffnerknopf hinzuzufügen ...
quelle
Ich hatte ein ähnliches Problem. Auf meiner Seite ist die erste Eingabe ein Textfeld mit dem jQuery UI-Kalender. Das zweite Element ist die Schaltfläche. Da das Datum bereits einen Wert hat, setze ich den Fokus auf die Schaltfläche, füge aber zuerst einen Auslöser für die Unschärfe im Textfeld hinzu. Dies löst das Problem in allen Browsern und wahrscheinlich in allen Versionen von jQuery. Getestet in Version 1.8.2.
quelle
Dies ist für Smartphones und Tablets sehr wichtig, da die Tastatur angezeigt wird, wenn eine Eingabe den Fokus hat. Dies ist, was ich getan habe, fügen Sie diese Eingabe am Anfang des div hinzu:
Funktioniert nicht mit Größe
0px
. Ich denke , es ist noch besser , mit einem echten transparenten Bild, entweder.png
oder.gif
aber ich habe nicht versucht.Funktioniert bisher gut im iPad.
quelle
Sie können dies hinzufügen:
...
...
quelle
als erste Eingabe:
<input type="text" style="position:absolute;top:-200px" />
quelle