提问人:DreamTeK 提问时间:10/17/2014 最后编辑:sideshowbarkerDreamTeK 更新时间:11/21/2022 访问量:6172
点击/单击时选择输入/文本框字段的内容
Select the content of input / textbox field on tap / click
问:
可选文本框的我的王国
挑战:
创建一个“任何”类型的跨浏览器文本框/输入字段,该文本框/输入字段可以在单击/点击时选择其内容。
这个问题多年来一直困扰着许多人。
问题:
使用触摸设备时,当鼠标使用该事件时,将触发该事件。在 Apple 设备上,tap 事件不会触发 或 。这不是 Safari 特有的问题,因为 Google Chrome 在 Apple 设备上有同样的问题,但在 Android 设备上没有。苹果设备处理点击事件的方式显然存在差异。tap
click
onclick
onfocus
选择文本的标准方法是简单地使用:
$('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.
答:
这又如何呢?
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);
评论
event.target.selectionEnd = event.target.value.length
;
event.target.value.length
点击和单击是两个事件。不同的移动操作系统有自己的方法来映射这两个事件。不仅是点击,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
});
评论
临时更改 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!移动键盘刚刚消失......就像一个焦点。白搭!
此时显示数字键盘会不那么糟糕,但不是。
所以我回到这里告诉大家,我这么简单的解决方案对移动设备不友好,这是不使用它的一个很好的理由。我真的试着回答......并充分验证了我的想法。请不要投反对票。;)
仅供记录:现在,直到更好的解决方案,我只是完全删除焦点上的值,而不是选择它......因为无论如何该值都会由用户更改。
评论
在 中或使用 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"/>
jQuery
tap events
<input type="text" placeholder="Search" id="searchItem" onclick="this.focus();this.select()">
在 Codepen 上查看此工作示例。
评论
对于某些字段,“选择/写入数字”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所指出的那样,不知道浏览器之间兼容性的真实状态。
是的,我疯狂地试图找到这个解决方案。基本上,您必须重新排列事件焦点,然后单击,然后触摸开始。
$('#myFUBARid').on('focus click touchstart', function(e){
$(this).get(0).setSelectionRange(0,9999);
e.preventDefault();
});
评论
$('.element').on("click tap", function(){stuff here});
.on("touchend")
touchstart