Выделите текст на Фокусе ввода
у меня есть ввод текста. Когда вход получает фокус, я хочу выделить текст внутри входа.
С jQuery я бы сделал это так:
<input type="text" value="test" />
$("input[type=text]").click(function() {
$(this).select();
// would select "test" in this example
});
Я искал вокруг, чтобы попытаться найти угловой способ, но большинство примеров, которые я нахожу, имеют дело с директивой, которая наблюдает за модальным свойством для изменения. Я предполагаю, что мне нужна директива, которая следит за вводом, который получает фокус. Как бы я это сделал?
8 ответов:
способ сделать это в Angular заключается в создании пользовательской директивы, которая выполняет автоматический выбор для вас.
module.directive('selectOnClick', ['$window', function ($window) { return { restrict: 'A', link: function (scope, element, attrs) { element.on('click', function () { if (!$window.getSelection().toString()) { // Required for mobile Safari this.setSelectionRange(0, this.value.length) } }); } }; }]);примените директиву следующим образом:
<input type="text" value="test" select-on-click />обновление 1: удалена зависимость jQuery.
обновление 2: ограничить как атрибут.
Update3: работает в мобильном Safari. Позволяет выделить часть текста (требуется IE>8).
вот расширенная директива, которая позволяет избежать повторного выбора текста, когда пользователь щелкает, чтобы поместить курсор в поле ввода.
module.directive('selectOnClick', function () { return { restrict: 'A', link: function (scope, element) { var focusedElement; element.on('click', function () { if (focusedElement != this) { this.select(); focusedElement = this; } }); element.on('blur', function () { focusedElement = null; }); } }; })
это старый ответ, для углового 1.x
лучший способ сделать это с помощью
ng-clickвстроенные директивы:<input type="text" ng-model="content" ng-click="$event.target.select()" />EDIT:
как JoshMB любезно напомнил; ссылка на узлы DOM в Angular 1.2+ больше не допускается. Итак, я переехал
$event.target.select()в контроллер:<input type="text" ng-model="content" ng-click="onTextClick($event)" />затем в вашем контроллере:
$scope.onTextClick = function ($event) { $event.target.select(); };здесь пример скрипка.
ни одно из предложенных решений не сработало для меня. После быстрого исследования я придумал это:
module.directive('selectOnFocus', function ($timeout) { return { restrict: 'A', link: function (scope, element, attrs) { var focusedElement = null; element.on('focus', function () { var self = this; if (focusedElement != self) { focusedElement = self; $timeout(function () { self.select(); }, 10); } }); element.on('blur', function () { focusedElement = null; }); } } });Это сочетание нескольких предложенных решений, но работает как на щелчок и фокус (думаю, автофокус) и позволяет вручную выбрать частичное значение на входе.
для меня ng-click не имел смысла, потому что вы никогда не могли переместить курсор, не выделив весь текст снова, я обнаружил, что это раздражает. Тогда лучше использовать ng-focus, потому что текст выбирается только в том случае, если вход не был сфокусирован, если вы снова нажмете, чтобы переместить курсор, то текст просто отменяет выбор, как и ожидалось, и вы можете писать между ними.
я обнаружил, что этот подход является ожидаемым поведением UX.
использовать НГ-фокус
Вариант 1: отдельный код
<input type="text" ng-model="content" ng-focus="onTextFocus($event)" />и в контроллер
$scope.onTextFocus = function ($event) { $event.target.select(); };Вариант 2: в качестве альтернативы вы можете присоединиться к коду выше в этот "однострочный" (я не тестировал это, но он должен работать)
<input type="text" ng-model="content" ng-focus="$event.target.select()" />
принятый ответ использует событие click однако, если вы используете событие focus, только 1-й щелчок вызовет событие, а также срабатывает, когда используется какой-либо другой метод для фокусировки на входе (например, нажатие вкладки или вызов фокуса в коде).
Это также делает ненужным проверять, если элемент уже сосредоточен, как предполагает ответ Тамлина.
app.directive('selectOnClick', function () { return { restrict: 'A', link: function (scope, element, attrs) { element.on('focus', function () { this.select(); }); } }; });
в angular 2 это сработало для меня, как в Chrome, так и в Firefox:
<input type="text" (mouseup)="$event.target.select()">
модифицированная версия, которая работала для меня. Первый щелчок выделяет текст, второй щелчок по тому же элементу отменяет выделение текста
module.directive('selectOnClick', function ($timeout) { return { restrict: 'A', link: function (scope, element, attrs) { var prevClickElem = null; //Last clicked element var ignorePrevNullOnBlur = false; //Ignoring the prevClickElem = null in Blur massege function element.on('click', function () { var self = this; if (prevClickElem != self) { //First click on new element prevClickElem = self; $timeout(function () { //Timer if(self.type == "number") self.select(); else self.setSelectionRange(0, self.value.length) }, 10); } else { //Second click on same element if (self.type == "number") { ignorePrevNullOnBlur = true; self.blur(); } else self.setSelectionRange(self.value.length, self.value.length); //deselect and set cursor on last pos } }); element.on('blur', function () { if (ignorePrevNullOnBlur == true) ignorePrevNullOnBlur = false; //blur called from code handeling the second click else prevClickElem = null; //We are leaving input box }); } }})
Comments