【问题标题】:jquery input select all on focusjquery输入全选焦点
【发布时间】:2011-03-10 04:20:10
【问题描述】:

当用户关注该字段时,我正在使用此代码尝试选择该字段中的所有文本。发生的情况是,它选择了所有的一秒钟,然后它被取消选择,打字光标留在我点击的地方......

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

我希望它全部保持选中状态。

【问题讨论】:

  • 什么浏览器,我在 FF 中似乎可以正常工作?
  • Chrome = 这个失败
  • 我使用的是 Chrome,但是 .click() 解决了这个问题 :)
  • 注意:这里接受的答案只能解决一半的问题。它使选择工作,但很难在随后的点击中取消选择它。可以在这里找到更好的解决方案:stackoverflow.com/questions/3380458/…

标签: jquery input


【解决方案1】:

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

jQuery

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

jQuery 1.7+ 版本:

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

Here is a demo

【讨论】:

  • 问题是你不能再用鼠标选择部分文本,一旦点击,就会选择全文。
  • 对我来说不是一个可行的解决方案。这就产生了王所描述的问题。
  • 念鹏在下面有一个解决方案,它也适用于鼠标文本选择。
  • @AwQiruiGuo $.fn.on('click',..) 可以使用更少的内存并为动态添加的子元素工作。
  • 这不适用于在 Tab 键时聚焦字段。
【解决方案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:哦,好点:this 的处理在这样的范围内有点出乎意料。我会更新代码。
  • 超时值为 0 似乎也可以,并且“focusin()”函数也可以使用此方法。
  • 是的,您甚至不需要设置句点。 0 会很好,因为超时在当前调用堆栈的末尾运行。这意味着焦点和点击事件都会触发,然后你的函数就会运行
  • Timeout 0 似乎存在“点击”事件可以在稍后的帧中触发的问题,再次取消选中该框。我发现超时 10 似乎工作得很好——没有明显的延迟,但比 0 更可靠。
【解决方案3】:

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

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

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

【讨论】:

  • 这仅适用于现有字段,这是将其绑定到新输入字段的更新:jsfiddle.net
  • 有时无需单击即可获得焦点,这处理得很好。正因为如此,这对我来说是最干净的答案——即使每次输入聚焦而不是点击时可能会有一些悬空的事件监听器......比 setTimeout 好得多
  • 这不允许在数字输入中再次单击以用鼠标选择文本的另一部分。删除第二个select() 似乎可行。
  • 再添加一个$('input[autofocus]').select();会更好
【解决方案4】:

这里有一些不错的答案,我最喜欢@user2072367 的答案,但是当您通过选项卡而不是单击进行聚焦时,它会产生意想不到的结果。 (意想不到的结果:通过Tab焦点后正常选择文本,您必须再单击一次)

This fiddle 修复了这个小错误并另外将 $(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 的解决方案是整个线程中最干净的,我希望有一种方法可以更快地达到顶峰。
  • 即使用户尝试自己选择所有文本也可以工作,太棒了。
  • 对我来说,这在 Windows 8.1 上的 ie11 上不起作用。它确实适用于 Windows 7 和 Windows 10 上的 ie11
  • @LarsThomasBredland 我刚刚在 win 8.1 + ie11 上尝试过,它按预期工作。什么对你“不起作用”?
  • 它只是没有选择任何东西。 (我在另一个 win8 上测试过,它确实在那里工作 - 相同的操作系统级别和 ie 版本)
【解决方案5】:

经过仔细审查,我建议在此线程中将此作为更清洁的解决方案:

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

Demo in 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 事件处理程序中,我们可以快速为即将触发的click(单击)和keyup(制表符)事件附加侦听器。

注意:tab事件的keyup实际上是fire in the new input field, not the previous one

我们只想触发一次事件。我们可以使用.one("click keyup),但这将使用call the event handler once for each event type。相反,只要按下 mouseup 或 keyup,我们就会调用我们的函数。我们要做的第一件事是删除两者的处理程序。这样一来,我们是用标签还是鼠标输入都无关紧要。该函数应该只执行一次。

注意:大多数浏览器在tab事件期间自然会选择所有文本,但是作为animatedgif pointed out,我们还是要处理keyup事件,否则mouseup事件仍然会持续存在大约在我们加入选项卡的任何时间。我们会同时收听这两种情况,因此我们可以在处理完选择后立即关闭监听器。

现在,我们可以在浏览器做出选择后调用select(),所以我们一定会覆盖默认行为。

最后,为了获得额外的保护,我们可以将event namespaces 添加到mouseupkeyup 函数中,这样.off() 方法就不会删除任何其他可能正在运行的侦听器。


在 IE 10+、FF 28+ 和 Chrome 35+ 中测试


或者,如果您想使用 function called once that will fire exactly once for any number of events 扩展 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();
    });
});

Demo in fiddle

【讨论】:

  • 在 Windows 上的 Firefox 31 中,当您在两个文本框之间单击时,您的代码只会在每次单击时选择文本
  • @Jocie,我不确定它为什么会交替出现,但看起来 FF 处理了click 事件中的文本选择,这比mouseup 更靠后。由于我们希望尽可能晚地处理选择的结束,以便我们有最大的机会覆盖浏览器,因此使用 click 而不是 mouseup 应该可以解决问题。在 FF、Chrome 和 IE 中测试。
  • 谢谢!终于找到了一个真正适用于所有浏览器的解决方案!
  • 是的!这对我也有用!谢谢你。这应该是官方的回答
  • @RiZKiT, one 不会将其剪切为“每个元素每个事件类型执行一次处理程序。它会自动关闭触发它的事件,但另一个仍然会徘徊,off 无论如何都会照顾两者。请参阅我的问题:function that will fire exactly once for any number of events
【解决方案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
  • 这里的内容太多了,使用user2072367的focus/mouseup solution
  • @George user2072367 很不错,但也有一些严重的缺陷。查看我的解决方案(:
【解决方案7】:

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

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 中对此进行了测试。

【讨论】:

  • 这非常适用于点击事件,但如果我使用选项卡移动到下一个输入字段,我会看到内容稍后被选中和取消选中
【解决方案8】:

此版本适用于 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/

【讨论】:

  • 编辑添加丑陋的 try/catch 来安抚浏览器
【解决方案9】:

找到了一个很棒的解决方案阅读this thread

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

【讨论】:

【解决方案10】:

我来自 2016 年末,此代码仅适用于最新版本的 jquery(本例中为 jquery-2.1.3.js)。

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

【讨论】:

    【解决方案11】:

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

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

    【讨论】:

      【解决方案12】:

      我使用 FF 16.0.2 和 jquery 1.8.3,答案中的所有代码都不起作用。
      我使用这样的代码并工作。

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

      【讨论】:

      • 这并没有回答问题,即当用户聚焦字段时如何选择输入框的内容。这将立即聚焦并选择代码,无需用户输入。
      • @saluce 我不明白你的意思?提问者想要的是当他选择字段时,所有当前文本都被选中。我的代码应该这样做。我什至将它用于我的项目,就像我写这个答案的时候一样。
      • 此代码在运行时将聚焦并选择所有内容,但代码本身与用户生成的事件无关,例如单击文本框。例如,$("input[type=text]").on('click', function () { $(this).focus.select(); }) 在用户单击框时导致焦点和选择发生,因为它在用户单击框时执行。如果没有事件处理程序,代码不会回答问题,因此会否决和评论。基本上,你得到了“所有当前文本都被选中”而不是“当他选择字段时”部分。
      • @GusDeCooL 很有趣(尽管这不是他所要求的)我想要和你在这个上做的一样的结果:)
      【解决方案13】:

      或者您可以使用&lt;input onclick="select()"&gt; 完美。

      【讨论】:

      • 不,它没有。它适用于选择整体。但是尝试手动选择文本的一部分,您将无法做到。
      【解决方案14】:
      var timeOutSelect;
      $("input[type=text]").focus(function() { 
              var save_this = $(this);
              clearTimeout(timeOutSelect);
              timeOutSelect = window.setTimeout (function(){ 
                      save_this.select(); 
              }, 100);
      });
      

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

      【讨论】:

      • 请编辑更多信息。不鼓励使用纯代码和“试试这个”的答案,因为它们不包含可搜索的内容,也没有解释为什么有人应该“试试这个”。我们在这里努力成为知识的资源。
      【解决方案15】:

      与原生 JavaScript select() 完美搭配。

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

      或一般来说:

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

      【讨论】:

        【解决方案16】:

        你可以使用简单的代码:

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

        【讨论】:

        • 明显用jQuery
        【解决方案17】:
        <script>$.ready( $("input[type=text]").attr("onclick" , "this.select()"));<script>
        

        【讨论】:

        • 这可能会被标记为低质量答案,因为它没有任何解释发生了什么。
        • 您的$.ready 不正确。您需要向它传递一个函数以使其延迟attr,直到文档准备好。您立即执行此操作,然后将元素集合传递给$.ready
        • 另外,避免“点击”,尤其是这种方式。使用addEventListener
        猜你喜欢
        • 2013-07-18
        • 1970-01-01
        • 1970-01-01
        • 2013-05-13
        • 1970-01-01
        • 1970-01-01
        • 2012-10-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多