我与this question中的用户有相同的问题,这是由于Webkit中的this bug。但是,提供的解决方法不适用于我的应用程序。让我重新说明问题,这样您就不必阅读另一个问题:
我试图在文本区域中获得焦点时选择所有文本。以下jQuery代码可在IE / FF / Opera中运行:
$('#out').focus(function(){
$('#out').select();
});
[但是,在Chrome / Safari中,非常简短地选择了文本,但是随后触发了mouseUp事件,并且取消了选择文本。上述链接提供了以下解决方法:
$('#out').mouseup(function(e){
e.preventDefault();
});
但是,此解决方法对我没有好处。当用户指定文本区域焦点时,我想选择所有文本only。然后,他必须只能选择部分文本。谁能想到仍然可以满足此要求的解决方法?
怎么样?
$('#out').focus(function () {
$('#out').select().mouseup(function (e) {
e.preventDefault();
$(this).unbind("mouseup");
});
});
接受的答案(以及到目前为止我发现的基本上所有其他解决方案)不适用于键盘焦点,即e。按Tab键,至少不在我的Chromium 21中。我改用以下代码段:
$('#out').focus(function () {
$(this).select().one('mouseup', function (e) {
$(this).off('keyup');
e.preventDefault();
}).one('keyup', function () {
$(this).select().off('mouseup');
});
});
e.preventDefault()
或keyup
处理程序中的focus
没有帮助,因此键盘焦点后的取消选择似乎不会在其默认处理程序中发生,而是在focus
和keyup
事件之间。 >
如@BarelyFitz所建议,最好使用命名空间事件,以免意外取消绑定其他事件处理程序。为此,将'keyup'
替换为'keyup.selectText'
,将'mouseup'
替换为'mouseup.selectText'
。
为什么不简单:
稍微不同的方法是将焦点事件与鼠标序列分开。这对我来说确实非常好-没有状态变量,没有泄漏的处理程序,没有无意中删除了处理程序,并且可以与click,tab或程序焦点一起使用。下面的代码和jsFiddle-
制作bool
。焦点事件发生后将其设置为true
,鼠标悬停事件后将其重置。在鼠标上移期间,如果为true
,则表示用户刚刚选择了文本字段;因此,您知道必须防止鼠标向上移动。否则,必须让它通过。
将焦点放在输入框之前选择文本。
onclick="var self = this;setTimeout(function() {self.select();}, 0);"
digitalfresh的解决方案大部分都存在,但是存在一个错误,即如果您使用JS手动触发.focus()(因此不使用单击),或者如果您跳至该字段,则会遇到不必要的mouseup事件绑定-这导致应该取消选择文本的第一次单击被忽略。
tpankake的答案已转换为可重用的jQuery函数。((如果您对此表示赞同,请也对他的回答表示赞同)