当文本框获得焦点时选择所有内容 (使用原生JS或jQuery)

350

如何使用简单的原生JavaScript或jQuery实现在文本框获得焦点时全选文本框中的内容?


同时也可以参考这篇文章:"使用jQuery在Safari和Chrome中无法选择文本" - gdoron
3
由于某些原因,该链接重定向至此问题本身。 - Destrictor
@Destrictor,是的,应该是这样的:"使用jQuery在Safari和Chrome中无法选择聚焦文本" - gdoron
大多数这些解决方案的问题在于,当更改输入字段中的光标位置时,它们无法正确工作。请查看我的答案:https://dev59.com/h3A75IYBdhLWcg3ws7Yh#20826207 - Colin Breame
25个回答

3

我知道已经有很多答案了,但是这个答案还没有出现过;这是一个可以处理ajax生成内容的解决方案:

$(function (){
    $(document).on("focus", "input:text", function() { 
        $(this).select(); 
    });
});

3

像@Travis和@Mari一样,我希望在用户点击时自动选择,这意味着防止mouseup事件的默认行为,但不会阻止用户点击其他地方。我想出的解决方案,在IE11、Chrome 45、Opera 32和Firefox 29(这些是我目前安装的浏览器)中都有效,基于鼠标点击涉及的事件序列。

当您单击一个没有焦点的文本输入框时,会出现以下事件(以及其他事件):

  • mousedown:响应您的点击。如果需要,将引发focus并设置选择开始。
  • focus:作为mousedown的默认处理的一部分。
  • mouseup:完成您的点击,其默认处理将设置选择结束。

当您单击已经具有焦点的文本输入框时,会跳过focus事件。正如@Travis和@Mari所注意到的那样,仅当focus事件发生时才需要防止mouseup的默认处理。然而,由于没有“focus未发生”事件,因此我们需要在mousedown处理程序中推断出这一点。

@Mari的解决方案要求导入jQuery,这是我想避免的。@Travis的解决方案通过检查document.activeElement来实现。我不知道他的解决方案为什么不能在各个浏览器中工作,但还有另一种跟踪文本输入框是否具有焦点的方法:只需跟随其focusblur事件。

以下是对我有效的代码:

  function MakeTextBoxAutoSelect(input)
  {
    var blockMouseUp = false;
    var inputFocused = false;

    input.onfocus =
      function ()
      {
        try
        {
          input.selectionStart = 0;
          input.selectionEnd = input.value.length;
        }
        catch (error)
        {
          input.select();
        }

        inputFocused = true;
      };

    input.onblur =
      function ()
      {
        inputFocused = false;
      };

    input.onmousedown =
      function ()
      {
        blockMouseUp = !inputFocused;
      };

    input.onmouseup =
      function ()
      {
        if (blockMouseUp)
          return false;
      };
  }

我希望这对某些人有所帮助。:-)

+1 谢谢,但是如何重写代码,以便不将“txtCustomer”控件硬编码到脚本中?有没有一种方法可以传递一个“this”对象? - Fandango68
一种方法是创建一个实用函数,将行为作为参数应用于任何元素。在该函数内部,元素引用将被硬编码 - 为参数。然后,您可以使用任何可用的手段标识的任意数量的输入元素来调用它。 :-) - Jonathan Gilbert
抱歉,我是个新手。您可否更新您的回答并提供一个例子?谢谢。 - Fandango68
1
只需将我编写的代码放在一个函数声明中,该函数接受一个名为“txtCustomer”的参数。我建议将“txtCustomer”重命名为其他名称,但如果您不确定如何操作,使用变量名“txtCustomer”也可以正常工作。也就是说:function MakeTextBoxAutoSelect(txtCustomer) { 上面我写的内容 } - Jonathan Gilbert

3
这将有效,尝试一下 -
<input id="textField1" onfocus="this.select()" onmouseup="return false" /> 

本代码在Safari/IE 9和Chrome中可以工作,但我没有机会测试Firefox。


3
这里的答案在某种程度上对我有所帮助,但在Chrome浏览器中使用HTML5数字输入字段时,我遇到了一个问题。如果你点击其中一个按钮,并将鼠标悬停在按钮上,数字会持续变化,就好像你一直按住鼠标按钮一样,因为mouseup事件被丢弃了。我通过以下方式解决了这个问题:立即删除已触发的mouseup处理程序。
    $("input:number").focus(function () {
        var $elem = $(this);
        $elem.select().mouseup(function (e) {
            e.preventDefault();
            $elem.unbind(e.type);
        });
    });

希望这对未来的人有所帮助...


不是的。你正在为一个自己制造的问题提供解决方案。如果你仔细看答案,他们只将 mouseup 绑定到了 文本 输入字段上,而不是数字。因此,这个问题不应该出现。 - Om Shankar
绑定mouseup的问题在于它会干扰光标在字段内的移动。这是一个更好的解决方案,但如果您切换到该字段,则下一个mousedown将丢失(用户将无法使用鼠标移动光标)。这比失去所有mousedowns要好! - Colin Breame

2
你只需要添加以下属性:
当文本框获得焦点时,可以使用 JavaScript 或 jQuery 解决方案来选择文本框的所有内容。
onfocus="this.select()"

例如:

<input type="text" value="sometext" onfocus="this.select()">
< p > < em > (说实话,我不知道为什么你需要其他东西。)

2

我通过加入一些函数调用成功地改进了Zach的答案。但是这个答案的问题在于它完全禁用了onMouseUp,因此当文本框得到焦点后,您无法点击文本框周围的区域。

以下是我的代码:

<input type="text" onfocus="this.select()" onMouseUp="javascript:TextBoxMouseUp();" onMouseDown="javascript:TextBoxMouseDown();" />

<script type="text/javascript">
    var doMouseUp = true;
    function TextBoxMouseDown() {
        doMouseUp = this == document.activeElement;
        return doMouseUp;
    }
    function TextBoxMouseUp() {
        if (doMouseUp)
        { return true; }
        else {
            doMouseUp = true;
            return false;
        }
    }
</script>

这是对Zach答案的一点改进。它在IE中完美工作,在Chrome中根本不起作用,并且在FireFox中交替成功(每隔一次)。如果有人知道如何在FF或Chrome中可靠地使其工作,请分享。

无论如何,我想分享我所知道的,让它变得更好一些。


你的代码有一个错误 - 第二个方法应该被称为 "TextBoxMouseUp"。看一下我的答案,它使用了类似的方法。 - Colin Breame
1
需要注意的是,onMouseUp =""onMouseDown =""不是正确的w3标准。它们应该是onmouseup =""onmousedown =""。与其他HTML属性一样,它们应该用小写字母而不是驼峰式大小写书写。 - DrewT

1

这对我有用(发帖是因为它不在答案中而在评论中)

 $("#textBox").focus().select();

0
如果您将事件链接在一起,我相信这将消除在此线程中建议使用.one的需要。
例如:
$('input.your_element').focus( function () {
    $(this).select().mouseup( function (e) {
        e.preventDefault();
    });
});

0

虽然我来晚了,但这在IE11、Chrome和Firefox中完美运行,而且不会弄乱mouseup事件(也不需要JQuery)。

inputElement.addEventListener("focus", function (e) {
    var target = e.currentTarget;
    if (target) {
        target.select();
        target.addEventListener("mouseup", function _tempoMouseUp(event) {
            event.preventDefault();
            target.removeEventListener("mouseup", _tempoMouseUp);
        });
    }
});

是的,但如果您通过切换到该字段来进行“聚焦”,您会发现有多个mouseup事件侦听器附加... - Sebastian Scholle

0
注意:如果您正在使用ASP.NET编程,则可以在C#中使用ScriptManager.RegisterStartupScript来运行脚本:
ScriptManager.RegisterStartupScript(txtField, txtField.GetType(), txtField.AccessKey, "$('#MainContent_txtField').focus(function() { $(this).select(); });", true );

或者只需在其他答案中建议的HTML页面中键入脚本即可。


这个问题中没有任何关于ASP.NET的内容。 :| - Mohamed Thaufeeq
为了防止程序员正在使用ASP.NET,我发布了这篇文章。对于正在寻找使用该框架的答案的人来说,这可能会很有帮助(因为这对我很有帮助)。我只是在分享,希望有人会发现它有用。 - Exel Gamboa
如果程序员正在使用ASP.NET,他将在问题中添加“asp.net”标签。 :| - Mohamed Thaufeeq

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接