jQuery输入全选焦点


326

当用户将重点放在字段上时,我正在使用此代码尝试选择字段中的所有文本。发生的是,它一秒钟选择了所有内容,然后未选择它,并且键入光标留在了我单击的位置...

$("input[type=text]").focus(function() {
   $(this).select();
});

我希望所有这些都保持选中状态。


什么浏览器在FF中对我来说似乎工作正常?
R0MANARMY 2010年

8
Chrome =为此失败
wowo_999 2010年

1
我使用的是Chrome,但.click()解决了问题:)
Tim

4
注意:这里接受的答案只能解决一半问题。它可以使选择工作,但是很难随后通过单击将其取消选择。更好的解决方案可以在这里找到:stackoverflow.com/questions/3380458/...
SDC

Answers:


480

尝试使用click代替focus。它似乎适用于鼠标和按键事件(至少在Chrome / Mac上):

jQuery <版本1.7:

$("input[type='text']").click(function () {
   $(this).select();
});

jQuery 1.7+版本:

$("input[type='text']").on("click", function () {
   $(this).select();
});

这是一个演示


62
问题是您无法再用鼠标选择部分文本,一旦单击,便会选择全文。
Helin Wang

6
对我来说不是一个可行的解决方案。这就产生了王所描述的问题。
Marquez 2013年

1
Nianpeng下面提供了一个解决方案,该解决方案也适用于鼠标文本选择。
Philibert Perusse 2013年

4
@AwQiruiGuo $ .fn.on('click',..)可以使用更少的内存,并可以动态添加子元素。
Ricky Boyce

7
制表时,这不适用于聚焦字段。
Colin Breame 2013年

65

我认为发生的事情是这样的:

focus()
   UI tasks related to pre-focus
   callbacks
       select()
   UI tasks related to focus (which unselect again)

一种解决方法可能是异步调用select(),以便它在focus()之后完全运行:

$("input[type=text]").focus(function() { 
    var save_this = $(this);
    window.setTimeout (function(){ 
       save_this.select(); 
    },100);
});

3
$(“ input [type = text]”)。focus(function(){var save_this = $(this); window.setTimeout(function(){save_this.select();},100);});
etienne 2012年

@etienne:哦,好点:this在这样的范围内,对的处理有点意外。我将更新代码。
Piskvor在

3
超时值为0似乎也可以,并且“ focusin()”函数也可以使用此方法。
Tanguy

4
是的,您甚至不需要设置时间段。由于超时在当前调用堆栈的末尾运行,因此0会很好。这意味着焦点和单击事件全部触发,然后您的函数运行
Joshua Bambrick

1
超时0似乎存在一个问题,即“ click”事件可能会在以后的帧中触发,从而再次取消选中该框。我发现,超时10似乎工作得很好-没有明显的延迟,但比0更可靠
philh

57

我认为这是更好的解决方案。与简单地选择onclick事件不同,它不会阻止使用鼠标选择/编辑文本。它与主要的渲染引擎(包括IE8)一起使用。

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

http://jsfiddle.net/25Mab/9/


4
这仅适用于现有字段,这是将其绑定到新输入字段的更新:jsfiddle.net
adriaan 2014年

有时无需单击即可给出焦点,这可以很好地处理它。因此,对我来说,这是最干净的答案-即使每次输入都经过聚焦而不是通过单击时都可能有一些悬垂的事件侦听器……比setTimeout好得多
ilovett 2015年

这不允许在数字输入中单击鼠标来选择文本的另一部分。select()虽然删除第二似乎工作。
dperish

再加上一个更好的选择$('input[autofocus]').select();
Daniel Bleisteiner

38

这里有一些不错的答案,@ user2072367是我最喜欢的答案,但是当您通过制表符而不是单击进行聚焦时,结果出乎意料。(出乎意料的结果:要在通过标签聚焦后正常选择文本,您必须再单击一次)

这个小提琴修正了那个小错误,并另外将$(this)存储在变量中以避免冗余的DOM选择。一探究竟!(:

在IE> 8中测试

$('input').on('focus', function() {
    var $this = $(this)
        .one('mouseup.mouseupSelect', function() {
            $this.select();
            return false;
        })
        .one('mousedown', function() {
            // compensate for untriggered 'mouseup' caused by focus via tab
            $this.off('mouseup.mouseupSelect');
        })
        .select();
});

2
+1您的解决方案和@ user2072367的解决方案在整个线程中是最干净的,我希望有一种方法可以更快地达到顶峰。
KyleMit 2014年

1
如果用户尝试自己选择所有文本,甚至可以使用。
维塔尼2014年

对我来说,这不适用于Windows 8.1上的ie11。它确实在Windows 7和Windows 10的ie11中工作
Lars Thomas Bredland

1
@LarsThomasBredland我刚刚尝试赢了8.1 + ie11,它按预期工作。什么对您来说“无效”?
animatedgif

它只是不选择任何东西。(我在另一个win8上进行了测试,并且在那里工作-相同的操作系统级别和版本)
Lars Thomas Bredland 2015年

21

经过仔细的审查,我将此建议作为此主题中的一种更简洁的解决方案:

$("input").focus(function(){
    $(this).on("click.a keyup.a", function(e){      
        $(this).off("click.a keyup.a").select();
    });
});

jsFiddle中的演示

问题:

这里有一些解释:

首先,让我们看一下鼠标或跳入字段时的事件顺序。
我们可以像这样记录所有相关事件:

$("input").on("mousedown focus mouseup click blur keydown keypress keyup change",
              function(e) { console.log(e.type); });

焦点事件

注意:我已经更改了此解决方案的使用方式,click而不是mouseup稍后在事件管道中发生的解决方式,按照@Jocie的评论,似乎在firefox中引起了一些问题

某些浏览器会在mouseupclick事件期间尝试定位光标。这很有意义,因为您可能想在一个位置开始插入符号并拖动以突出显示一些文本。在您真正抬起鼠标之前,无法指定插入符号的位置。因此处理的功能focus注定会过早响应,从而使浏览器无法覆盖您的位置。

但麻烦的是,我们确实确实想处理焦点事件。它使我们知道有人第一次进入该字段。在那之后,我们不想继续覆盖用户选择行为。

解决方案:

相反,在focus事件处理程序中,我们可以为即将触发的click(单击)和keyup(进入)事件快速附加侦听器。

注意:选项卡事件的键入实际上将在新的输入字段中触发,而不是前一个

我们只想触发一次该事件。我们可以使用.one("click keyup),但这将为每种事件类型调用一次事件处理程序。相反,一旦按下mouseup或keyup,我们将调用我们的函数。我们要做的第一件事是删除两者的处理程序。这样一来,无论我们在选项卡中还是鼠标单击中都无所谓。该函数应该只执行一次。

注意:大多数浏览器自然会在制表符事件期间选择所有文本,但是正如animationgif指出的那样,我们仍然要处理该keyup事件,否则该mouseup事件将在我们选择的任何时候都一直存在。处理完选择后,立即关闭听众。

现在,我们可以select()在浏览器选择之后调用,以便确保覆盖默认行为。

最后,为了提供额外的保护,我们可以将事件名称空间添加到mouseupkeyup函数中,这样该.off()方法就不会删除可能正在起作用的任何其他侦听器。


经过IE 10 +,FF 28+和Chrome 35+的测试


另外,如果您想使用一个名为once函数扩展jQuery,该函数将针对任意数量的事件触发一次

$.fn.once = function (events, callback) {
    return this.each(function () {
        var myCallback = function (e) {
            callback.call(this, e);
            $(this).off(events, myCallback);
        };
        $(this).on(events, myCallback);
    });
};

然后,您可以像下面这样进一步简化代码:

$("input").focus(function(){
    $(this).once("click keyup", function(e){      
        $(this).select();
    });
});

小提琴演示


在Windows上的Firefox 31中,当您在两个文本框之间单击时,您的代码仅在每两次单击时选择文本
Vitani 2014年

1
@Jocie,我不确定为什么要交替使用,但是看起来FF在click事件处理比FF 更远的情况下处理了文本选择mouseup。由于我们希望尽早处理选择的结束,以便最大程度地覆盖浏览器,因此使用click而不是mouseup应该可以解决问题。经过FF,Chrome和IE的测试。
KyleMit 2014年

1
谢谢!最终,一个真正适用于所有浏览器的解决方案!
Vincent

1
是! 这也对我有用!谢谢。这应该是正式答案
Fandango68

1
@RiZKiT,one不会将其剪切为“该事件处理程序对每个事件类型的每个元素执行一次。它将自动关闭触发该事件的事件,但另一个事件仍会持续存在,并且off无论如何都要照顾这两个事件。请参阅我的问题:对于任何数量的事件

13

这样就可以完成工作,并避免了无法再用鼠标选择部分文本的问题。

$("input[type=text]").click(function() {
    if(!$(this).hasClass("selected")) {
        $(this).select();
        $(this).addClass("selected");
    }
});
$("input[type=text]").blur(function() {
    if($(this).hasClass("selected")) {
        $(this).removeClass("selected");
    }
});

1
保持使用鼠标选择部分文本的能力很重要。我正在使用它及其A1
Philibert Perusse 2013年

2
这里发生了太多事情,请使用user2072367的焦点/
George

@George user2072367的效果不错,但是它有一些严重的缺陷。看看我的解决方案(:
animatedgif

6

此版本可在ios上运行,也可修复Windows chrome上的标准拖动选择

var srcEvent = null;

$("input[type=text],input[type=number]")

    .mousedown(function (event) {
        srcEvent = event;
    })

    .mouseup(function (event) {
        var delta = Math.abs(event.clientX - srcEvent.clientX) 
                  + Math.abs(event.clientY - srcEvent.clientY);

        var threshold = 2;
        if (delta <= threshold) {
                   try {
                        // ios likes this but windows-chrome does not on number fields
                        $(this)[0].selectionStart = 0;
                        $(this)[0].selectionEnd = 1000;
                    } catch (e) {
                        // windows-chrome likes this
                        $(this).select();
                    }
        }
    });

http://jsfiddle.net/Zx2sc/2/


编辑添加丑陋的尝试/捕获来安抚浏览器
anihilnine 2014年

5

这些解决方案中的大多数解决方案的问题是,它们在更改输入字段内的光标位置时无法正常工作。

所述onmouseup事件改变字段,这是焙烧后内的光标位置onfocus(内Chrome和FF至少)。如果无条件丢弃,mouseup则用户无法使用鼠标更改光标位置。

function selectOnFocus(input) {
    input.each(function (index, elem) {
        var jelem = $(elem);
        var ignoreNextMouseUp = false;

        jelem.mousedown(function () {
            if (document.activeElement !== elem) {
                ignoreNextMouseUp = true;
            }
        });
        jelem.mouseup(function (ev) {
            if (ignoreNextMouseUp) {
                ev.preventDefault();
                ignoreNextMouseUp = false;
            }
        });
        jelem.focus(function () {
            jelem.select();
        });
    });
}
selectOnFocus($("#myInputElement"));

mouseup如果该字段当前没有焦点,该代码将有条件地阻止默认行为。它适用于以下情况:

  • 当字段不集中时单击
  • 当字段具有焦点时单击
  • 进入领域

我已经在Chrome 31,FF 26和IE 11中对此进行了测试。


这非常适合单击事件,但是如果我使用Tab键移动到下一个输入字段,我会看到内容稍后被选择和取消选择
ToX 82'1

4

找到了一个很棒的解决方案,阅读此线程

$(function(){

    jQuery.selectText('input:text');
    jQuery.selectText('input:password');

});

jQuery.extend( {
    selectText: function(s) { 
        $(s).live('focus',function() {
            var self = $(this);
            setTimeout(function() {self.select();}, 0);
        });
    }
});


不要忘记所有其他HTML5文本类型,例如'input [type = email]'
jamiebarrow13年

3

我来自2016年末,此代码仅适用于最新版本的jquery(在这种情况下为jquery-2.1.3.js)。

if ($(element).is("input")) {
    $(element).focus(function () {
        $(element).select();
    });
}

2

我使用FF 16.0.2和jQuery 1.8.3,答案中的所有代码均无效。
我使用这样的代码并工作。

$("input[type=text]").focus().select();

4
这没有解决问题,即当用户将字段聚焦时如何选择输入框的内容。这将立即聚焦并选择代码,而无需用户输入。
2012年

@酱我不明白你的意思吗?当提问者选择该字段时,他想要的是所有当前文本都被选中。我的代码应该做到这一点。我什至在写此答案时也将其用于我的项目。
GusDeCooL 2012年

1
该代码将在运行时集中并选择所有内容,但代码本身并不与用户生成的事件(例如,单击文本框)相关。例如,$("input[type=text]").on('click', function () { $(this).focus.select(); })导致焦点并在用户单击框时发生选择,因为焦点是在用户单击框时执行的。没有事件处理程序,代码将无法回答问题,因此无法投票和注释。基本上,您获得了“所有当前文本均已选中”部分,但没有“他何时选择该字段”部分。
2012年

1
@GusDeCooL很有趣(即使这不是他问的完全一样),我想获得与您在此结果上相同的结果:)
Robbie Averill

2
var timeOutSelect;
$("input[type=text]").focus(function() { 
        var save_this = $(this);
        clearTimeout(timeOutSelect);
        timeOutSelect = window.setTimeout (function(){ 
                save_this.select(); 
        }, 100);
});

如果在两个输入之间快速切换,请使用clearTimeout以获得更高的安全性。clearTimeout清除旧的超时...


请编辑更多信息。不建议使用纯代码和“尝试此”答案,因为它们不包含可搜索的内容,并且不解释为什么有人应该“尝试此”。我们在这里努力成为知识的资源。
Brian Tompsett-汤莱恩

2

与本机JavaScript一起很好地工作select()

$("input[type=text]").focus(function(event) {
   event.currentTarget.select();
});

或一般而言:

$("input[type=text]")[0].select()

1

或者您可以只使用<input onclick="select()">Works完美版。


不,不是。它适用于选择整体。但是尝试手动选择部分文本,您将无法做到这一点。
Sujay Phadke


0
<script>$.ready( $("input[type=text]").attr("onclick" , "this.select()"));<script>

这可能会被标记为低质量答案,因为它对正在发生的事情没有任何解释。
tumultous_rooster

$.ready不正确。您需要向其传递一个函数,以使其延迟attr文档准备就绪。您要立即执行此操作,然后将element集合传递给$.ready
doug65536 '16

另外,避免“ onclick”,尤其是这种方式。使用addEventListener
doug65536 '16

0

我总是使用requestAnimationFrame()跳过事件后内部机制的方法,这在Firefox中非常有效。尚未在Chrome中进行测试。

$("input[type=text]").on('focus', function() {
    requestAnimationFrame(() => $(this).select());
});
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.