Mam wpisywanie tekstu. Kiedy wejście jest fokusem, chcę zaznaczyć tekst wewnątrz wejścia.
Z jQuery zrobiłbym to w ten sposób:
<input type="text" value="test" />
$("input[type=text]").click(function() {
$(this).select();
// would select "test" in this example
});
Szukałem wokół, aby spróbować znaleźć sposób Angular, ale większość przykładów, które znajduję, dotyczy dyrektywy, która obserwuje właściwość modalną pod kątem zmiany. Zakładam, że potrzebuję dyrektywy, która obserwuje dane wejściowe, które są skupione. Jak bym to zrobił?
angularjs
angularjs-directive
Billy Coover
źródło
źródło
<input type="text" value="test" onclick="this.select()" />
?Odpowiedzi:
Sposobem na to w Angular jest utworzenie niestandardowej dyrektywy, która dokonuje automatycznego wyboru za Ciebie.
Zastosuj dyrektywę w następujący sposób:
View demo
Update1 : Usunięto zależność jQuery.
Aktualizacja2 : Ogranicz jako atrybut.
Aktualizacja 3 : Działa w mobilnym Safari. Umożliwia zaznaczenie części tekstu (wymaga IE> 8).
źródło
restrict: 'A'
), ponieważ ta dyrektywa ma na celu rozszerzenie zachowania istniejącego elementu .selectOnLoad
dyrektywą link (). Ale w link (), mimo że zakres jest już wypełniony, element DOM nie jest jeszcze zsynchronizowany z $ scope, więc kiedy wywołuję select (), element jest nadal pusty i nic nie jest zaznaczone. Jedynym sposobem obejścia tego problemu jest $ timeout, ale wydaje mi się, że może przestać działać z jakąś nową wersją Angulara.Oto ulepszona dyrektywa, która pozwala uniknąć ponownego zaznaczania tekstu, gdy użytkownik kliknie, aby ustawić kursor w polu wprowadzania.
źródło
this
naelement[0]
i powinno działać. Zalecam również zmianęclick
nafocus
, aby tekst był zaznaczany, jeśli użytkownik wejdzie w wejście zamiast klikania.To stara odpowiedź dla Angular 1.x
Lepszym sposobem na to jest użycie
ng-click
wbudowanej dyrektywy:EDYTOWAĆ:
Jak uprzejmie przypomniał JoshMB ; odwoływanie się do węzłów DOM w Angular 1.2+ nie jest już dozwolone. Więc przeniosłem
$event.target.select()
się do kontrolera:Następnie w kontrolerze:
Oto przykładowe skrzypce .
źródło
Żadne z proponowanych rozwiązań nie sprawdziło się dla mnie. Po szybkich poszukiwaniach wymyśliłem to:
Jest to mieszanka kilku proponowanych rozwiązań, ale działa zarówno na kliknięcie, jak i na fokus (pomyśl o autofokusie) i pozwala na ręczny wybór wartości częściowej w wejściu.
źródło
focusedElement
?Dla mnie ng-click nie miało sensu, ponieważ nigdy nie można było zmienić położenia kursora bez ponownego zaznaczenia całego tekstu, stwierdziłem, że to anno. Wtedy lepiej jest użyć ng-focus, ponieważ tekst jest zaznaczony tylko wtedy, gdy wejście nie było fokusem, jeśli klikniesz ponownie, aby zmienić położenie kursora, tekst po prostu odznacza się, zgodnie z oczekiwaniami, i możesz pisać pomiędzy.
Uważam, że to podejście jest oczekiwanym zachowaniem UX.
Użyj ng-focus
Opcja 1: oddzielny kod
i w kontrolerze
Opcja 2: jako alternatywę możesz dołączyć powyższy kod do tego „jednowierszowego” (nie testowałem tego, ale powinno działać)
źródło
W Angular 2 zadziałało to dla mnie, zarówno w Chrome, jak i Firefox:
źródło
Zaakceptowaną odpowiedzią jest użycie zdarzenia click, jednak jeśli użyjesz zdarzenia focus, tylko pierwsze kliknięcie uruchomi zdarzenie, a także zostanie uruchomione, gdy zostanie użyta inna metoda do skupienia się na danych wejściowych (np. Naciśnięcie tabulatora lub wywołanie fokusa w kodzie).
To również sprawia, że nie ma potrzeby sprawdzania, czy element jest już skupiony, jak sugeruje odpowiedź Tamlyna.
źródło
this.select
.Żadne dyrektywy nie są potrzebne, po prostu dodaj
onfocus="this.select()"
natywny javascript do elementu wejściowego lub obszaru tekstowego.źródło
Zmodyfikowana wersja, która działała dla mnie. Pierwsze kliknięcie zaznacza tekst, drugie kliknięcie tego samego elementu odznacza tekst
})
źródło
Najłatwiejszym sposobem zaznaczenia całego tekstu po kliknięciu, fokusie lub karcie jest !!!:
...
źródło