Виберіть увесь вміст текстового поля, коли він отримає фокус (Vanilla JS або jQuery)


310

Що таке рішення Vanilla JS або jQuery, яке вибере весь вміст текстового поля, коли текстове поле отримає фокус?



3
@gdoron чомусь це посилання переспрямовує на це питання.
Наказник


Проблема більшості цих рішень полягає в тому, що вони не працюють правильно при зміні положення курсору в полі введення. Подивіться на мою відповідь тут: stackoverflow.com/a/20826207/641452
Colin Breame

Відповіді:


369
$(document).ready(function() {
    $("input:text").focus(function() { $(this).select(); } );
});

23
Також лише для додаткової інформації: "input [type = text]" now can be "input: text" З повагою
Рікардо Вега

8
Здається, це не працює для Chrome, і веб-сайт jQuery говорить, що це залежить від браузера. Чи може хтось ще перевірити?
Кенні Віланд

71
Схоже, браузери WebKit заважають цьому через подію миші. Я додав це, і це спрацювало: $ ('input: text'). Mouseup (function (e) {return false;});
Кенні Віланд

5
Кенні правильно, але, на жаль, "миша" також впливає на елементи керування спініром Chrome. Здається, що це вирішує "натискання", а не "фокус"
Річард Кеннард

24
Я використовую так: $ ("input: text"). Select (). Focus ();
Пхуонг

227

<input type="text" onfocus="this.select();" onmouseup="return false;" value="test" />


43
+ onmouseup = "return false", щоб зупинити скасування вибору при натисканні
Ентоні Джонстон

2
+1 для якогось stopEvent для миші, або це не працює надійно. Мінус цього полягає в тому, що після того, як курсор знаходиться в полі, клацнувши десь у виділеному тексті, щоб розташувати курсор там не працює; кліки фактично відключені. І все-таки для ситуацій, коли вибір цілого тексту на фокус бажаний, це, мабуть, менше двох злих.
загадка

Я зміг дещо подолати проблему, порушену загадкою, встановивши глобальну змінну doMouseUp на false, під час події onMouseDown, якщо це! = Document.activeElement. Потім під час onMouseUp скиньте doMouseUp до істинного та поверніть значення doMouseUp перед тим, як скинути його. Це стає суперечливим і потребує коду - я опублікую відповідь, де це пояснюється краще.
Тревіс

1
НЕ додайте, onmouseup="return false;"якщо ви бажаєте, щоб користувач міг вільно вибирати та редагувати текст після фокусування всередині текстового поля. За допомогою цього коду текст буде заблокований у ситуації "вибрати все", і користувач не зможе його редагувати, якщо користувач не введе новий текст або не скористається клавішами зі стрілками для переміщення. Чесно кажучи, це виглядає як дуже дивна поведінка і не має сенсу, якщо текстове поле не має змоги бути незмінним для редагування (а отже, вимкнено).
ADTC

1
Технічно вам не потрібно, onmouseup="return false;"якщо ви просто хочете, щоб вибір відбувався, коли користувач вперше натискає або вкладає вкладки. І +1 для ванільного javascript!
clabe45

42
$(document).ready(function() {
  $("input[type=text]").focus().select();
});

3
Підтверджено. Начебто, найвища відповідь, проголосована / прийнята, не працює для Chrome.
Арон Бойетт

39
$(document).ready(function() {
    $("input:text")
        .focus(function () { $(this).select(); } )
        .mouseup(function (e) {e.preventDefault(); });
});

1
Це добре. Дякую! Коментований коментар до відповіді Зака ​​дає один недолік запобігання mouseupподії за замовчуванням : "як тільки курсор знаходиться в полі, клацнувши десь у виділеному тексті, щоб розташувати курсор там не працює; кліки ефективно відключені. Тим не менш, для Ситуації, коли вибір цілого тексту є фокусом бажаним, це, мабуть, менше двох злом ».
ДжонК

25

jQuery - це не JavaScript, який у деяких випадках простіший у використанні.

Подивіться на цей приклад:

<textarea rows="10" cols="50" onclick="this.focus();this.select()">Text is here</textarea>

Джерело: CSS Tricks , MDN


7
Можливо, це нормально, якщо ви не заперечуєте, щоб ваша розмітка та код були змішані; Більшість людей намагаються зберегти сценарій "ненав'язливим" у наш час. О ... і jQuery - це Javascript.
Ендрю Барбер

2
Дякую за пропозицію onclick, чудово працює. Не всі користуються jQuery так раді бачити інший варіант.
Лукус

це передбачає, що користувачі використовують лише мишу
pcnate

можна використовувати onfocus = "this.focus (); this.select ()" для клавіатури
Мухаммед

21

Це не лише проблема Chrome / Safari, я відчував досить схожу поведінку з Firefox 18.0.1. Найсмішніше, що цього не відбувається на MSIE! Проблема тут - перша подія миші, яка змушує скасувати вибір вхідного вмісту, тому просто ігноруйте перше виникнення.

$(':text').focus(function(){
    $(this).one('mouseup', function(event){
        event.preventDefault();
    }).select();
});

Підхід timeOut викликає дивну поведінку, і блокуючи кожну подію миші, ви не зможете видалити виділення знову, натиснувши на вхідний елемент.


1
+1 для використання одного для запобігання однієї миші. Мені дуже не подобалося, що після початкового клацання не вдалося вибрати текст мишею.
Плук

13

HTML:

Enter Your Text : <input type="text" id="text-filed" value="test">

Використання JS:

var textFiled = document.getElementById("text-filed");
textFiled.addEventListener("focus", function() { this.select(); });

Використання JQuery:

$("#text-filed").focus(function() { $(this).select(); } );

Використання React JS:

У відповідному компоненті всередині функції візуалізації -

<input
  type="text"
  value="test"
  onFocus={e => e.target.select()}
/>

2
Це працює для мене в React:onFocus={(e) => e.target.select()}
Paito

11

моє рішення - використовувати тайм-аут. Здається, працює добре

$('input[type=text]').focus(function() {
    var _this = this;
    setTimeout(function() {
        _this.select();
    }, 10);
});

Це рішення, яке я використовую і віддаю перевагу. Я використовую значення тайм-ауту 0, оскільки це призведе до додавання його до кінця поточної черги подій, що означає, що воно запуститься після події "миші".
DavidM


4

Я знаю, що вбудований код - це поганий стиль, але я не хотів ставити це у файл .js. Працює без jQuery!

<input type="text" value="blah blah" onfocus="this.select(); this.selAll=1;" onmouseup="if(this.selAll==0) return true; this.selAll=0; return false;"></input>

3

Відповіді тут допомогли мені до певного моменту, але у мене виникли проблеми з полями введення номера HTML5 під час натискання кнопок вгору / вниз у Chrome.

Якщо натиснути одну з кнопок і натиснути курсор миші на кнопку, то число не змінюватиметься так, як ніби ви тримаєте кнопку миші, оскільки мишу викидаєте.

Я вирішив це, видаливши обробник миші, як тільки він був запущений, як показано нижче:

    $("input:number").focus(function () {
        var $elem = $(this);
        $elem.select().mouseup(function (e) {
            e.preventDefault();
            $elem.unbind(e.type);
        });
    });

Сподіваюся, це допоможе людям у майбутньому ...


Ніпес. Ви даєте рішення самостійно породженої проблеми. Якщо ви правильно подивитесь на відповідь, вони прив'язуються mouseupлише до полів введення тексту, а не до numbers. Тому ця проблема не повинна виникати
Ом Шанкар

Проблема з прив’язкою миші полягає в тому, що вона заважає під час переміщення курсору всередині поля. Це краще рішення, але якщо ви вкладете в поле, то наступний мусоун загубиться (і користувач не зможе перемістити курсор мишею). Це краще, ніж втратити всі власні будинки!
Колін Бреам

3

Це спрацює. Спробуйте це -

<input id="textField1" onfocus="this.select()" onmouseup="return false" /> 

Працює в Safari / IE 9 та Chrome, я не отримав шансу протестувати в Firefox.


3

Я знаю, що тут вже багато відповідей - але цього поки що немає; рішення, яке також працює з вмістом, створеним в ajax:

$(function (){
    $(document).on("focus", "input:text", function() { 
        $(this).select(); 
    });
});

2

Я зміг трохи покращити відповідь Зака, включивши кілька викликів функцій. Проблема з цією відповіддю полягає в тому, що він відключає onMouseUp повністю, тим самим не даючи вам клацнути в текстовому полі, як тільки він фокусується.

Ось мій код:

<input type="text" onfocus="this.select()" onMouseUp="javascript:TextBoxMouseUp();" onMouseDown="javascript:TextBoxMouseDown();" />

<script type="text/javascript">
    var doMouseUp = true;
    function TextBoxMouseDown() {
        doMouseUp = this == document.activeElement;
        return doMouseUp;
    }
    function TextBoxMouseUp() {
        if (doMouseUp)
        { return true; }
        else {
            doMouseUp = true;
            return false;
        }
    }
</script>

Це незначне поліпшення щодо відповіді Зака. Він ідеально працює в IE, зовсім не працює в Chrome і працює з поперемінним успіхом у FireFox (буквально кожен інший раз). Якщо хтось має уявлення про те, як змусити його надійно працювати у FF або Chrome, будь ласка, поділіться.

У всякому разі, я подумав, що поділюсь тим, що можу зробити це трохи приємніше.


У вашому коді є помилка - другий метод повинен називатися "TextBoxMouseUp". Погляньте на мою відповідь, яка використовує аналогічний підхід.
Колін Бреам

1
Слід зазначити, що onMouseUp=""і onMouseDown=""не є правильним стандартом w3. Вони повинні бути onmouseup=""і onmousedown="". Як і в інших атрибутах html, вони повинні писатись малими літерами, а не вершиною верблюда.
DrewT

2

Як і @Travis та @Mari, я хотів зробити автоматичний вибір, коли користувач натиснув, що означає запобігання поведінці mouseupподії за замовчуванням , але не заважає користувачеві натискати. Розроблене нами рішення, яке працює в IE11, Chrome 45, Opera 32 та Firefox 29 (це браузери, які я зараз встановив), ґрунтується на послідовності подій, пов'язаних з клацанням миші.

Коли ви клацаєте на текстовому вводі, який не має фокусу, ви отримуєте ці події (серед інших):

  • mousedown: У відповідь на ваш клацання. При необхідності обробка за замовчуванням збільшується focusі встановлює початок вибору.
  • focus: Як частина керування за замовчуванням mousedown.
  • mouseup: Завершення вашого кліку, обробка якого за замовчуванням встановить завершення вибору.

Коли ви натискаєте на введення тексту, на якому вже є фокус, focusподія пропускається. Як @Travis і @Mari обидва помітили, обробку за замовчуванням mouseupпотрібно запобігати лише в тому focusвипадку, якщо відбулася подія. Однак, оскільки жодної focusподії " не сталося", нам потрібно зробити висновок про це, що ми можемо зробити в mousedownобробниках.

@ Рішення Mari вимагає імпортувати jQuery, чого я хочу уникати. @ Рішення Тревіса робить це шляхом перевірки document.activeElement. Я не знаю, чому саме його рішення не працює у веб-переглядачах, але є інший спосіб відстежити, чи має фокус введення тексту: просто слідкуйте за його focusта blurподіями.

Ось код, який працює для мене:

    var blockMouseUp = false;
    var customerInputFocused = false;

    txtCustomer.onfocus =
      function ()
      {
        try
        {
          txtCustomer.selectionStart = 0;
          txtCustomer.selectionEnd = txtCustomer.value.length;
        }
        catch (error)
        {
          txtCustomer.select();
        }

        customerInputFocused = true;
      };

    txtCustomer.onblur =
      function ()
      {
        customerInputFocused = false;
      };

    txtCustomer.onmousedown =
      function ()
      {
        blockMouseUp = !customerInputFocused;
      };

    txtCustomer.onmouseup =
      function ()
      {
        if (blockMouseUp)
          return false;
      };

Я сподіваюся, що це комусь допоможе. :-)


+1 Дякую, але як це можна переписати, щоб ви не жорстко зашифрували керування "txtCustomer" у сценарій? Чи є спосіб передати об’єкт "цього"?
Fandango68

Одним із способів було б створити функцію корисності для застосування поведінки до будь-якого елемента, переданого як параметр. У межах цієї функції посилання на елемент було б жорстко закодовано - до параметра. Потім ви можете викликати його на будь-якій кількості вхідних елементів, ідентифікованих будь-якими способами, якими ви користуєтесь. :-)
Джонатан Гілберт

Вибачте, що я ноб. Чи можете ви, будь ласка, оновити свою відповідь прикладом? Спасибі
Fandango68

1
Просто загортайте написаний нами код у декларацію про функцію, яка приймає параметр під назвою "txtCustomer". Я рекомендую перейменувати "txtCustomer" на щось інше, але якщо ви не впевнені в цьому, це технічно буде працювати зі змінною під назвою "txtCustomer". Тобто: функція MakeTextBoxAutoSelect (txtCustomer) { те, що я писав вище }
Джонатан Гілберт


1

Що таке рішення JavaScript або jQuery, яке вибере весь вміст текстового поля, коли текстова скринька отримає фокус ?

Вам потрібно лише додати такий атрибут:

onfocus="this.select()"

Наприклад:

<input type="text" value="sometext" onfocus="this.select()">

(Чесно кажучи, я не маю поняття, навіщо вам потрібно щось інше.)


1

Це працювало для мене (публікація, оскільки це не у відповідях, а в коментарі)

 $("#textBox").focus().select();

0
$('input').focus(function () {
    var self = $(this);
    setTimeout(function () {
        self.select();
    }, 1);        
});

Редагувати: За запитом @ DavidG я не можу надати деталі, тому що я не впевнений, чому це працює, але я вважаю, що це має відношення до події фокусування, що поширюється вгору чи вниз, або що завгодно, і вхідний елемент отримує сповіщення він отримав фокус. Встановлення тайм-ауту дає елементу момент, щоб зрозуміти, що це зроблено.


Будь ласка, поясніть свою відповідь, а не просто вставляючи в якийсь код.
DavidG

0

Якщо ви пов'язуєте події разом, я вважаю, що це усуває необхідність використання, .oneяк пропонується в іншому потоці.

Приклад:

$('input.your_element').focus( function () {
    $(this).select().mouseup( function (e) {
        e.preventDefault();
    });
});

0

Примітка. Якщо ви програмуєте в ASP.NET, сценарій можна запустити за допомогою ScriptManager.RegisterStartupScript в C #:

ScriptManager.RegisterStartupScript(txtField, txtField.GetType(), txtField.AccessKey, "$('#MainContent_txtField').focus(function() { $(this).select(); });", true );

Або просто введіть скрипт на сторінці HTML, запропонованій в інших відповідях.


Питання не має ASP.NET ніде. : |
Мохамед Тауфік

Щоправда, я розмістив це на випадок, якщо програміст використовує ASP.NET. Це може бути корисно для того, хто шукає відповідь за допомогою фреймворку (як це мені допомогло). Я просто ділюсь і, сподіваюся, хтось вважатиме це корисним.
Ексель Гамбоа

На випадок, якщо програміст використовує ASP.NET, він додасть тег "asp.net" до питання. : |
Мохаммед Тауфік

0

Я сію цю десь, працюю чудово!

            $('input').on('focus', function (e) {
                $(this)
                $(element).one('mouseup', function () {
                        $(this).select();
                        return false;
                    })                        .select();
            });

0

Я запізнююся на вечірку, але це ідеально працює в IE11, Chrome, Firefox, не псуючи миші (і без JQuery).

inputElement.addEventListener("focus", function (e) {
    var target = e.currentTarget;
    if (target) {
        target.select();
        target.addEventListener("mouseup", function _tempoMouseUp(event) {
            event.preventDefault();
            target.removeEventListener("mouseup", _tempoMouseUp);
        });
    }
});

так, але якщо ви focus, вклавши в поле, ви знайдете декількох слухачів подій миші, що додають ...
Себастьян Шолль

-1

Моє рішення наступне:

var mouseUp;
$(document).ready(function() {
    $(inputSelector).focus(function() {
        this.select();
    }) 
    .mousedown(function () {
        if ($(this).is(":focus")) {
          mouseUp = true;
        }
        else {
          mouseUp = false;
        }
     })
     .mouseup(function () {
        return mouseUp;
     });
});

Таким чином, миша працюватиме зазвичай, але не зробить скасування вибору після отримання фокусу шляхом введення

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.