点击/单击选择输入/文本框字段的内容

Posted

技术标签:

【中文标题】点击/单击选择输入/文本框字段的内容【英文标题】:Select the content of input / textbox field on tap / click 【发布时间】:2014-12-13 06:00:57 【问题描述】:

可选文本框的我的王国


挑战:

创建一个 'any' 类型的跨浏览器文本框/输入字段,可以在点击/点击时选择其内容。

多年来一直没有解决的问题。

问题:

当使用触摸设备时,tap 事件会在鼠标使用 click 事件时触发。在 Apple 设备上,点击事件不会触发 onclickonfocus。这不是 Safari 特定问题,因为 Google Chrome 在 Apple 设备上存在相同问题,但在 android 设备上没有。苹果设备处理点击事件的方式明显不同。


选择文本的标准方法是简单地使用:

$('input').focus(function () 
  $(this).select();
);

另一个关于堆栈溢出的选定解决方法是:

$('input').focus(function () 
  this.select(); //no jquery wrapper
).mouseup(function (e) 
  e.preventDefault();
);

两者都可以很好地工作,但在苹果设备上都不能工作。

我发现的唯一可行的解​​决方案是根据post 创建一个选择范围。 这是纯 javascript,效果很好。

$('input').click(function () 
  document.getElementById('ID').selectionStart = 0
  document.getElementById('ID').selectionEnd = 999
);

主要解决方案

凭借所有这些知识,我在这里提出了我自己的组合解决方案。

$('.Select').focus(function () 
  this.select();
  this.setSelectionRange(0, 9999);
).mouseup(function (e) 
  e.preventDefault();
);

重温问题

这是一个长期存在的问题,我认为已经解决了,但现在我们到了 2016 年,问题像行尸走肉一样从地球上升起。

规范现在明确指出:

您不能在“htmlInputElement”上使用“setSelectionRange”:输入元素的类型(“数字”)不支持选择。

所以主代码将不再适用于苹果设备的数字字段。

我们又来了,是时候让一些赏金猎人来处理这个案子了!

重要的附加信息:我讨厌苹果。


$('.Select').focus(function () 
  this.select();
  this.setSelectionRange(0, 9999);
).mouseup(function (e) 
  e.preventDefault();
);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
Input type text
<br/><input type="text" value="click me" class="Select">
<br/>Input type number
<br/><input type="number" value="0" class="Select">
<br/>I dont like apples.

【问题讨论】:

对我来说,简单地使用$('.element').on("click tap", function()stuff here); 总是有效的(在响应式网页设计和混合应用程序中)。请注意,使用“.on”允许您组合事件,其中诸如 .click 之类的东西将在某一时刻被弃用。 -- 如果这不起作用,总是可以选择使用.on("touchend")touchstart。我希望这会有所帮助。 【参考方案1】:

这个怎么样?

function addClickSelector(obj) 
  function selectText(event) 
    event.target.selectionStart = 0
    event.target.selectionEnd = event.target.value.length
  ;

  if (obj.addEventListener) 
    obj.addEventListener("click", selectText, false);
   else 
    obj.attachEvent("onclick", selectText);
  
;
[].forEach.call(document.getElementsByClassName('selectOnClick'), addClickSelector);

【讨论】:

因为target应该总是有一个value属性(input/textarea),我宁愿用event.target.selectionEnd = event.target.value.length; 999 的限制太远了,但我绝对同意@Apolo 关于 event.target.value.length 的选择。 我同意,伙计们。全面披露:我不是 Javascript 开发人员,我只是通过对方法中可用内容的肤浅了解来解决这个问题。 event.target.value.length 显然更好。【参考方案2】:

点击和单击是两个事件。不同的移动操作系统有自己的方式来映射这两个事件。不仅点击,Android 和 ios 地图悬停事件也以不同的方式点击。就像前一段时间不同的浏览器有不同的 javascript 集,所以 jquery 可以解决问题。

所以,我建议你使用一个名为hammer.js 的库来处理它。

var hammertime = new Hammer($(".testing")[0]);
hammertime.on('tap', function(ev) 
        event.target.selectionStart = 0
    event.target.selectionEnd = 999
);

var hammertime2 = new Hammer($(".testing2")[0]);
hammertime2.on('tap', function(ev) 
        $(event.target).select(); //to select number input, use this method
);

jsFiddle demo

【讨论】:

感谢锤子的建议,但是你的小提琴不起作用,这仍然会在数字输入上失败。对吗? 对于数字字段,需要其他方法来选择值,但点击功能也适用于数字输入。【参考方案3】:

临时更改类型属性怎么样? 我想选定的文本将被用户输入替换... 一旦用户输入内容或模糊,您将必须恢复原始类型属性,以防他离开该字段而不输入任何内容。

我没有任何 Apple 设备可以试用... ;)

$('.Select').focus(function () 
  if($(this).attr("type")=="number")
    // Temporarly change the type atttribute to "text"
    $(this).attr("type":"text");
    $(this).addClass("wasNumber");
  
  this.setSelectionRange(0, 9999);
  this.select();
  ).mouseup(function (e) 
  e.preventDefault();
);

$('.Select').keyup(function () 
    if($(this).hasClass("wasNumber"))
        // Restore the original type atttribute
        $(this).attr("type":"number");
        $(this).removeClass("wasNumber");
    
);

$('.Select').blur(function () 
    if($(this).hasClass("wasNumber"))
        // Restore the original type atttribute
        $(this).attr("type":"number");
        $(this).removeClass("wasNumber");
    
);

重要的编辑:我刚刚在我的一个项目中尝试过它......它确实有效......但是,如果您依赖数字类型向您的移动用户显示数字键盘。 .. 这是显示的文本键盘。在输入第一个字符后,由于该字段现在切换回“数字”,Snap!移动键盘刚刚消失……就像焦点一样。不好!

此时显示数字小键盘会不会那么糟糕,但不会。

所以我回来告诉我这么简单的解决方案不适合移动设备,这是不使用它的一个很好的理由。我真的很想回答......并充分测试了我的想法。请不要投反对票。 ;)

仅作记录:现在和直到有更好的解决方案之前,我只是将值完全删除而不是选择它...因为无论如何用户都会更改该值。

【讨论】:

我实际上需要一个针对手机/平板电脑用户的解决方案。让我头疼的是ipad。这似乎是一个创意,但非常 hacky :) 我讨厌这种“数字”输入类型!!! HTML5 标准开发人员的想法真是太糟糕了。这种输入类型唯一有用的是数字键盘。不好的是没有其他方法可以触发它。必须忍受不支持 maxlenght 等限制,在 javascript 填充上清除前导零......还有没有人会使用的丑陋旋转框呢!顺便说一句,我用来隐藏那个东西的解决方案在这里:***.com/questions/3790935/… @Obsidian:你的问题不正是关于如何破解 HTML 以获得想要的结果吗? ;) @Louys 您可以使用 inputmode="numeric" 触发它。这是类型编号的默认值,但您可以在文本字段中使用它。在我的答案和规范中检查它:html.spec.whatwg.org/multipage/… & html.spec.whatwg.org/multipage/… @Miguel:有趣!我不知道这个属性......这似乎是在 HTML 5.1 中建议的。当然,它既不适用于 Android 浏览器,也不适用于 Android 版 Chrome。我刚试了一下。我找到了这个特定的跨浏览器状态信息:wufoo.com/html5/attributes/23-inputmode.html【参考方案4】:

使用 JavaScript/jQuery&lt;input type="text"/&gt;&lt;input type="tel"/&gt;&lt;input type="number"/&gt; 中选择文本非常容易。以下是我在集成输入文本或数字时一直使用的代码。 在我们的例子中,JavaScript 代码直接添加到输入本身,这让事情变得更加方便。我们监听 点击事件,然后触发两个内置 JavaScript 函数:focus() & select();

正确的是,此解决方案适用于 &lt;input type="text"/&gt; 而没有 jQuery,但为了使 &lt;input type="number"/&gt;&lt;input type="tel"/&gt; 工作,您需要包含 jQuery 的库。此解决方案也适用于移动设备上的tap events

<input type="text" placeholder="Search" id="searchItem" onclick="this.focus();this.select()">  

在Codepen 上查看这个工作示例。

【讨论】:

这是使用 javascript 选择文本的标准方法。它是股票代码的一部分,但由于上述问题,这不适用于苹果设备。【参考方案5】:

对于某些字段,“选择/写入数字”用户界面可能不是某些设备上的数字键盘:增加和减少触发器等不同的东西可能会使文本选择不受欢迎。 这不仅会影响类型编号:“setSelectionRange 方法仅适用于文本、搜索、URL、电话和密码类型的输入”(https://developer.mozilla.org/en/docs/Web/API/HTMLInputElement),因此日期和其他内容也会受到影响。

一个非常简单的方法(可能是这种情况的解决方案):如何让所需的字段类型为“文本”(因此实际的解决方案仍然有效)并使用“inputmode=numeric”让设备显示它的数字输入 UI? https://html.spec.whatwg.org/multipage/forms.html#input-modalities:-the-inputmode-attribute

...由于它没有被广泛支持,我们可以尝试属性模式,它似乎强制 Ipad 上的数字键盘(没有 Apple 设备检查)pattern="[0-9]*"

<input class="Select" type="text" inputmode="numeric" pattern="[0-9]*">

有人可以检查小提琴在 Apple 设备上是否按预期工作吗?我没有。谢谢。

$('.Select').focus(function () 
  this.select();
  this.setSelectionRange(0, this.value.length);
).mouseup(function (e) 
  e.preventDefault();
);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input class="Select" type="text" pattern="[0-9]*" inputmode="numeric">

编辑:按照@Apolo 的建议将 fiddle 和 this.value.length 添加到选择范围

编辑:使用 pattern="[0-9]*" ,不知道浏览器之间兼容性的真实状态,正如@Louys 所指出的那样。

【讨论】:

【参考方案6】:

是的,我正在疯狂地试图找到这个解决方案。基本上,您必须重新排列事件焦点,然后单击,然后触摸开始。

$('#myFUBARid').on('focus click touchstart', function(e)
  $(this).get(0).setSelectionRange(0,9999);
  e.preventDefault();
);

【讨论】:

以上是关于点击/单击选择输入/文本框字段的内容的主要内容,如果未能解决你的问题,请参考以下文章

如何在单击输入键盘输出时选择文本框

javascript点击按钮弹出文本框,用户可输入

由于onmousedown =“return false”,无法点击/聚焦到文本框中

禁用输入,允许点击文本框

由于文本框失去焦点,按钮需要单击两次

自动更新文本框