我正在使用此代码尝试在用户关注字段时选择字段中的所有文本。会发生什么,它选择全部一秒钟,然后取消选择,键入光标留在我点击的位置......
$("input[type=text]").focus(function() {
$(this).select();
});
我希望所有人都保持选中状态。
答案 0 :(得分:452)
尝试使用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();
});
答案 1 :(得分:65)
我认为会发生这样的事情:
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);
});
答案 2 :(得分:54)
我认为这是更好的解决方案。与简单地选择onclick事件不同,它不会阻止使用鼠标选择/编辑文本。它适用于主要的渲染引擎,包括IE8。
$('input').on('focus', function (e) {
$(this)
.one('mouseup', function () {
$(this).select();
return false;
})
.select();
});
答案 3 :(得分:36)
这里有一些不错的答案,@ user2072367是我最喜欢的,但是当你通过tab而不是点击进行聚焦时会产生意想不到的结果。 (意外结果:通过选项卡聚焦后正常选择文本,您必须再单击一次)
This fiddle修复了这个小错误并另外将$(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();
});
答案 4 :(得分:20)
经过仔细审查后,我认为这是一个更清晰的解决方案:
$("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
,因为它稍后会在事件管道中发生,并且似乎在Firefox中导致某些问题per @ Jocie的评论
某些浏览器尝试在mouseup
或click
事件期间定位光标。这是有道理的,因为您可能希望在一个位置启动插入符并拖动以突出显示某些文本。在实际抬起鼠标之前,它无法指定插入位置。因此,处理focus
的函数命中注定要过早响应,让浏览器覆盖您的定位。
但问题是我们确实想要处理焦点事件。它让我们知道有人第一次进入该领域。在那之后,我们不希望继续覆盖用户选择行为。
相反,在focus
事件处理程序中,我们可以快速附加即将触发的click
(单击)和keyup
(制表符)事件的侦听器。
注意:标签事件的主要内容实际上是fire in the new input field, not the previous one
我们只想发起一次事件。我们可以使用.one("click keyup)
,但这会call the event handler once for each event type。相反,只要按下mouseup或keyup,我们就会调用我们的函数。我们要做的第一件事就是删除两者的处理程序。这样,无论我们是选项卡还是鼠标都没关系。函数应该只执行一次。
注意:大多数浏览器会在标签事件期间自然选择所有文字,但是animatedgif pointed out,我们仍然希望处理
keyup
事件,否则{{1}在我们选中的任何时候,事件仍然会徘徊。我们会同时听两个,所以我们可以在处理完选择后立即关闭听众。
现在,我们可以在浏览器进行选择后调用mouseup
,以便我们确保覆盖默认行为。
最后,为了获得额外的保护,我们可以将event namespaces添加到select()
和mouseup
函数中,以便keyup
方法不会删除任何其他可能存在的侦听器播放。
在IE 10 +,FF 28+和&amp ;;中测试Chrome 35 +
或者,如果您想使用function called once
that will fire exactly once for any number of events扩展jQuery:
.off()
然后你可以进一步简化代码:
$.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);
});
};
答案 5 :(得分:13)
这可以完成工作并避免您无法再通过鼠标选择部分文本的问题。
$("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");
}
});
答案 6 :(得分:6)
此版本适用于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();
}
}
});
答案 7 :(得分:5)
大多数解决方案的问题是在输入字段中更改光标位置时它们无法正常工作。
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中对此进行了测试。
答案 8 :(得分:4)
找到一个很棒的解决方案,阅读this thread
$(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);
});
}
});
答案 9 :(得分:2)
var timeOutSelect;
$("input[type=text]").focus(function() {
var save_this = $(this);
clearTimeout(timeOutSelect);
timeOutSelect = window.setTimeout (function(){
save_this.select();
}, 100);
});
如果您在两个输入之间快速切换,请使用clearTimeout以获得更高的安全性。 clearTimeout清除旧的超时...
答案 10 :(得分:2)
我将从2016年底开始,此代码仅适用于最新版本的jquery(在本例中为jquery-2.1.3.js)。
if ($(element).is("input")) {
$(element).focus(function () {
$(element).select();
});
}
答案 11 :(得分:1)
我使用FF 16.0.2和jquery 1.8.3,答案中的所有代码都不起作用 我使用这样的代码并且工作。
$("input[type=text]").focus().select();
答案 12 :(得分:1)
或者您可以使用#{}
完美无缺。
答案 13 :(得分:0)
<script>$.ready( $("input[type=text]").attr("onclick" , "this.select()"));<script>
答案 14 :(得分:0)
您可以使用简单的代码:
$('#idname').select();
答案 15 :(得分:0)
与本机JavaScript select()
完美结合。
$("input[type=text]").focus(function(event) {
event.currentTarget.select();
});
或一般而言:
$("input[type=text]")[0].select()
答案 16 :(得分:0)
我始终使用requestAnimationFrame()
跳过内部事件后机制,这在Firefox中非常有效。尚未在Chrome中进行测试。
$("input[type=text]").on('focus', function() {
requestAnimationFrame(() => $(this).select());
});