当用户集中焦点于某个文本框时,我使用以下代码来尝试选择该文本框中的所有文本。问题是,它会在一秒钟内全选所有文本,然后取消选择并将光标留在我点击的位置...
$("input[type=text]").focus(function() {
$(this).select();
});
我希望所有的选项都保持被选择。
当用户集中焦点于某个文本框时,我使用以下代码来尝试选择该文本框中的所有文本。问题是,它会在一秒钟内全选所有文本,然后取消选择并将光标留在我点击的位置...
$("input[type=text]").focus(function() {
$(this).select();
});
我希望所有的选项都保持被选择。
试着使用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);
});
我认为这是更好的解决方案。与仅在点击事件中选择不同,它不会阻止使用鼠标选择/编辑文本。 它适用于包括IE8在内的主要渲染引擎。
$('input').on('focus', function (e) {
$(this)
.one('mouseup', function () {
$(this).select();
return false;
})
.select();
});
select()
似乎可以解决这个问题。 - dperish$('input[autofocus]').select();
。 - Daniel Bleisteiner这里有一些不错的答案,其中@user2072367的是我最喜欢的,但是当您通过标签而不是单击进行聚焦时会有一个意外结果。(意外的结果是:在通过标签聚焦后正常选择文本,您必须再点击一次)
这个 Fiddle 修复了这个小 bug,并额外将 $(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();
});
});
这里有一点解释:
首先,让我们看一下当您鼠标或按 Tab 键进入字段时事件的顺序。
我们可以像这样记录所有相关事件:
$("input").on("mousedown focus mouseup click blur keydown keypress keyup change",
function(e) { console.log(e.type); });
注意:我已经更改了此解决方案,使用click而不是mouseup,因为它在事件管道中稍后发生,并且根据@Jocie的评论在firefox中似乎会引起一些问题。注意:按下Tab键后的keyup事件实际上会在新的输入框中触发,而不是之前的那个
我们只希望事件触发一次。我们可以使用.one("click keyup")
,但这将为每个事件类型调用事件处理程序一次。相反,一旦鼠标抬起或按键松开,我们就会调用函数。首先,我们将删除两个处理程序。这样,无论我们是通过Tab键还是鼠标进入,都不会有影响。该函数应该只执行一次。
现在,我们可以在浏览器进行选择后调用注意:大多数浏览器在按下Tab键时自然选择所有文本,但正如animatedgif指出的那样,我们仍然要处理
keyup
事件,否则mouseup
事件仍然会在任何时候闲置。我们监听两个事件,以便在处理完选择后立即关闭监听器。
select()
,以确保覆盖默认行为。mouseup
和keyup
函数中,这样.off()
方法就不会删除任何其他正在运行的监听器。
已在IE 10+,FF 28+和Chrome 35+中测试
如果您想使用一个名为once
的函数来扩展jQuery,使其可以在任意数量的事件中仅触发一次,请参考function called once
。
$.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
事件中处理文本选择,这个事件比mouseup
更靠后。因为我们希望尽可能晚地处理选择的结束,以便最大限度地覆盖浏览器,所以使用click
而不是mouseup
应该可以解决问题。已在FF、Chrome和IE中测试。 - KyleMitone
作为“处理程序每个事件类型对元素只执行一次”的选项是不够的。它会自动关闭触发它的事件,但其他事件仍然存在,而 off
无论如何都会处理它们。请参见我的问题:function that will fire exactly once for any number of events。 - KyleMit这样做可以完成工作,并避免您无法使用鼠标选择文本的问题。
$("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);
});
}
});
我来自2016年晚期,这段代码只适用于最新版本的jquery(在本例中为jquery-2.1.3.js)。
if ($(element).is("input")) {
$(element).focus(function () {
$(element).select();
});
}