当用户专注于该字段时,我正在使用此代码尝试选择该字段中的所有文本。发生的是,它先选择了所有内容,然后未选择它,然后将键入的光标留在我单击的位置...

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


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

评论

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

Chrome =为此失败

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

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

#1 楼

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

jQuery <版本1.7:

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



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


这里是一个演示

评论


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

–王海琳
2013年1月19日23:14

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

–马克斯
13年3月19日在14:07

Nianpeng下方有一个解决方案,也可以用于鼠标文本选择。

–菲利伯特·佩鲁斯(Philibert Perusse)
13-10-23在18:52



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

– Ricky Boyce
2013年12月14日22:16

制表时,这不适用于聚焦字段。

–柯林布
2013年12月29日下午14:36

#2 楼

我认为发生了什么:

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


评论


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

–etienne
2012年11月23日10:12



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

– Piskvor离开了建筑物
2012年11月23日在16:37

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

– Tanguy
13年5月3日13:36



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

–约书亚(Joshua Bambrick)
2013年9月6日下午3:45

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

– philh
2014年11月4日10:25

#3 楼

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

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


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

评论


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

– adriaan
2014年1月21日,11:25

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

– ilovett
2015年6月2日在18:04



这不允许在数字输入中进行第二次单击来用鼠标选择文本的另一部分。删除第二个select()似乎可行。

–弃用
18年8月24日在12:33



再加上$('input [autofocus]')。select();甚至更好。

–丹尼尔·布雷斯坦纳(Daniel Bleisteiner)
19年3月11日在8:16

#4 楼

这里有一些不错的答案,@ 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();
});


评论


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

– KyleMit
14年7月4日在16:46

如果用户尝试自己选择所有文本,甚至可以使用。

–维塔尼
2014年8月18日上午10:32

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

–拉尔斯·布雷德兰德
2015年6月3日,11:51

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

–animatedgif
2015年6月11日在21:49

它只是不选择任何东西。 (我在另一个win8上进行了测试,并且确实可以在其中运行-相同的操作系统级别和版本)

–拉尔斯·布雷德兰德
15年6月13日在18:10

#5 楼

经过仔细审查,我建议将此作为该线程中的远清洁的解决方案:
<预类= “郎-JS prettyprint-越权”> $("input").focus(function(){ $(this).on("click.a keyup.a", function(e){ $(this).off("click.a keyup.a").select(); }); });
演示中的jsfiddle
的问题:
这里有一些解释:
首先,让我们看一下当您用鼠标或Tab键进入字段时的事件顺序。
我们可以像这样记录所有相关事件:
 $("input").on("mousedown focus mouseup click blur keydown keypress keyup change",
              function(e) { console.log(e.type); });
 



注意:我已更改此解决方案,以使用click而不是mouseup因为它发生在事件管道的后面,并且按照@Jocie的注释似乎在firefox中引起了一些问题。

一些浏览器尝试在mouseupclick事件期间定位光标。这很有意义,因为您可能想在一个位置开始插入符号并拖动以突出显示一些文本。在实际抬起鼠标之前,无法指定插入符的位置。因此处理focus的函数注定会过早做出响应,从而使浏览器无法覆盖您的位置。
但麻烦的是,我们确实确实想处理focus事件。它使我们知道有人第一次进入该字段。在那之后,我们不想继续覆盖用户选择行为。
解决方案:
相反,在focus事件处理程序中,我们可以快速为click(单击)和keyup附加侦听器(跳入)将要触发的事件。

注意:tab事件的键入实际上将在新的输入字段中触发,而不是先前的输入

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

注意:大多数浏览器自然会在制表符事件期间选择所有文本,但是正如animatedgif指出的那样,我们仍然要处理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中,当您在两个文本框之间单击时,您的代码仅在每两次单击时选择文本

–维塔尼
14年8月18日在10:26

@Jocie,我不确定为什么要交替使用,但是看起来FF处理click事件中的文本选择,而click事件比mouseup更为深入。由于我们希望尽早处理选择的结束,以便为我们提供最大的覆盖浏览器的机会,因此使用click而不是mouseup应该可以解决问题。经过FF,Chrome和IE的测试。

– KyleMit
14-10-28在12:24

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

– Vincent
2015年9月9日23:57

是!这也对我有用!谢谢。这应该是官方的答案

– Fandango68
2015年12月16日在2:15

@RiZKiT,一个不会把它切成“该事件处理程序在每种事件类型的每个元素上执行一次。它将自动关闭触发该事件的事件,但另一个事件仍会持续存在,并且关闭会同时照顾这两个事件。看到我的问题:对于任何数量的事件,它将仅触发一次的函数

– KyleMit
16年1月20日在16:22

#6 楼

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

$("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");
    }
});


评论


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

–菲利伯特·佩鲁斯(Philibert Perusse)
13年10月23日在18:50

这里发生了太多事情,请使用user2072367的焦点/鼠标解决方案

–乔治
2013年12月16日15:47



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

–animatedgif
2014年9月12日14:04

#7 楼

此版本可在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/

评论


编辑添加丑陋的尝试/捕捉来安抚浏览器

–茴香胺
2014年4月2日在5:09

#8 楼

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

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默认行为。有重点。它适用于以下情况:


字段未聚焦时单击
字段具有焦点时单击
跳入该字段

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

评论


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

–ToX 82
2015年4月1日在12:16

#9 楼

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

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


评论


...这与Piskvor的答案基本相同。

–奥利弗
13年5月6日在13:02

不要忘记所有其他HTML5文本类型,例如“输入[类型=电子邮件]”

– jamiebarrow
13-10-17在9:43

#10 楼

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

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


#11 楼

我使用FF 16.0.2和jquery 1.8.3,答案中的所有代码均不起作用。
我使用类似的代码并起作用。

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


评论


这不能回答问题,即当用户将字段聚焦时如何选择输入框的内容。这将立即聚焦并选择代码,而无需用户输入。

–酱
2012年12月14日在21:13

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

–GusDeCooL
2012-12-15 19:26

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

–酱
2012年12月17日19:49

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

–罗比·阿夫里尔(Robbie Averill)
13-10-30在1:02



#12 楼

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


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

评论


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

–布赖恩·汤普塞特-汤莱恩
16年7月11日在8:56

#13 楼

非常适合与本机JavaScript select()配合使用。

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


或一般而言:

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


#14 楼

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

评论


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

– Sujay Phadke
15年12月24日在2:08

#15 楼

您可以使用简单的代码:

$('#idname').select();


评论


与jQuery的使用明显

–鲁本·鲁伊斯(RubénRuíz)
17年5月4日在22:56

#16 楼

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


评论


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

–tumultous_rooster
16-4-2在4:42

您的$ .ready不正确。您需要向其传递一个函数,以使其延迟属性直到文档准备就绪。您正在立即执行此操作,然后将元素集合传递给$ .ready。

– Doug65536
16年4月2日在9:00

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

– Doug65536
16年4月2日在9:01

#17 楼

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

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