Ich habe eine Texteingabe. Wenn die Eingabe den Fokus erhält, möchte ich den Text innerhalb der Eingabe auswählen.
Mit jQuery würde ich es so machen:
<input type="text" value="test" />
$("input[type=text]").click(function() {
$(this).select();
// would select "test" in this example
});
Ich habe mich umgesehen, um den Angular-Weg zu finden, aber die meisten Beispiele, die ich finde, befassen sich mit einer Direktive, die eine modale Eigenschaft zur Änderung überwacht. Ich gehe davon aus, dass ich eine Direktive brauche, die nach einer Eingabe sucht, die den Fokus erhält. Wie würde ich das machen?
angularjs
angularjs-directive
Billy Coover
quelle
quelle
<input type="text" value="test" onclick="this.select()" />
?Antworten:
In Angular können Sie dazu eine benutzerdefinierte Direktive erstellen, die die automatische Auswahl für Sie übernimmt.
Wenden Sie die Richtlinie folgendermaßen an:
View demo
Update1 : Die jQuery-Abhängigkeit wurde entfernt.
Update2 : Als Attribut einschränken .
Update3 : Funktioniert in Mobile Safari. Ermöglicht die Auswahl eines Teils des Textes (erfordert IE> 8).
quelle
restrict: 'A'
), da diese Direktive darauf abzielt , das Verhalten eines vorhandenen Elements zu erweitern .selectOnLoad
Direktive link () festgelegt ist. In link () ist das Element DOM noch nicht mit $ scope synchronisiert, obwohl der Bereich bereits ausgefüllt ist. Wenn ich also select () aufrufe, ist das Element immer noch leer und nichts ausgewählt. Die einzige Möglichkeit, das Problem zu umgehen, ist $ timeout, aber ich bin der Meinung, dass dies mit einer neuen Angular-Version nicht mehr funktionieren kann.Hier ist eine erweiterte Anweisung, die verhindert, dass der Text erneut ausgewählt wird, wenn der Benutzer klickt, um den Cursor im Eingabefeld zu positionieren.
quelle
this
zuelement[0]
und sollte es funktionieren. Ich empfehle auch, zu zu wechselnclick
,focus
damit Text ausgewählt wird, wenn der Benutzer die Eingabe mit Registerkarten anzeigt, anstatt darauf zu klicken.Dies ist eine alte Antwort für Angular 1.x.
Besser ist es, die
ng-click
eingebaute Direktive zu verwenden:BEARBEITEN:
Wie JoshMB freundlich erinnert hat; Das Referenzieren von DOM-Knoten in Angular 1.2+ ist nicht mehr zulässig. Also bin ich
$event.target.select()
in den Controller eingezogen :Dann in Ihrem Controller:
Hier ist ein Beispiel für eine Geige .
quelle
Keine der vorgeschlagenen Lösungen hat für mich gut funktioniert. Nach kurzer Recherche kam ich auf Folgendes:
Es ist eine Mischung aus mehreren vorgeschlagenen Lösungen, funktioniert jedoch sowohl beim Klicken als auch beim Fokussieren (denken Sie an Autofokus) und ermöglicht die manuelle Auswahl des Teilwerts in der Eingabe.
quelle
focusedElement
?Für mich hatte ng-click keinen Sinn, da man den Cursor nie neu positionieren konnte, ohne den gesamten Text erneut auszuwählen. Ich fand das ärgerlich. Dann ist es besser, ng-focus zu verwenden, da der Text nur ausgewählt wird, wenn die Eingabe nicht fokussiert war. Wenn Sie erneut klicken, um den Cursor neu zu positionieren, wird die Auswahl des Texts wie erwartet einfach aufgehoben und Sie können dazwischen schreiben.
Ich fand, dass dieser Ansatz das erwartete UX-Verhalten ist.
Verwenden Sie ng-focus
Option 1: separater Code
und in der Steuerung
Option 2: Alternativ können Sie den obigen Code in diesen "Einzeiler" einfügen (ich habe dies nicht getestet, aber es sollte funktionieren).
quelle
In Winkel 2 funktionierte dies für mich, sowohl in Chrome als auch in Firefox:
quelle
Die akzeptierte Antwort verwendet das Klickereignis. Wenn Sie jedoch das Fokusereignis verwenden, wird das Ereignis nur durch den ersten Klick ausgelöst, und es wird auch ausgelöst, wenn eine andere Methode zum Fokussieren auf die Eingabe verwendet wird (z. B. Drücken der Registerkarte oder Aufrufen des Fokus im Code).
Dies macht es auch unnötig zu überprüfen, ob das Element bereits fokussiert ist, wie Tamlyns Antwort nahe legt.
quelle
this.select
.Keine Anweisungen erforderlich, fügen Sie
onfocus="this.select()"
dem Eingabeelement oder dem Textbereich einfach natives Javascript hinzu.quelle
Geänderte Version, die für mich funktioniert hat. Erster Klick wählt Text aus, zweiter Klick auf dasselbe Element hebt die Auswahl von Text auf
})
quelle