选择文本框获得焦点时的所有内容(Vanilla JS或jQuery)


310

什么是Vanilla JS或jQuery解决方案,当文本框获得焦点时将选择文本框的所有内容?



3
@gdoron由于某种原因将链接重定向到此问题本身。
限制者


这些解决方案中的大多数解决方案的问题是,它们在更改输入字段内的光标位置时无法正常工作。在这里看看我的答案:stackoverflow.com/a/20826207/641452
Colin Breame 2013年

Answers:


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

23
同样只是为了获得更多信息:现在可以将“ input [type = text]”作为“ input:text”的问候
里卡多·维加

8
这似乎不适用于我在Chrome上的浏览器,而jQuery网站表示它取决于浏览器。其他人可以验证吗?
肯尼·怀兰德

71
看起来WebKit浏览器由于mouseup事件而对此产生干扰。我添加了它,它起作用了:$('input:text')。mouseup(function(e){return false;});
肯尼·怀兰德

5
肯尼(Kenny)是正确的,但不幸的是,“鼠标移动”也会影响Chrome微调器控件。触发“点击”而不是“焦点”似乎可以解决问题
理查德·肯纳德

24
我这样使用:$(“ input:text”)。select()。focus();
Phuong 2013年

227

<input type="text" onfocus="this.select();" onmouseup="return false;" value="test" />


43
+ onmouseup =“ return false”以停止在点击时取消选择
Anthony Johnston

2
+1表示用于mouseup的stopEvent,否则将无法正常工作。这样做的缺点是,一旦光标位于该字段中,则在所选文本内的某个位置单击以将光标定位到该位置将不起作用。点击已被有效禁用。不过,对于希望重点关注整个文本的情况,这可能是两个弊端较小的情况。
12

我可以通过在onMouseDown事件中将全局变量doMouseUp设置为false(如果此!= document.activeElement)来解决由迷惑引起的问题。然后,在onMouseUp期间,将doMouseUp重置为true,并在重置之前返回doMouseUp值。这变得令人费解,并且需要代码-我将发布答案更好地解释它。
特拉维斯

1
onmouseup="return false;"如果希望用户聚焦于文本框能够自由选择和编辑文本不要添加。使用此代码,文本将被锁定为“全选”状态,除非用户键入新文本或使用箭头键四处移动,否则用户将无法对其进行编辑。老实说,这感觉像是一个很奇怪的行为,除非文本框打算永久不可编辑(因此被禁用),否则这是没有意义的。
ADTC '16

1
从技术上讲,您onmouseup="return false;"只需要在用户第一次单击或单击选项卡时进行选择就不需要。并为香草javascript +1!
clabe45 '18


39
$(document).ready(function() {
    $("input:text")
        .focus(function () { $(this).select(); } )
        .mouseup(function (e) {e.preventDefault(); });
});

1
很好 谢谢!通过对Zach的答案的注释进行注释,提供了防止mouseup事件默认值的一个缺点:“一旦光标位于字段中,则在所选文本内的某个位置单击以将光标定位在该行将不起作用;有效地禁用了单击。对于在需要重点关注整个文本的情况下,可能是两种弊端中的较小者。”
JohnK

25

jQuery不是JavaScript,在某些情况下更易于使用。

看这个例子:

<textarea rows="10" cols="50" onclick="this.focus();this.select()">Text is here</textarea>

资料来源:CSS TricksMDN


7
如果您不介意将标记和代码混在一起,也许没关系;如今,大多数人都试图保持脚本“不扰民”。哦... jQuery Javascript。
安德鲁·巴伯 Andrew Barber)

2
感谢onclick的建议,效果很好。并非所有人都使用jQuery,因此很高兴看到另一个选择。
Lukus 2013年

这假设用户仅使用鼠标
pcnate

可以在键盘上使用onfocus =“ this.focus(); this.select()”
Muhammad Nadeem

21

这不仅是Chrome / Safari问题,我在Firefox 18.0.1中也遇到了类似的问题。有趣的是,这不会在MSIE上发生!这里的问题是第一个mouseup事件,该事件强制取消选择输入内容,因此只需忽略第一个事件。

$(':text').focus(function(){
    $(this).one('mouseup', function(event){
        event.preventDefault();
    }).select();
});

timeOut方法导致奇怪的行为,并且阻止了每个mouseup事件,您无法再次单击输入元素来删除选择。


1
+1表示使用一次以防止单个鼠标向上移动。我真的不喜欢最初单击后无法用鼠标选择文本。
Pluc

13

HTML:

Enter Your Text : <input type="text" id="text-filed" value="test">

使用JS:

var textFiled = document.getElementById("text-filed");
textFiled.addEventListener("focus", function() { this.select(); });

使用JQuery:

$("#text-filed").focus(function() { $(this).select(); } );

使用React JS:

在各个组件内部的render函数中-

<input
  type="text"
  value="test"
  onFocus={e => e.target.select()}
/>

2
这对我在React中起作用:onFocus={(e) => e.target.select()}
Paito

11

我的解决方案是使用超时。似乎可以正常工作

$('input[type=text]').focus(function() {
    var _this = this;
    setTimeout(function() {
        _this.select();
    }, 10);
});

这是我使用的首选方法。我将超时值设置为0,因为这会将其添加到当前事件队列的末尾,这意味着它将在“ mouseup”事件之后运行。
DavidM 2014年


4

我知道内联代码的样式不好,但是我不想将其放入.js文件中。无需jQuery即可使用!

<input type="text" value="blah blah" onfocus="this.select(); this.selAll=1;" onmouseup="if(this.selAll==0) return true; this.selAll=0; return false;"></input>

3

此处的答案在一定程度上帮助了我,但是单击Chrome中的向上/向下按钮时,我在HTML5数字输入字段上遇到了问题。

如果单击其中一个按钮,然后将鼠标悬停在按钮上,则数字将保持不变,就好像您按住鼠标按钮一样,这是因为将mouseup扔掉了。

我通过如下方式立即删除mouseup处理程序来解决此问题:

    $("input:number").focus(function () {
        var $elem = $(this);
        $elem.select().mouseup(function (e) {
            e.preventDefault();
            $elem.unbind(e.type);
        });
    });

希望这对以后的人们有所帮助...


不对 您正在为自生问题提供解决方案。如果您正确看待答案,它们将仅绑定mouseup文本输入字段,而不是numbers。因此,不应出现此问题
Om Shankar

绑定mouseup的问题是在字段中移动光标时会产生干扰。这是一个更好的解决方案,但是如果您在该字段中使用Tab键,则下一次鼠标按下将丢失(并且用户将无法使用鼠标移动光标)。这比失去所有鼠标按下状态更好!
Colin Breame 2013年


3

我知道这里已经有很多答案了,但是到目前为止,还没有找到答案。一个也可以与ajax生成的内容一起使用的解决方案:

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

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 2013年

1
应该注意的是onMouseUp=""onMouseDown=""它不是正确的w3标准。他们应该onmouseup=""onmousedown=""。与其他html属性一样,它们应使用小写字母而不是驼峰字母。
DrewT'3

2

像@Travis和@Mari一样,我想在用户单击时自动选择,这意味着阻止mouseup事件的默认行为,但不能阻止用户单击。我想出的解决方案基于IE单击,Chrome 45,Opera 32和Firefox 29(这些是我当前已安装的浏览器)运行,并且基于鼠标单击所涉及的事件序列。

当您单击没有焦点的文本输入时,会发生以下事件(以及其他事件):

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

当您单击已经具有焦点的文本输入时,将focus跳过该事件。正如@Travis和@Mari都非常注意的那样,默认处理mouseup仅在focus事件发生时才需要阻止。但是,由于没有“ focus未发生”事件,我们需要推断出这一点,我们可以在mousedown处理程序中进行此操作。

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

这是对我有用的代码:

    var blockMouseUp = false;
    var customerInputFocused = false;

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

        customerInputFocused = true;
      };

    txtCustomer.onblur =
      function ()
      {
        customerInputFocused = false;
      };

    txtCustomer.onmousedown =
      function ()
      {
        blockMouseUp = !customerInputFocused;
      };

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

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


+1谢谢,但是如何将其重写,以免将'txtCustomer'控件硬编码到脚本中?有没有办法传递“此”对象?
Fandango68

一种方法是创建一个实用程序函数,以将该行为应用于作为参数传入的任何元素。在该函数中,元素引用将被硬编码-参数。然后,您可以在任意数量的输入元素上调用它,以您可以使用的任何方式进行标识。:-)
乔纳森·吉尔伯特

对不起,我是菜鸟。您可以举一个例子来更新您的答案吗?谢谢
Fandango68

1
只需将我编写的代码包装在带有一个名为“ txtCustomer”的参数的函数声明中。我建议将“ txtCustomer”重命名为其他名称,但是如果您不确定这样做,它将在技术上与名为“ txtCustomer”的变量一起使用。也就是说:函数MakeTextBoxAutoSelect(txtCustomer){ 我在上面写过 }
乔纳森·吉尔伯特


1

什么是JavaScript或jQuery解决方案,当文本框获得焦点时将选择文本框的所有内容?

您只需要添加以下属性:

onfocus="this.select()"

例如:

<input type="text" value="sometext" onfocus="this.select()">

(老实说,我不知道您为什么还需要其他任何东西。)



0
$('input').focus(function () {
    var self = $(this);
    setTimeout(function () {
        self.select();
    }, 1);        
});

编辑:根据@DavidG的请求,我无法提供详细信息,因为我不确定为什么会这样,但是我认为它与焦点事件向上或向下传播或它所做的任何事情以及输入元素获得通知有关它得到了关注。设置超时可以使元素有一点时间意识到它已经完成了。


请说明您的答案,而不是仅粘贴一些代码。
DavidG 2014年

0

如果将事件链接在一起,我相信它消除了.one对此线程其他地方建议的使用的需要。

例:

$('input.your_element').focus( function () {
    $(this).select().mouseup( function (e) {
        e.preventDefault();
    });
});

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

0

我把它播到某个地方,完美地工作!

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

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

是的,但是如果您focus进入该字段,则将发现有多个附加的mouseup事件侦听器...
Sebastian Scholle,

-1

接下来是我的解决方案:

var mouseUp;
$(document).ready(function() {
    $(inputSelector).focus(function() {
        this.select();
    }) 
    .mousedown(function () {
        if ($(this).is(":focus")) {
          mouseUp = true;
        }
        else {
          mouseUp = false;
        }
     })
     .mouseup(function () {
        return mouseUp;
     });
});

因此,mouseup通常可以正常工作,但是在通过输入获得焦点后不会取消选择

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.