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

Select the content of input / textbox field on tap / click

提问人:DreamTeK 提问时间:10/17/2014 最后编辑:sideshowbarkerDreamTeK 更新时间:11/21/2022 访问量:6172

问:

可选文本框的我的王国


挑战:

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

这个问题多年来一直困扰着许多人。

问题:

使用触摸设备时,当鼠标使用该事件时,将触发该事件。在 Apple 设备上,tap 事件不会触发 或 。这不是 Safari 特有的问题,因为 Google Chrome 在 Apple 设备上有同样的问题,但在 Android 设备上没有。苹果设备处理点击事件的方式显然存在差异。tapclickonclickonfocus


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

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

堆栈溢出中提到的另一个选定的解决方法是:

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

两者都运行良好,但都不适用于 Apple 设备。

我发现的唯一工作解决方案是按照这篇文章创建一个选择范围。 这是纯粹的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”:输入元素的类型(“number”)不支持选择。

因此,主代码将不再适用于苹果设备的数字字段。

我们又来了,是时候让一些赏金猎人参与此案了!

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


$('.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.

javascript jquery ios 选择 html-input

评论

0赞 NoobishPro 5/1/2016
对我来说,它总是有效的(在响应式网页设计和混合应用程序中)简单地使用 .请注意,使用“.on”可以组合事件,而像 .click 这样的东西会在某个时候被弃用。-- 如果这不起作用,则始终可以选择使用 or .我希望这会有所帮助。$('.element').on("click tap", function(){stuff here});.on("touchend")touchstart

答:

0赞 Ian MacDonald 10/18/2014 #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);

评论

2赞 Apolo 4/25/2016
因为 target 应该始终具有 value 属性(input/textarea),所以我宁愿使用event.target.selectionEnd = event.target.value.length;
1赞 miguel-svq 5/1/2016
999 的限制很远,但我完全同意@Apolo关于 event.target.value.length 进行选择。
1赞 Ian MacDonald 5/2/2016
我同意,伙计们。完全披露:我不是 Javascript 开发人员,只是在对方法中可用的内容有肤浅的了解来解决这个问题。 显然更好。event.target.value.length
0赞 cytsunny 4/26/2016 #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 演示

评论

0赞 DreamTeK 4/26/2016
感谢您的锤子建议,但是您的小提琴不起作用,并且在数字输入时仍然会失败。右?
0赞 cytsunny 4/26/2016
对于数字字段,需要其他方法来选择值,但点击功能也适用于数字输入。
0赞 Louys Patrice Bessette 4/27/2016 #3

临时更改 type 属性怎么样?

我想所选文本将被用户输入替换......

一旦用户键入某些内容或模糊,您将不得不恢复原始类型属性,以防他在不键入任何内容的情况下离开该字段。

我没有任何 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!移动键盘刚刚消失......就像一个焦点。白搭!

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

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

仅供记录:现在,直到更好的解决方案,我只是完全删除焦点上的值,而不是选择它......因为无论如何该值都会由用户更改。

评论

0赞 DreamTeK 4/27/2016
我实际上需要为手机/平板电脑用户提供解决方案。是ipad让我头疼。这似乎是一个创造性的想法,但非常:)
0赞 Louys Patrice Bessette 4/28/2016
我讨厌这种“数字”输入类型!!HTML5 标准开发人员真是个坏主意。这种输入类型唯一有用的是数字键盘。不好的是,没有其他方法可以触发它。必须忍受限制,例如不支持 maxlenght,在 javascript 填充时消除前导零......那么没人会用的丑陋的旋转盒呢!顺便说一句,我用来隐藏那个东西的解决方案就在这里:stackoverflow.com/questions/3790935/......
0赞 Louys Patrice Bessette 4/28/2016
@Obsidian:你的问题不是关于如何破解HTML以获得想要的结果吗?;)
0赞 miguel-svq 5/1/2016
@Louys 你可以用 inputmode=“numeric” 来触发它。这是类型 number 的默认值,但您可以在文本字段上使用它。在我的答案和规格中检查它:html.spec.whatwg.org/multipage/... & html.spec.whatwg.org/multipage/...
1赞 Louys Patrice Bessette 5/2/2016
@Miguel:有意思!我不知道这个属性......这似乎是在 HTML 5.1 中建议的。可以肯定的是,它既不适用于 Android 浏览器,也不适用于 Chrome for Android。我刚刚试过。我找到了该特定设备的跨浏览器状态信息: wufoo.com/html5/attributes/23-inputmode.html
-1赞 AllJs 4/29/2016 #4

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

当然,这个解决方案适用于没有 ,但为了制作或工作,您需要包含 的库。此解决方案在移动设备上也运行良好。<input type="text"/>jQuery<input type="number"/><input type="tel"/>jQuerytap events

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

Codepen 上查看此工作示例。

评论

0赞 DreamTeK 4/29/2016
这是使用 javascript 选择文本的标准方法。它是股票代码的一部分,但由于上述问题,这不适用于 Apple 设备。
0赞 miguel-svq 5/1/2016 #5

对于某些字段,“选择/写入数字”UI可能不是某些设备上的数字键盘:增加和减少触发器等不同的东西可能会使文本选择变得不可取。 这不仅影响到类型 number:“setSelectionRange 方法仅适用于 text、search、URL、tel 和 password 类型的输入”(https://developer.mozilla.org/en/docs/Web/API/HTMLInputElement),因此日期和其他方法也会受到影响。

一个非常简单的方法(也许是这种情况的解决方案):让所需的字段类型为“text”(因此实际解决方案仍然有效)并使用“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的建议将小提琴和this.value.length添加到选择范围内

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

0赞 adnan tariq 11/2/2017 #6

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

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