在输入焦点上选择文本

Bil*_*ver 118 angularjs angularjs-directive

我有一个文字输入.当输入获得焦点时,我想选择输入内的文本.

使用jQuery我会这样做:

<input type="text" value="test" />
Run Code Online (Sandbox Code Playgroud)
$("input[type=text]").click(function() {
    $(this).select();
    // would select "test" in this example
});
Run Code Online (Sandbox Code Playgroud)

我一直在寻找尝试找到Angular的方法,但我发现的大多数例子都是在处理一个正在观察变化的模态属性的指令.我假设我需要一个正在观察获得焦点的输入的指令.我该怎么办?

Mar*_*tin 211

在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)
                }
            });
        }
    };
}]);
Run Code Online (Sandbox Code Playgroud)

像这样应用指令:

<input type="text" value="test" select-on-click />
Run Code Online (Sandbox Code Playgroud)

View demo

Update1:删除了jQuery依赖项.

Update2:限制为属性.

Update3:适用于移动版Safari.允许选择部分文本(要求IE> 8).

  • 如果你想在没有jquery的情况下这样做,可以将element.click更改为element.bind('click',function(){...},将element.select()更改为element [0] .select() (10认同)
  • 美好而优雅.我还明确地将该指令限制为应用为属性(通过返回一个对象文字并设置`restrict:'A'`),因为该指令旨在*扩展现有元素*的行为. (3认同)
  • @ ak85 [显然移动版Safari需要一些稍微不同的javascript](http://stackoverflow.com/questions/4067469/selecting-all-text-in-html-text-input-when-clicked/4067488#4067488) (2认同)

Tam*_*lyn 43

这是一个增强的指令,避免在用户单击以将光标定位在输入框中时重新选择文本.

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;
            });
        }
    };
})
Run Code Online (Sandbox Code Playgroud)

  • 我认为这个答案比接受的要好,因为它允许将光标设置到输入文本中的某个位置,但是,作为指令有自己的范围 - 我建议将**focusedElement**变量重命名为**isElementFocused**并存储在那里_对或错_ (3认同)
  • 我得到Uncaught TypeError:对于.select(),undefined不是"this"的函数; 是的jQuery 1.9.1包括在内. (2认同)

Onu*_*rım 40

对于Angular 1.x来说,这是一个古老的答案

更好的方法是使用ng-click内置指令:

<input type="text" ng-model="content" ng-click="$event.target.select()" />
Run Code Online (Sandbox Code Playgroud)

编辑:

正如JoshMB善意地提醒的那样; 不再允许在Angular 1.2+中引用DOM节点.所以,我已经搬进$event.target.select()了控制器:

<input type="text" ng-model="content" ng-click="onTextClick($event)" />
Run Code Online (Sandbox Code Playgroud)

然后在你的控制器中:

$scope.onTextClick = function ($event) {
    $event.target.select();
};
Run Code Online (Sandbox Code Playgroud)

这是一个小例子.

  • 据我所知,这不再支持.Angular会抛出一个错误:"不允许在Angular表达式中引用DOM节点!".有关详细信息,请参阅此主题:https://groups.google.com/forum/#!topic/angular/windowsTbZ86WAY4.然而,指令方法运作良好. (2认同)
  • DOM更改应该在指令中完成,还是不? (2认同)

xar*_*lis 15

所提出的解决方案都不适合我.经过快速研究后,我想出了这个:

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;
            });
    }

  }

});
Run Code Online (Sandbox Code Playgroud)

它是所提出的几种解决方案的混合,但同时适用于点击和聚焦(想想自动对焦),并允许在输入中手动选择部分值.

  • 当你从onClick中调整它时,似乎你留下了一些代码...`focusedElement`的重点是什么? (2认同)

jpe*_*lli 12

对我来说,ng-click没有意义,因为你再也无法重新定位光标而没有再次选择所有文本,我发现这是令人讨厌的.然后最好使用ng-focus,因为仅当输入没有聚焦时才选择文本,如果再次单击以重新定位光标,则文本只是按预期取消选择,您可以在其间写入.

我发现这种方法是预期的UX行为.

使用ng-focus

选项1:单独的代码

<input type="text" ng-model="content" ng-focus="onTextFocus($event)" />
Run Code Online (Sandbox Code Playgroud)

并在控制器中

$scope.onTextFocus = function ($event) {
  $event.target.select();
};
Run Code Online (Sandbox Code Playgroud)

选项2:作为替代方案,您可以将上面的代码加入到这个"单行"中(我没有测试这个,但它应该工作)

<input type="text" ng-model="content" ng-focus="$event.target.select()" />
Run Code Online (Sandbox Code Playgroud)


Ada*_*eis 10

不需要指令,只需将原onfocus="this.select()"生 javascript添加到输入元素或文本区域。

  • 为什么这么多人想出所有这些复杂的答案,而最简单的方法就在这里:D谢谢亚当 (2认同)

Ora*_*g89 6

接受的答案是使用click事件,但是如果你使用焦点事件,只有第一次点击会触发事件,当使用其他一些方法聚焦输入时(如击中标签或在代码中调用焦点),它也会触发.

这也使得没有必要检查该元素是否已经像Tamlyn的回答所暗示的那样已经集中.

app.directive('selectOnClick', function () {
    return {
        restrict: 'A',
        link: function (scope, element, attrs) {
            element.on('focus', function () {
                this.select();
            });
        }
    };
});
Run Code Online (Sandbox Code Playgroud)


gue*_*nam 6

在角度2中,这适用于我,包括Chrome和Firefox:

<input type="text" (mouseup)="$event.target.select()">
Run Code Online (Sandbox Code Playgroud)