JQuery ввода выбрать все в фокусе - PullRequest
309 голосов
/ 30 июня 2010

Я использую этот код, чтобы попытаться выделить весь текст в поле, когда пользователь фокусируется на поле. Что происходит, он выбирает все на секунду, затем не выбирается и курсор ввода остается там, где я щелкнул ...

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

Я хочу, чтобы все оставалось выделенным.

Ответы [ 16 ]

456 голосов
/ 30 июня 2010

Попробуйте использовать click вместо focus.Похоже, что это работает как для событий мыши и клавиш (по крайней мере, в Chrome / Mac):

jQuery <версия 1.7: </p>

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

jQuery версия 1.7 +:

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

Вот демоверсия

65 голосов
/ 30 июня 2010

Я думаю, что происходит так:

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

Обходной путь может вызывать select () асинхронно, чтобы он полностью выполнялся после focus ():

$("input[type=text]").focus(function() { 
    var save_this = $(this);
    window.setTimeout (function(){ 
       save_this.select(); 
    },100);
});
55 голосов
/ 30 августа 2013

Я думаю, что это лучшее решение.В отличие от простого выбора в событии onclick, это не мешает выделению / редактированию текста с помощью мыши.Он работает с основными движками рендеринга, включая IE8.

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

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

37 голосов
/ 28 февраля 2014

Здесь есть несколько достойных ответов, и @ 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();
});
20 голосов
/ 05 июля 2014

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

$("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); });

focus events

Примечание : я изменил это решение, чтобы использовать click вместо mouseup в качествеэто происходит позже в конвейере событий и, кажется, вызывает некоторые проблемы в Firefox согласно комментарию @ Jocie

Некоторые браузеры пытаются позиционировать курсор во время событий mouseup или click.Это имеет смысл, поскольку вы можете запустить каретку в одной позиции и перетащить ее, чтобы выделить текст.Он не может обозначать положение каретки, пока вы на самом деле не подняли мышь.Поэтому функциям, которые обрабатывают focus, суждено реагировать слишком рано, и браузер переопределяет ваше позиционирование.

Но проблема в том, что мы действительно хотим обработать событие фокуса.Это позволяет нам узнать, когда кто-то вышел на поле.После этого мы не хотим продолжать переопределять поведение выбора пользователя.

Решение:

Вместо этого, в обработчике событий focus мы можем быстро подключить прослушиватели для событий click (click in) и keyup (tab in), которыеготовность к запуску.

Примечание : при нажатии кнопки табуляции событие фактически срабатывает в новом поле ввода, а не в предыдущем

Мы хотим запустить событие только один раз.Мы можем использовать .one("click keyup), но это вызовет обработчик события один раз для каждого типа события .Вместо этого, как только будет нажата кнопка mouseup или keyup, мы вызовем нашу функцию.Первое, что мы сделаем, это удалим обработчики для обоих.Таким образом, не имеет значения, будем ли мы вкладывать или вставлять. Функция должна выполняться ровно один раз.

Примечание : большинство браузеров естественным образом выделяют весь текст во время события вкладки, нокак animatedgif указал , мы все еще хотим обработать событие keyup, в противном случае событие mouseup все еще будет задерживаться каждый раз, когда мы вкладываем вкладку. Мы слушаем оба, чтобы мы могли отключитьслушатели, как только мы обработали выделение.

Теперь мы можем вызвать select() после того, как браузер сделал свой выбор, поэтому мы обязательно переопределим поведение по умолчанию.

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


Протестировано в IE 10+, FF 28+ и Chrome 35 +


В качестве альтернативы, если вы хотите расширить jQuery с помощью функции называется once, который сработает ровно один раз для любого числа of events :

$.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();
    });
});

Демонстрация в скрипке

13 голосов
/ 21 мая 2013

Это сделает работу и позволит избежать проблемы, из-за которой вы больше не можете выделять часть текста мышью.

$("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");
    }
});
6 голосов
/ 02 апреля 2014

Эта версия работает на ios, а также исправляет стандартное перетаскивание для выбора на Windows Chrome

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/

5 голосов
/ 29 декабря 2013

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

Событие 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 голосов
/ 21 марта 2013

Нашел отличное решение, читая эту тему

$(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);
        });
    }
});
2 голосов
/ 11 ноября 2016

Я работаю в конце 2016 года, и этот код работает только в последних версиях jquery (в данном случае jquery-2.1.3.js).

if ($(element).is("input")) {
    $(element).focus(function () {
        $(element).select();
    });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...