Zaznaczenie całego tekstu w tekście HTML po kliknięciu

553

Mam następujący kod do wyświetlenia pola tekstowego na stronie HTML.

<input type="text" id="userid" name="userid" value="Please enter the user ID" />

Po wyświetleniu strony tekst zawiera komunikat Wprowadź identyfikator użytkownika . Stwierdziłem jednak, że użytkownik musi kliknąć 3 razy, aby zaznaczyć cały tekst (w tym przypadku jest to proszę podać identyfikator użytkownika ).

Czy można zaznaczyć cały tekst za pomocą jednego kliknięcia?

Edytować:

Przepraszam, zapomniałem powiedzieć: muszę użyć danych wejściowych type="text"

pytania
źródło
6
Lepszym podejściem jest użycie <label>etykiety, a nie etykiety value. Możesz użyć JS i CSS, aby wyglądać tak samo, nie będąc tak antysemantycznym. dorward.me.uk/tmp/label-work/example.html ma przykład wykorzystujący jQuery.
Quentin,
12
Lub nawet użyj symbolu zastępczego, jeśli pracujesz w nowoczesnym projekcie HTML5.
Léo Lam
1
placeholder = "Podaj identyfikator użytkownika"
Bonus Marcelo

Odpowiedzi:

907

Możesz użyć tego fragmentu javascript:

<input onClick="this.select();" value="Sample Text" />

Ale najwyraźniej nie działa na mobilnym Safari. W takich przypadkach możesz użyć:

<input onClick="this.setSelectionRange(0, this.value.length)" value="Sample Text" />
Boris Pavlović
źródło
9
Aby uczynić to bardziej ogólnym, możesz użyć this.idjako argumentu dla procedury obsługi kliknięć. Co więcej, możesz getElementByIdcałkowicie wyeliminować i przekazać thisjako argument.
Asad Saeeduddin
12
Na mobilnym Safari, które nie działa. Zamiast tego spróbuj wywołać this.setSelectionRange (0, 9999).
Dean Radcliffe,
43
@DeanRadcliffe Nice one! Użyłbym this.setSelectionRange(0, this.value.length)zamiast tego.
2grit
8
Wszelkie aktualizacje dotyczące obsługi przeglądarki? w3schools.com/jsref/met_text_select.asp twierdzi, że jest obsługiwany przez wszystkie przeglądarki
Ayyash
65

Wcześniej opublikowane rozwiązania mają dwa dziwactwa:

  1. W Chrome wybór za pomocą .select () nie utrzymuje się - dodanie niewielkiego limitu czasu rozwiązuje ten problem.
  2. Nie można umieścić kursora w żądanym punkcie po ustawieniu ostrości.

Oto kompletne rozwiązanie, które zaznacza cały tekst na fokusie, ale umożliwia wybranie określonego punktu kursora po fokusie.

        $(function () {
            var focusedElement;
            $(document).on('focus', 'input', function () {
                if (focusedElement == this) return; //already focused, return so user can now place cursor at specific point in input.
                focusedElement = this;
                setTimeout(function () { focusedElement.select(); }, 100); //select all text in any field on focus for easy re-entry. Delay sightly to allow focus to "stick" before selecting.
            });
        });
Cory House
źródło
7
Aby poradzić sobie z przypadkiem, gdy użytkownik kliknie poza polem, a następnie z powrotem, dodaj.on('blur', 'input', function(){focusedElement = null;})
Tamlyn
1
limit czasu 0pracy dla mnie w chrome i firefox. nie jestem pewien, skąd 50pochodzi twój limit czasu .
thejoshwolfe
1
Rozwiązaniem jest użycie onClick zamiast onFocus. Działa idealnie i nie wymaga skomplikowanych kodów.
Ismael,
4
@CoryHouse to nie ma znaczenia, ponieważ Fokus za pomocą karty natywnie zaznacz tekst! Nie wymaga javascript.
Ismael,
1
@CoryHouse nawet po 4 latach Twoje kody działają jak urok. Człowieku, ukłoń się. Dzięki za ten mały brudny hack. Szukałem 2-3 dni, aż znalazłem ten. : +1:
Rutvij Kothari,
47

HTML (będziesz musiał umieścić atrybut onclick na każdym wejściu, dla którego ma działać na stronie)

 <input type="text" value="click the input to select" onclick="this.select();"/>

LUB LEPSZA OPCJA

jQuery (będzie działać dla każdego tekstu wprowadzanego na stronie, nie trzeba zmieniać HTML):

<script  type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.js"></script>  
<script type="text/javascript">
    $(function(){
        $(document).on('click','input[type=text]',function(){ this.select(); });
    });
</script>
oLinkWebDevelopment
źródło
22
Prawdopodobnie lepiej byłoby powiązać ze zdarzeniem fokusowym niż klikać tych, którzy przeglądają elementy formularza.
Andrew Ensley,
7
@Andrew Nie jest to konieczne, ponieważ tekst jest zawsze zaznaczany, jeśli tabulujesz elementy wejściowe. ;-)
nietonfir
zdarzenia fokusu są błędne, z drugiej strony zdarzenie rozmycia przydaje się do uruchamiania sprawdzania poprawności i automatycznego zapisywania formularzy, działa również po tabulacji!
oLinkWebDevelopment
Powinien działać poprawnie, upewnij się, że używasz zaktualizowanej wersji jQuery lub użyj $ (document) .live () na starszych wersjach.
oLinkWebDevelopment
2
O ile użytkownik nie ma jQuery, lepsza opcja nie wymaga dodawania zależności od biblioteki strony trzeciej.
Ross
37

Wiem, że to stare, ale najlepszą opcją jest teraz użycie nowego placeholderatrybutu HTML, jeśli to możliwe:

<input type="text" id="userid" name="userid" placeholder="Please enter the user ID" />

Spowoduje to, że tekst będzie wyświetlany, chyba że zostanie wprowadzona wartość, co eliminuje potrzebę wybierania tekstu lub czyszczenia danych wejściowych.

Thom Porter
źródło
2
Pamiętaj, że symbol zastępczy jest dozwolony tylko w przypadku html doctype.
dogawaf
12

Wymienione odpowiedzi są według mnie częściowe. Poniżej zamieściłem dwa przykłady tego, jak to zrobić w Angular i JQuery.

To rozwiązanie ma następujące funkcje:

  • Działa dla wszystkich przeglądarek obsługujących JQuery, Safari, Chrome, IE, Firefox itp.
  • Działa z Phonegap / Cordova: Android i IOs.
  • Zaznacza wszystko tylko raz po wprowadzeniu ostrości do następnego rozmycia, a następnie ostrości
  • Można użyć wielu wejść i nie powoduje to usterki.
  • Dyrektywa Angular ma świetne możliwości ponownego użycia po prostu dodaj dyrektywę select-all-on-click
  • JQuery można łatwo modyfikować

JQuery: http://plnkr.co/edit/VZ0o2FJQHTmOMfSPRqpH?p=preview

$("input").blur(function() {
  if ($(this).attr("data-selected-all")) {
  //Remove atribute to allow select all again on focus        
  $(this).removeAttr("data-selected-all");
  }
});

$("input").click(function() {
  if (!$(this).attr("data-selected-all")) {
    try {
      $(this).selectionStart = 0;
      $(this).selectionEnd = $(this).value.length + 1;
      //add atribute allowing normal selecting post focus
      $(this).attr("data-selected-all", true);
    } catch (err) {
      $(this).select();
      //add atribute allowing normal selecting post focus
      $(this).attr("data-selected-all", true);
    }
  }
});

Angular: http://plnkr.co/edit/llcyAf?p=preview

var app = angular.module('app', []);
//add select-all-on-click to any input to use directive
app.directive('selectAllOnClick', [function() {
  return {
    restrict: 'A',
    link: function(scope, element, attrs) {
      var hasSelectedAll = false;
      element.on('click', function($event) {
        if (!hasSelectedAll) {
          try {
            //IOs, Safari, thows exception on Chrome etc
            this.selectionStart = 0;
            this.selectionEnd = this.value.length + 1;
            hasSelectedAll = true;
          } catch (err) {
            //Non IOs option if not supported, e.g. Chrome
            this.select();
            hasSelectedAll = true;
          }
        }
      });
      //On blur reset hasSelectedAll to allow full select
      element.on('blur', function($event) {
        hasSelectedAll = false;
      });
    }
  };
}]);
D Prinsloo
źródło
fajne rozwiązanie angularjs. dzięki. chociaż nie używam flagi hasSelectedAll. Sądzę, że jest to przepis na drugie kliknięcie, co może oznaczać, że użytkownik chce umieścić kursor.
dewd
11

Próbować:

onclick="this.select()"

Działa świetnie dla mnie.

Slulego
źródło
11

Zawsze możesz używać document.execCommand( obsługiwane we wszystkich głównych przeglądarkach )

document.execCommand("selectall",null,false);

Zaznacza cały tekst w aktualnie zaznaczonym elemencie.

Toastrackenigma
źródło
To wygląda na eleganckie rozwiązanie. Pełny kod wyglądałby następująco:<input type="text" onclick="document.execCommand('selectall',null,false);" />
pipepiper
Tak, to mój ulubiony sposób wykonywania tego rodzaju zadań, szczególnie. ponieważ działa również na contenteditableelementy. Myślę, że możesz uczynić go nawet nieco bardziej eleganckim, tj. <input type="text" onfocus="document.execCommand('selectall')">- całkiem pewnym, że możesz go usunąć, nulla falsejeśli ich nie użyjesz.
Toastrackenigma
Tak. onfocuswydaje się lepszy niż onclick. i tak, można pozbyć się nulli false. Dzięki!
pipepiper
Zgadzam się, że jest to najlepsze rozwiązanie dla różnych przeglądarek z zastrzeżeniem, że należy wykorzystać limit czasu wspomniany w rozwiązaniu @Corey House, aby uczynić tę przeglądarkę kompatybilną.
Eric Lease
1
podczas korzystania onfocuscała strona jest wybierana po kliknięciu wejścia w Chrome. onclickdziała w porządku.
robotik
8

wejściowy autofokus ze zdarzeniem onfocus:

<INPUT onfocus="this.select()" TYPE="TEXT" NAME="thing" autofocus>

Umożliwia to otwarcie formularza z wybranym żądanym elementem. Działa przy użyciu autofokusa, aby trafić na wejście, które następnie wysyła sobie zdarzenie onfocus, które z kolei zaznacza tekst.

Fyngyrz
źródło
8

Uwaga: jeśli weźmiesz pod uwagę onclick="this.select()": Przy pierwszym kliknięciu zostaną wybrane wszystkie znaki, a następnie być może chcesz edytować coś na wejściu i ponownie kliknąć między znakami, ale spowoduje to ponowne zaznaczenie wszystkich znaków. Aby rozwiązać ten problem, powinieneś użyć onfocuszamiast onclick.

Amir Fo
źródło
6

Rzeczywiście, używaj, onclick="this.select();"ale pamiętaj, aby nie łączyć z tym disabled="disabled"- nie zadziała wtedy i będziesz musiał ręcznie wybrać lub kliknąć kilka razy, aby wybrać, nadal. Jeśli chcesz zablokować wybraną wartość treści, połącz ją z atrybutem readonly.

LenArt
źródło
4

Oto wersja odpowiedzi Shobana do wielokrotnego użytku:

<input type="text" id="userid" name="userid"
 value="Please enter the user ID" onfocus="Clear(this);"
/>

function Clear(elem)
{
elem.value='';
}

W ten sposób możesz ponownie użyć czystego skryptu dla wielu elementów.

Sean Patrick Floyd
źródło
4

Możesz wymienić

<input type="text" id="userid" name="userid" value="Please enter the user ID" />

Z:

<input type="text" id="userid" name="userid" placeholder="Please enter the user ID" />

Symbol zastępczy służy do zamiany wartości na sposób, w jaki chcesz, aby ludzie mogli pisać w polu tekstowym bez konieczności wielokrotnego klikania lub używania kombinacji klawiszy Ctrl + A. Symbol zastępczy sprawia, że ​​nie jest to wartość, ale jak sama nazwa wskazuje na symbol zastępczy. To jest używane w wielu formularzach online z napisem „Nazwa użytkownika tutaj” lub „E-mail”, a po kliknięciu „E-mail” znika i możesz od razu zacząć pisać.

Pablo
źródło
3

Dokładne rozwiązanie tego, o co prosiłeś, to:

<input type="text" id="userid" name="userid" value="Please enter the user ID" onClick="this.setSelectionRange(0, this.value.length)"/>

Ale przypuszczam, że próbujesz pokazać „Wprowadź identyfikator użytkownika” jako symbol zastępczy lub podpowiedź w danych wejściowych. Możesz więc użyć następujących rozwiązań jako bardziej wydajnego rozwiązania:

<input type="text" id="userid" name="userid" placeholder="Please enter the user ID" />
Ayan
źródło
3

Oto przykład w React, ale jeśli chcesz, możesz go przetłumaczyć na jQuery na waniliowym JS:

class Num extends React.Component {

    click = ev => {
        const el = ev.currentTarget;
        if(document.activeElement !== el) {
            setTimeout(() => {
                el.select();    
            }, 0);
        }
    }

    render() {
        return <input type="number" min={0} step={15} onMouseDown={this.click} {...this.props} />
    }
}

Sztuczka polega na tym, aby użyć onMouseDownelementu, ponieważ fokus jest już aktywowany do momentu uruchomienia zdarzenia „kliknięcia” (a zatem activeElementsprawdzenie zakończy się niepowodzeniem).

activeElementKontrola jest konieczna, tak aby użytkownik może umieścić swój kursor gdzie chcą bez ciągłego ponownego wyboru całą wejście.

Limit czasu jest konieczny, ponieważ w przeciwnym razie tekst zostanie zaznaczony, a następnie natychmiast niezaznaczony, ponieważ, jak sądzę, przeglądarka sprawdza pospolite położenie kursora.

I na koniec, el = ev.currentTargetjest to konieczne w React, ponieważ React ponownie wykorzystuje obiekty zdarzeń, a zdarzenie syntetyczne zostanie utracone do momentu uruchomienia setTimeout.

mpen
źródło
jest React nowego jQuery?
vpzomtrrfrt
@vpzomtrrfrt Sure to: DJ / K. Napisałem to w React i nie zamierzałem go odreagować tylko dla niektórych punktów SO. Weź to lub zostaw :-)
mpen
Jak to jest przykład w React? To bardziej przykład w natywnym javascript.
Cesar
2

Problem z łapaniem zdarzenia kliknięcia polega na tym, że każde kolejne kliknięcie w tekście powoduje jego ponowne wybranie, podczas gdy użytkownik prawdopodobnie spodziewał się zmienić położenie kursora.

Dla mnie zadziałało zadeklarowanie zmiennej, selectSearchTextOnClick i ustawienie jej domyślnie na true. Moduł obsługi kliknięć sprawdza, czy zmienna jest nadal prawdziwa: jeśli tak, ustawia ją na fałsz i wykonuje funkcję select (). Następnie mam moduł obsługi zdarzenia rozmycia, który przywraca mu wartość true.

Dotychczasowe wyniki wydają się być zachowaniem, którego się spodziewałem.

(Edycja: Zlekceważyłem stwierdzenie, że próbowałem złapać zdarzenie skupienia, jak ktoś sugerował, ale to nie działa: po uruchomieniu zdarzenia skupienia zdarzenie kliknięcia może zostać uruchomione, natychmiast usuwając zaznaczenie tekstu).

Luxokrates
źródło
2

HTML tak <input type="text" value="click the input to select" onclick="javascript:textSelector(this)"/>

i kod javascript bez wiązania

function textSelector(ele){
    $(ele).select();
}
Hussainsheriff
źródło
4
„javascript:” jest używany tylko w formacie href i należy go unikać.
user1133275,
1

To normalna aktywność dla TextBox.

Kliknij 1 - Ustaw fokus

Kliknij 2/3 (podwójne kliknięcie) - Wybierz tekst

Możesz ustawić fokus na TextBox, gdy strona ładuje się po raz pierwszy, aby zredukować „select” do pojedynczego zdarzenia podwójnego kliknięcia.

RPM1984
źródło
1
Również 2 kliknięcie służy do wyboru słowa i 3 do wyboru linii.
Arthur
1

W polu wprowadzania wpisz „symbol zastępczy” zamiast „wartość”.

seaJay
źródło
0

Jeśli korzystasz z AngularJS, możesz użyć niestandardowej dyrektywy dla łatwego dostępu:

define(['angular'], function () {
    angular.module("selectionHelper", [])
    .directive('selectOnClick', function () {
        return {
            restrict: 'A',
            link: function (scope, element, attrs) {                
                element.on('click', function () {
                    this.select();
                });
            }
        };
    });
});

Teraz można po prostu użyć tego w następujący sposób:

<input type="text" select-on-click ... />

Próbka pochodzi z wymaganego - więc pierwszy i ostatni wiersz można pominąć, jeśli używasz czegoś innego.

timtos
źródło
0

Jeśli ktoś chce to zrobić na stronie, załaduj w / jQuery (słodkie dla pól wyszukiwania), oto moje rozwiązanie

jQuery.fn.focusAndSelect = function() {
    return this.each(function() {
        $(this).focus();
        if (this.setSelectionRange) {
            var len = $(this).val().length * 2;
            this.setSelectionRange(0, len);
        } else {
            $(this).val($(this).val());
        }
        this.scrollTop = 999999;
    });
};

(function ($) {
    $('#input').focusAndSelect();
})(jQuery);

Na podstawie tego postu. Dzięki CSS-Tricks.com

Hugo Dias
źródło
0

Jeśli próbujesz tylko zastąpić tekst zastępczy, gdy użytkownik wybierze element, to oczywiście najlepszą praktyką jest używanie placeholderatrybutu w dzisiejszych czasach. Jeśli jednak chcesz wybrać całą bieżącą wartość, gdy pole zostanie zogniskowane, kombinacja odpowiedzi @Cory House i @Toastrackenigma wydaje się być najbardziej kanoniczna. Użyj focusifocusout zdarzenia, z programami obsługi, które ustawiają / zwalniają bieżący element fokusa, i zaznaczają wszystko, gdy fokus jest aktywny. Przykład angular2 / maszynopisu jest następujący (ale konwersja na waniliowy js byłaby trywialna):

Szablon:

<input type="text" (focus)="focus()" (focusout)="focusout()" ... >

Składnik:

private focused = false;

public focusout = (): void => {
    this.focused = false;
};

public focus = (): void => {
    if(this.focused) return;
    this.focused = true;

    // Timeout for cross browser compatibility (Chrome)
    setTimeout(() => { document.execCommand('selectall', null, false); });
};
Eric Lease
źródło