当用户将重点放在字段上时,我正在使用此代码尝试选择字段中的所有文本。发生的是,它一秒钟选择了所有内容,然后未选择它,并且键入光标留在了我单击的位置...
$("input[type=text]").focus(function() {
$(this).select();
});
我希望所有这些都保持选中状态。
当用户将重点放在字段上时,我正在使用此代码尝试选择字段中的所有文本。发生的是,它一秒钟选择了所有内容,然后未选择它,并且键入光标留在了我单击的位置...
$("input[type=text]").focus(function() {
$(this).select();
});
我希望所有这些都保持选中状态。
Answers:
尝试使用click
代替focus
。它似乎适用于鼠标和按键事件(至少在Chrome / Mac上):
jQuery <版本1.7:
$("input[type='text']").click(function () {
$(this).select();
});
jQuery 1.7+版本:
$("input[type='text']").on("click", function () {
$(this).select();
});
我认为发生的事情是这样的:
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);
});
this
在这样的范围内,对的处理有点意外。我将更新代码。
我认为这是更好的解决方案。与简单地选择onclick事件不同,它不会阻止使用鼠标选择/编辑文本。它与主要的渲染引擎(包括IE8)一起使用。
$('input').on('focus', function (e) {
$(this)
.one('mouseup', function () {
$(this).select();
return false;
})
.select();
});
select()
虽然删除第二似乎工作。
$('input[autofocus]').select();
这里有一些不错的答案,@ 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();
});
经过仔细的审查,我将此建议作为此主题中的一种更简洁的解决方案:
$("input").focus(function(){
$(this).on("click.a keyup.a", function(e){
$(this).off("click.a keyup.a").select();
});
});
这里有一些解释:
首先,让我们看一下鼠标或跳入字段时的事件顺序。
我们可以像这样记录所有相关事件:
$("input").on("mousedown focus mouseup click blur keydown keypress keyup change",
function(e) { console.log(e.type); });
注意:我已经更改了此解决方案的使用方式,
click
而不是mouseup
稍后在事件管道中发生的解决方式,按照@Jocie的评论,似乎在firefox中引起了一些问题
某些浏览器会在mouseup
或click
事件期间尝试定位光标。这很有意义,因为您可能想在一个位置开始插入符号并拖动以突出显示一些文本。在您真正抬起鼠标之前,无法指定插入符号的位置。因此处理的功能focus
注定会过早响应,从而使浏览器无法覆盖您的位置。
但麻烦的是,我们确实确实想处理焦点事件。它使我们知道有人第一次进入该字段。在那之后,我们不想继续覆盖用户选择行为。
相反,在focus
事件处理程序中,我们可以为即将触发的click
(单击)和keyup
(进入)事件快速附加侦听器。
注意:选项卡事件的键入实际上将在新的输入字段中触发,而不是前一个
我们只想触发一次该事件。我们可以使用.one("click keyup)
,但这将为每种事件类型调用一次事件处理程序。相反,一旦按下mouseup或keyup,我们将调用我们的函数。我们要做的第一件事是删除两者的处理程序。这样一来,无论我们在选项卡中还是鼠标单击中都无所谓。该函数应该只执行一次。
注意:大多数浏览器自然会在制表符事件期间选择所有文本,但是正如animationgif指出的那样,我们仍然要处理该
keyup
事件,否则该mouseup
事件将在我们选择的任何时候都一直存在。处理完选择后,立即关闭听众。
现在,我们可以select()
在浏览器选择之后调用,以便确保覆盖默认行为。
最后,为了提供额外的保护,我们可以将事件名称空间添加到mouseup
和keyup
函数中,这样该.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();
});
});
click
事件处理比FF 更远的情况下处理了文本选择mouseup
。由于我们希望尽早处理选择的结束,以便最大程度地覆盖浏览器,因此使用click而不是mouseup应该可以解决问题。经过FF,Chrome和IE的测试。
这样就可以完成工作,并避免了无法再用鼠标选择部分文本的问题。
$("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");
}
});
此版本可在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();
}
}
});
这些解决方案中的大多数解决方案的问题是,它们在更改输入字段内的光标位置时无法正常工作。
所述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中对此进行了测试。
找到了一个很棒的解决方案,阅读此线程
$(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);
});
}
});
我使用FF 16.0.2和jQuery 1.8.3,答案中的所有代码均无效。
我使用这样的代码并工作。
$("input[type=text]").focus().select();
$("input[type=text]").on('click', function () { $(this).focus.select(); })
导致焦点并在用户单击框时发生选择,因为焦点是在用户单击框时执行的。没有事件处理程序,代码将无法回答问题,因此无法投票和注释。基本上,您获得了“所有当前文本均已选中”部分,但没有“他何时选择该字段”部分。
var timeOutSelect;
$("input[type=text]").focus(function() {
var save_this = $(this);
clearTimeout(timeOutSelect);
timeOutSelect = window.setTimeout (function(){
save_this.select();
}, 100);
});
如果在两个输入之间快速切换,请使用clearTimeout以获得更高的安全性。clearTimeout清除旧的超时...
<script>$.ready( $("input[type=text]").attr("onclick" , "this.select()"));<script>
$.ready
不正确。您需要向其传递一个函数,以使其延迟attr
文档准备就绪。您要立即执行此操作,然后将element集合传递给$.ready
。
addEventListener
。