введення jquery виберіть усе на фокусі


326

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

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

Я хочу, щоб все залишалося обраним.


Який веб-переглядач, здається, працює для мене у FF?
R0MANARMY

8
Chrome = невдача для цього
wowo_999

1
Я використовував Chrome, але .click () вирішує проблему :)
Тім,

4
Примітка: прийнята відповідь тут вирішує лише половину проблеми. Це робить роботу вибору, але ускладнює її повторне виділення з наступними клацаннями. Краще рішення можна знайти тут: stackoverflow.com/questions/3380458/…
SDC

Відповіді:


480

Спробуйте використовувати clickзамість focus. Здається, це працює як для миші, так і для ключових подій (принаймні в Chrome / Mac):

jQuery <версія 1.7:

$("input[type='text']").click(function () {
   $(this).select();
});

версія jQuery 1.7+:

$("input[type='text']").on("click", function () {
   $(this).select();
});

Ось демонстрація


62
проблема полягає в тому, що ви більше не можете вибирати частину тексту мишею, як тільки відбувається натискання, вибирається повний текст.
Хелін Ван

6
Не життєздатне рішення для мене. Це створює проблему, описану Вангом.
Маркес

1
Нижче є рішення Nianpeng, яке також працює з підбором тексту миші.
Філіберт Персе

4
@AwQiruiGuo $ .fn.on ("натискання", ..) може використовувати менше пам'яті та працювати для динамічно доданих дочірніх елементів.
Рікі Бойс

7
Це не працює для фокусування поля під час вкладки.
Колін Бреам

65

Я думаю, що це відбувається саме так:

focus()
   UI tasks related to pre-focus
   callbacks
       select()
   UI tasks related to focus (which unselect again)

Вирішення проблеми може викликати асинхронно select (), щоб він повністю запускався після фокусування ():

$("input[type=text]").focus(function() { 
    var save_this = $(this);
    window.setTimeout (function(){ 
       save_this.select(); 
    },100);
});

3
$ ("input [type = text]"). focus (function () {var save_this = $ (this); window.setTimeout (function () {save_this.select ();}, 100);});
etienne

@etienne: О, хороший момент: поводження з ними thisтрохи несподіване в таких сферах. Я оновлю код.
Пісквор вийшов із будівлі

3
значення тайм-ауту 0 теж здається нормальним, і функція "focusin ()" також працює з цим методом.
Тангуй

4
так, вам навіть не потрібно встановлювати період. 0 буде добре, оскільки тайм-аути запускаються в кінці поточного стеку викликів. це означає, що фокус і натискання подій все
загоряють

1
Схоже, у Timeout 0 виникає проблема, що подія "натискання" може запуститись у пізнішому кадрі, повторно вибираючи поле. Я вважаю, що час очікування працює 10 добре - немає помітної затримки, але надійніше, ніж 0.
Філ

57

Я думаю, це краще рішення. На відміну від простого вибору події onclick, це не перешкоджає вибору / редагуванню тексту за допомогою миші. Він працює з основними рендерингами, включаючи IE8.

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

http://jsfiddle.net/25Mab/9/


4
Це працює лише для існуючих полів, ось оновлення для прив’язки його до нових полів введення: jsfiddle.net
adriaan

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

Це не дозволяє другим клацанням у числових введеннях вибрати іншу частину тексту за допомогою миші. Видалення другого, select()здається, працює.
dperish

Ще краще з додатковим$('input[autofocus]').select();
Daniel Bleisteiner

38

Тут є кілька гідних відповідей, і @ user2072367 є моїм улюбленим, але це має несподіваний результат, коли ви фокусуєтесь через вкладку, а не через клацання. (несподіваний результат: щоб нормально вибрати текст після фокусування через вкладку, потрібно натиснути ще один раз)

Ця скрипка виправляє цю маленьку помилку та додатково зберігає $ (this) у змінній, щоб уникнути зайвого вибору DOM. Перевір! (:

Випробувано в IE> 8

$('input').on('focus', function() {
    var $this = $(this)
        .one('mouseup.mouseupSelect', function() {
            $this.select();
            return false;
        })
        .one('mousedown', function() {
            // compensate for untriggered 'mouseup' caused by focus via tab
            $this.off('mouseup.mouseupSelect');
        })
        .select();
});

2
Додавання +1 до вашого рішення та @ user2072367 є найчистішим у цілій темі, і я хотів би, щоб був спосіб швидше досягти вершини.
KyleMit

1
Навіть працює, якщо користувач намагається самостійно вибрати весь текст, браво.
Вітані

Для мене це не працює на ie11 на Windows 8.1. Це працює в ie11 на windows 7 та на windows 10
Ларс Томас Бредленд

1
@LarsThomasBredland Я просто намагався виграти 8,1 + ie11, і це працює як очікувалося. Що для вас "не працює"?
animatedgif

Він просто нічого не вибирає. (Я тестував на іншому win8, і він працює там - той самий рівень os, тобто версія)
Ларс Томас Бредленд

21

Після ретельного огляду я пропоную це як набагато чистіше рішення в цій темі:

$("input").focus(function(){
    $(this).on("click.a keyup.a", function(e){      
        $(this).off("click.a keyup.a").select();
    });
});

Демонстрація у jsFiddle

Проблема:

Ось трохи пояснення:

Спочатку давайте подивимось на порядок подій, коли ви клацаєте мишкою або вкладкою в поле.
Ми можемо реєструвати всі відповідні події, як це:

$("input").on("mousedown focus mouseup click blur keydown keypress keyup change",
              function(e) { console.log(e.type); });

зосередження подій

Примітка : я змінив це рішення на використання, clickа не mouseupяк це відбувається пізніше в конвеєрі подій, і, здавалося, викликає деякі проблеми в firefox, як за коментарем @ Jocie

Деякі браузери намагаються розмістити курсор під час mouseupабо clickподій. Це має сенс, оскільки ви, можливо, захочете запустити каре в одному положенні та перетягніть курсор, щоб виділити текст. Він не може визначити положення каретки, поки ви фактично не підняли мишу. Тож функції, які обробляють focus, судиться відповідати занадто рано, залишаючи браузер перекривати ваше позиціонування.

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

Рішення:

Натомість в focusобробці подій ми можемо швидко приєднати слухачів для подій click(натисніть) та keyup(вкладка), які збираються запустити.

Примітка . Клавіатура події вкладки фактично запуститься в новому полі введення, а не в попередньому

Ми хочемо запустити подію лише один раз. Ми могли б використовувати .one("click keyup), але це викликало б обробник подій один раз для кожного типу події . Натомість, як тільки натискається клавіша миші або клавіатура, ми викликаємо нашу функцію. Перше, що ми зробимо - це видалити обробники для обох. Таким чином, не має значення, чи ми вкладали вкладки чи микали. Функція повинна виконуватися рівно один раз.

Примітка . Більшість браузерів, звичайно, вибирають увесь текст під час події на вкладці, але, як вказував анімографічний малюнок , ми все ще хочемо обробляти keyupподію, інакше mouseupподія все ще затримуватиметься в будь-який час, коли ми вклали вкладку. Ми слухаємо обидва, щоб ми могли перетворитись вимкніть слухачів, як тільки ми обробимо вибір.

Тепер ми можемо зателефонувати select()після того, як веб-переглядач здійснив свій вибір, тому ми впевнені, що перекриємо поведінку за замовчуванням.

Нарешті, для додаткового захисту ми можемо додати простори імен подій до функцій mouseupта keyupфункцій, щоб .off()метод не видаляв інших слухачів, які можуть бути відтворені.


Тестовано в IE 10+, FF 28+ та Chrome 35+


Крім того, якщо ви хочете розширити jQuery з функцією, яка називається, onceщо запустить рівно один раз для будь-якої кількості подій :

$.fn.once = function (events, callback) {
    return this.each(function () {
        var myCallback = function (e) {
            callback.call(this, e);
            $(this).off(events, myCallback);
        };
        $(this).on(events, myCallback);
    });
};

Тоді ви можете спростити код далі так:

$("input").focus(function(){
    $(this).once("click keyup", function(e){      
        $(this).select();
    });
});

Демо в скрипці


У Firefox 31 у Windows ваш код вибирає текст лише при кожному натисканні кнопки між двома текстовими полями
Vitani

1
@Jocie, я не впевнений, чому він чергується, але схоже, що FF обробляє підбір тексту у clickвипадку, який знаходиться внизу, ніж далі mouseup. Оскільки ми хочемо обробити кінець вибору якомога пізніше, щоб дати нам найбільший шанс перекрити браузер, використовуючи клацання замість миші, слід зробити це. Тестовано на FF, Chrome та IE.
KyleMit

1
Дякую! Нарешті рішення, яке дійсно працює і у всіх браузерах!
Вінсент

1
Так! Це працювало і для мене! Дякую. Це повинна була бути офіційна відповідь
Fandango68

1
@RiZKiT oneне виріже це як "Обробник виконується один раз на елемент за типом події . Він автоматично вимикає подію, яка його запустила, але інший все ще буде затримуватися навколо, і offвсе одно піклується про це. Дивіться мій питання: функція, яка спрацює рівно один раз для будь-якої кількості подій
KyleMit

13

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

$("input[type=text]").click(function() {
    if(!$(this).hasClass("selected")) {
        $(this).select();
        $(this).addClass("selected");
    }
});
$("input[type=text]").blur(function() {
    if($(this).hasClass("selected")) {
        $(this).removeClass("selected");
    }
});

1
Важливо зберегти можливість вибору частини тексту за допомогою миші. Я використовую це та його A1
Філіберт Персе

2
Тут занадто багато відбувається, використовуйте рішення для фокусування / миші user2072367
Джордж

@George user2072367's досить хороший, але він має серйозні недоліки. Ознайомтесь з моїм рішенням (:
animatedgif

6

Ця версія працює на ios, а також фіксує стандартне перетягування для вибору на хром Windows

var srcEvent = null;

$("input[type=text],input[type=number]")

    .mousedown(function (event) {
        srcEvent = event;
    })

    .mouseup(function (event) {
        var delta = Math.abs(event.clientX - srcEvent.clientX) 
                  + Math.abs(event.clientY - srcEvent.clientY);

        var threshold = 2;
        if (delta <= threshold) {
                   try {
                        // ios likes this but windows-chrome does not on number fields
                        $(this)[0].selectionStart = 0;
                        $(this)[0].selectionEnd = 1000;
                    } catch (e) {
                        // windows-chrome likes this
                        $(this).select();
                    }
        }
    });

http://jsfiddle.net/Zx2sc/2/


Відредаговано, щоб додати потворну спробу / зловити, щоб заспокоїти браузери
anihilnine

5

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

onmouseupПодія змінює положення курсору в межах поля, яке обпікало після того, як onfocus(принаймні , в межах Chrome і FF). Якщо ви беззастережно відмовитеся, mouseupкористувач не може змінити положення курсору за допомогою миші.

function selectOnFocus(input) {
    input.each(function (index, elem) {
        var jelem = $(elem);
        var ignoreNextMouseUp = false;

        jelem.mousedown(function () {
            if (document.activeElement !== elem) {
                ignoreNextMouseUp = true;
            }
        });
        jelem.mouseup(function (ev) {
            if (ignoreNextMouseUp) {
                ev.preventDefault();
                ignoreNextMouseUp = false;
            }
        });
        jelem.focus(function () {
            jelem.select();
        });
    });
}
selectOnFocus($("#myInputElement"));

Код умовно запобігає mouseupповедінці за замовчуванням, якщо в даний момент у полі немає фокусу. Він працює в таких випадках:

  • клацання, коли поле не зосереджене
  • клацання, коли поле має фокус
  • вкладка в поле

Я перевірив це в Chrome 31, FF 26 та IE 11.


Це ідеально підходить для подій клацання, але якщо я використовую вкладку для переходу до наступного поля введення, я бачу, що вміст вибирається та
відміняється

4

Знайдено дивовижне рішення, читаючи цю тему

$(function(){

    jQuery.selectText('input:text');
    jQuery.selectText('input:password');

});

jQuery.extend( {
    selectText: function(s) { 
        $(s).live('focus',function() {
            var self = $(this);
            setTimeout(function() {self.select();}, 0);
        });
    }
});


не забувайте про всі інші текстові типи HTML5, наприклад, 'input [type = email]'
jamiebarrow

3

Я приходжу з кінця 2016 року, і цей код просто працює в останніх версіях jquery (в цьому випадку jquery-2.1.3.js).

if ($(element).is("input")) {
    $(element).focus(function () {
        $(element).select();
    });
}

2

Я використовував FF 16.0.2 та jquery 1.8.3, весь код у відповіді не працював.
Я використовую такий код і працюю.

$("input[type=text]").focus().select();

4
Це не відповідає на питання, що полягає у тому, як вибрати вміст вікна введення, коли користувач фокусує поле . Це негайно фокусується та вибере код без введення користувачем.
салюс

@saluce я не розумію, що ти маєш на увазі? що запитуючий хоче, коли він вибирає поле, вибирається весь поточний текст. І мій код повинен був це зробити. Я навіть використовую це для свого проекту, як час, коли я пишу цю відповідь.
GusDeCooL

1
Цей код зосереджує увагу і вибиратиме все під час його запуску, але сам по собі код не прив’язаний до події , створеної користувачем , наприклад, натискання на текстове поле. Наприклад, $("input[type=text]").on('click', function () { $(this).focus.select(); })викликає фокусування і вибір відбувається, коли користувач натискає на поле, тому що він виконується, коли користувач натискає поле. Без обробника подій код не відповідає на запитання, звідси голосування та коментар. В основному, ви отримали "весь поточний текст обраний", але не "коли він вибирає поле".
салюс

1
@GusDeCooL досить смішно (хоча це не зовсім те, що він просив), я хотів досягти такого ж результату, як і ти на цьому :)
Robbie Averill

2
var timeOutSelect;
$("input[type=text]").focus(function() { 
        var save_this = $(this);
        clearTimeout(timeOutSelect);
        timeOutSelect = window.setTimeout (function(){ 
                save_this.select(); 
        }, 100);
});

Використовуйте clearTimeout для більшої безпеки, якщо швидко переключитися між двома входами. ClearTimeout очистити старий час очікування ...


Відредагуйте додаткові відомості. Відповіді, що містять лише коди, та "спробувати це" не рекомендують, оскільки вони не містять вмісту, який можна шукати, і не пояснюють, чому хтось повинен "спробувати це". Ми докладаємо зусиль, щоб бути ресурсом для знань.
Брайан Томпсетт - 汤 莱恩

2

Чудово працює з рідним JavaScript select().

$("input[type=text]").focus(function(event) {
   event.currentTarget.select();
});

або взагалі:

$("input[type=text]")[0].select()

1

Або ви можете просто використовувати <input onclick="select()">Works perfect.


ні, це не так. це працює для вибору цілого. але спробуйте вибрати частину тексту вручну, ви не зможете це зробити.
Sujay Phadke


0
<script>$.ready( $("input[type=text]").attr("onclick" , "this.select()"));<script>

Це, мабуть, буде позначено як відповідь низької якості, оскільки в ньому немає пояснень того, що відбувається.
tumultous_rooster

Ваше $.readyневірно. Вам потрібно передати йому функцію, щоб змусити її затримувати, attrпоки документ не буде готовий. Ви робите це відразу, після чого передаєте колекцію елементів $.ready.
doug65536

Крім того, уникайте "onclick", особливо таким чином. Використовуйте addEventListener.
doug65536

0

Я завжди використовую requestAnimationFrame()для переходу на внутрішні механізми після подій, і це прекрасно працює у Firefox. Не перевірений у Chrome.

$("input[type=text]").on('focus', function() {
    requestAnimationFrame(() => $(this).select());
});
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.