在Safari和Chrome中无法使用jQuery选择焦点文字


85

我有以下jQuery代码(类似于此问题),可在Firefox和IE中使用,但在Chrome和Safari中失败(无错误,就是行不通)。有任何解决方法的想法吗?

$("#souper_fancy").focus(function() { $(this).select() });

我想要在iPad / iPhone的Safari中进行准确的操作。在iPod / iPhone浏览器中不起作用。任何线索。以下接受的答案仅适用于基于桌面的Chrome / Safari。
阿南德(Anand)2012年

5
注意:这里接受的答案只能解决一半问题。它可以使选择工作,但很难随后通过单击将其取消选择。更好的解决方案可以在这里找到:stackoverflow.com/questions/3380458/...
SDC

Answers:


188

是onmouseup事件导致选择未选中,因此您只需要添加:

$("#souper_fancy").mouseup(function(e){
    e.preventDefault();
});

3
有关此错误的更多参考,请访问:code.google.com/p/chromium/issues/detail?id=4505
Rajat 2010年

如何使用原型实现相同?
tehfink 2011年

您也可以尝试绑定到“ click”事件,而不必进行两次绑定。
uglymunky 2012年

@uglymunky取决于您的操作,在所有情况下都无法绑定到click事件-毕竟,除了单击输入字段之外,还有其他选择输入字段的方法,并且您希望它们也能正常工作(例如,
标签

2
我想要在iPad / iPhone的Safari中进行准确的操作。在iPod / iPhone浏览器中不起作用。任何线索。
阿南德

25
$('#randomfield').focus(function(event) {
    setTimeout(function() {$('#randomfield').select();}, 0);
});

3
如果您要为在Android上运行的PhoneGap应用选择表单字段中的文本,这是最佳答案。这为用户提供了一个视觉指示,表明已选择了文本,但是没有接受。
BallisticPugh

4

这对于输入type =“ text”元素来说很好用。#souper_fancy是什么元素?

$("#souper_fancy").focus(function() {
    $(this).select();
});

这是一个type =“ text”元素。我也尝试了$(“ input [type = text]”)。仍无法在Safari中使用jQuery 1.3.2。
user140550

3

仅阻止默认的mouseup会导致文本选择始终处于打开状态。MOUSEUP事件负责清除文本选择。但是,通过防止其默认行为,您无法使用鼠标取消选择文本。

为了避免这种情况并使文本选择再次起作用,您可以在FOCUS上设置一个标志,从MOUSEUP读取它并进行重置,以便将来的MOUSEUP事件将按预期运行。

$("#souper_fancy").focus(function() {
    $(this).select();

    //set flag for preventing MOUSEUP event....
    $this.data("preventMouseUp", true);
});

$("#souper_fancy").mouseup(function(e) {
    var preventEvent = $this.data("preventMouseUp");

    //only prevent default if the flag is TRUE
    if (preventEvent) {
        e.preventDefault();
    }

    //reset flag so MOUSEUP event deselect the text
    $this.data("preventMouseUp", false);
});

1

虽然可以在IE,Firefox,Chrome,Safari和Opera中选择它,但是它不允许您在Firefox,Chrome和Safari中再次单击来进行编辑。不能完全确定,但是我认为这可能是由于这3个浏览器重新发出了焦点事件,即使该字段已经具有焦点,因此也从未允许您实际插入光标(因为再次选择了它),而在IE中而Opera似乎并没有这样做,因此焦点事件没有再次触发,因此插入了光标。

在此Stack帖子中找到了一个更好的修复程序,该修复程序没有该问题,并且可以在所有浏览器中使用。


1

这在chrome中也应该起作用:

$("#souper_fancy").focus(function() {
    var tempSouper = $(this);
    setTimeout(function(){
        tempSouper.select();
    },100);
});

请考虑添加建设性反馈,以了解OP为何会发现此问题,并且您的解决方案可以解决该问题。
Mirko Adari

1

由于使用setTimeout时会出现闪烁,因此存在另一种基于事件的解决方案。这样,“焦点”事件将附加“鼠标”事件,并且事件处理程序将再次脱离自身。

    function selectAllOnFocus(e) {
    if (e.type == "mouseup") { // Prevent default and detach the handler
        console.debug("Mouse is up. Preventing default.");
        e.preventDefault();
        $(e.target).off('mouseup', selectAllOnFocus);
        return;
    }
    $(e.target).select();
    console.debug("Selecting all text");
    $(e.target).on('mouseup', selectAllOnFocus);
}

然后连线第一个活动

    $('.varquantity').on('focus', selectAllOnFocus);

1

setSelectionRange()在回调内部使用requestAnimationFrame()

$(document).on('focus', '._selectTextOnFocus', (e) => {
    var input = e.currentTarget;
    var initialType = e.currentTarget.type;

    requestAnimationFrame(() => {
        // input.select() is not supported on iOS
        // If setSelectionRange is use on a number input in Chrome it throws an exception,
        // so here we switch to type text first.
        input.type = "text";
        input.setSelectionRange(0, Number.MAX_SAFE_INTEGER || 9999);
        input.type = initialType;
    });
});

使用setSelectionRange()代替,select()因为select()它在移动Safari中不起作用(请参阅在iOS设备(移动Safari)上以编程方式在输入字段中选择文本)。

requestAnimationFrame在选择文本之前,必须等待使用,否则在iOS上出现键盘后,该元素将无法正确滚动到视图中。

使用setSelectionRange()时,请将输入类型设置为text,这一点很重要,否则可能会在Chrome上引发异常(请参阅Chrome上不再允许的inputType =“ number”上的selectionStart / selectionEnd)。


0

如果有人再次遇到此问题,我这里提供了一个纯JS解决方案,该解决方案(目前)适用于所有浏览器,包括 移动

<input type="text" value="Hello world..." onFocus="window.setTimeout(() => this.select());">

(没有setTimeout(),它不能在Safari,移动Safari和MS Edge上运行)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.