jQuery - виберіть весь текст із текстової області


130

Як я можу це зробити так, коли клацніть всередині текстової області, вибирається весь її вміст?

І врешті, коли ви клацнете ще раз, скасуйте його.



5
@Blender: Ні, це питання стосується виділення тексту в елементі, а не текстовій області. Два цілком різні.
Тім Даун

Відповіді:


194

Щоб користувач не дратувався, коли весь текст вибирався кожен раз, коли він намагався перемістити карету за допомогою миші, слід робити це за допомогою focusподії, а не clickподії. Далі буде виконано завдання і вирішиться проблема в Chrome, яка не дозволяє найпростішій версії (тобто просто викликати select()метод textarea в focusобробнику подій).

jsFiddle: http://jsfiddle.net/NM62A/

Код:

<textarea id="foo">Some text</textarea>

<script type="text/javascript">
    var textBox = document.getElementById("foo");
    textBox.onfocus = function() {
        textBox.select();

        // Work around Chrome's little problem
        textBox.onmouseup = function() {
            // Prevent further mouseup intervention
            textBox.onmouseup = null;
            return false;
        };
    };
</script>

Версія jQuery:

$("#foo").focus(function() {
    var $this = $(this);
    $this.select();

    // Work around Chrome's little problem
    $this.mouseup(function() {
        // Prevent further mouseup intervention
        $this.unbind("mouseup");
        return false;
    });
});

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

2
це не допоможе мені в Chrome, робочий розчин: stackoverflow.com/a/6201757/126600
Zack

@zack: Приклад jsFiddle у цій відповіді працює для мене в Chrome. Це не для вас? Я погоджуюся з тим, що відповідь, з якою ви пов'язуєтесь, є більш дурною.
Тім Даун

@TimDown: ви маєте рацію, я трохи ревнував - насправді він працює правильно на "клік", але не вдається, якщо ви tabпотрапили в textarea - ваше інше рішення працює в обох випадках :)
Zack

Трохи змінити вищезазначений код, і він буде працювати як шарм .. $("#foo").mouseup(function() { $("#foo").unbind("mouseup"); return false; }); вам потрібно посилатись на текстове поле, не використовуючи thisпросто посилатися на нього з повним шляхом .. і він спрацює ..
pratikabu

14

Краще, із вирішенням проблеми із вкладками та хромуванням та новим способом jquery

$("#element").on("focus keyup", function(e){

        var keycode = e.keyCode ? e.keyCode : e.which ? e.which : e.charCode;
        if(keycode === 9 || !keycode){
            // Hacemos select
            var $this = $(this);
            $this.select();

            // Para Chrome's que da problema
            $this.on("mouseup", function() {
                // Unbindeamos el mouseup
                $this.off("mouseup");
                return false;
            });
        }
    });

11

Я в кінцевому підсумку скористався цим:

$('.selectAll').toggle(function() {
  $(this).select();
}, function() {
  $(this).unselect();
});

але я не знаю, як перевірити, чи текст вже вибраний, тому я можу змінити дві дії :(
Alex

1
@ Алекс: Я б не сильно возився з цим, якби ти був. Користувачі очікують стандартної поведінки від textareas.
Тім Даун

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

@Alex: Ага, правильно. Ви можете зробити його лише для читання, додавши readonlyпотім атрибут.
Тім Даун

1
@Hollister: Ні, користувачеві або сценарію цілком можливо вибрати вміст у розділі. Ви, напевно, думаєте скопіювати у буфер обміну, що неможливо в сценарії без бібліотеки на базі Flash, як ZeroClipboard.
Тім Даун


5

Трохи коротша версія jQuery:

$('your-element').focus(function(e) {
  e.target.select();
  jQuery(e.target).one('mouseup', function(e) {
    e.preventDefault();
  });
});

Він правильно поводиться з кутовим корпусом Chrome. Для прикладу див. Http://jsfiddle.net/Ztyx/XMkwm/ .


4

Вибір тексту в елементі (схожий на виділення мишкою)

:)

Використовуючи прийняту відповідь на цій публікації, ви можете зателефонувати до такої функції:

$(function() {
  $('#textareaId').click(function() {
    SelectText('#textareaId');
  });
});

Можливо, позначення цього питання як дубліката може бути кориснішим? Насправді це не ваша відповідь, тому краще було б об'єднати два питання.
Блендер

Погоджено - Хоча ОП може отримати користь від додаткового пояснення щодо її реалізації. :)
Тодд

Це питання стосується виділення тексту в елементі, а не текстовій області. Два цілком різні.
Тім Даун

дякую, я з’ясував, що я можу це зробити $(this).select(), я буду використовувати це, оскільки це менше коду :)
Alex
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.