在iOS设备(移动Safari)上以编程方式在输入字段中选择文本


87

您如何在iOS设备(例如运行移动Safari的iPhone,iPad)上以编程方式选择输入字段的文本?

通常.select(),在<input ... />元素上调用函数就足够了,但这在那些设备上不起作用。光标仅停留在现有条目的末尾,而没有进行选择。


10
我看不出有什么理由会使触摸设备改变预选文本的相关性。您所说的触摸设备可以说是非触摸设备。当用户选择触摸项目进行编辑时,我想预选文本。在大多数情况下,用户可能希望替换现有内容,在这种情况下,他们将能够执行此操作而无需任何进一步的触摸和拖动。在其他情况下,当他们想要编辑现有内容时,他们可以取消选择或更改选择。
sroebuck

2
不幸的是.focus()。select()不起作用。
sroebuck

2
我正在就这个问题开始悬赏。我的目标是使用户非常容易地单击我的文本区域,然后点击“复制”以将文本复制到剪贴板。
Dan Fabulich 2010年

同样在这里..似乎有很多方法无法在Mobile Safari中使用。select()和.focus()是其中的两个。

@sroebuck对于David W. Keith是一个不错的答案!竖起大拇指!
eyurdakul

Answers:


95
input.setSelectionRange(0, 9999);

https://developer.mozilla.org/en/DOM/Input.select


3
这对我有用,但必须包括在相同输入上停止mouseup。
DuStorm

8
这在iPad或iPhone上都不适合我
Doug

4
仅当我.focus()在调用之前触发输入时,这才对我有用input.setSelectionRange。如果您正在监听focus输入中的事件,请记住要考虑无限循环。
allieferr 2014年

10
一个值得一提的陷阱:如果readonly设置了属性,这将不适用于textarea 。
JayPea 2014年

5
我花了一个多小时来研究各种解决方案。setSelectionRange()以编程方式focus触发时,可以调用处理.focus()程序,但是在iOS上手动点击文本输入时,不会发生选择。可以这么说,您要做的就是setSelectionRange()在setTimeout为0内调用,并且无论触发焦点如何,它都可以按预期工作。

30

此线程对我没有任何作用,这是在我的iPad上起作用的内容:

// t is the input field
setTimeout(function() {
    t.setSelectionRange(0, 9999);
}, 1);

这可以做一些绝招!谢谢!与“点击”事件配合使用
saike

非常感谢你!!
瓦茨拉夫·库萨克

26

很难证明是否定的,但是我的研究表明这是Mobile Safari中的错误。

请注意,focus()或多或少都起作用,尽管它可能需要多次轻击才能成功,并且如果您尝试响应所涉及字段上的用户轻击,则没有必要,因为轻击本身会给该字段焦点。不幸的是,选择()简单地在移动Safari浏览器不起作用。

最好的选择可能是与Apple一起发布错误报告。


1
我们的测试表明相同。这是移动Safari中的错误/缺失功能。
尼尔·利维

2
FWIW,它可在基于WebKit的Chrome桌面和Android浏览器中使用。
jrummell

24

看到这个小提琴:(在输入框中输入一些文本,然后单击“选择文本”)

它正在iPod(第5代iOS6.0.1第五代)的输入框中选择文本,打开键盘并显示“剪切/复制/建议...”菜单。

使用纯JavaScript。没有尝试使用jQuery

document.getElementById("p1").selectionStart = 0
document.getElementById("p1").selectionEnd = 999

请注意,数字999仅是示例。您应该将这些数字设置为要选择的字符数。

更新:

  • iPod5-iOS6.0.1-正常运行。
  • iPad1-iOS5.1.1-仅选择文本。点击一次选择以打开剪切/复制菜单
  • iPad2-iOS4.3.3-仅选择文本。点击一次选择以打开剪切/复制菜单

对于最后两个,您可以通过触发input元素上的click事件进行实验

更新:(07-10-2013)

  • iPod5-iOS7.0.2-使用链接中的小提琴:在输入框中看不到键入的文本。按选择键将我重定向到facebook.com(??? wtf ???),不知道发生了什么。

更新:(14-11-2013)

  • iOS 7.0.3:感谢binki更新的注释, .selectionStart并且.selectionEnd 确实起作用。

更新:(15-01-2015)

  • iOS 8.xx:感谢Michael Siebert的评论。摘自评论:我必须同时监听焦点和单击事件,然后监听setTimeout / _。debounce才能在两种情况下均能正常工作:单击输入或通过制表符聚焦

你是我今天的英雄!奇迹般有效!;-)
andi1984

3
@ andi1984我在哪里领取英雄徽章?
bart s 2012年

1
您知道与其他iOS版本的兼容性吗?它可以在iOS5和iOS4上使用吗?
andi1984

1
对我的作品在iOS6的但)不上桌面版Chrome b工作)不工作时,文本输入无效:(我用例:我生成唯一的URL,并希望faciliate共享。
火星罗伯逊

1
@barts我猜你最终落在了Facebook上,因为jsfiddle的“共享”菜单必须弄乱并且可以在不可见的情况下轻敲。当我在iPad上使用iOS-7.0.3进行测试时,我自己点击了不可见的Twitter按钮。我还发现,当我以为自己在敲击您<input/>的iPad时,我以为在我敲击jsfiddle的“ CSS”窗格(其中,我键入的任何内容都不可见)。一旦我将水龙头对准了正确的位置<input/>,您的“选择文本”按钮就可以在iOS-7.0.3 :-)上正常工作。
binki 2013年

7

抱歉,在我之前的文章中,我没有注意到Javascript暗示您需要Java答案。

为了使用javascriptUIWebView中获得所需的内容,我设法将两个重要的信息拼凑起来以使其正常工作。不确定移动浏览器。

  1. element.setSelectionRange(0,9999); 做我们想要的

  2. mouseUp事件正在撤消选择

因此(使用原型):

    input.observe('focus',function(){
      this.setSelectionRange(0,9999);
    });
    input.observe('mouseup',function(event){
      event.stop();
    });

绝招。

马特


3
我们遇到了同样的问题,发现您的解决方案有效-但我们正在使用jquery(实际上是移动设备)。/ *选择填充项内的文本* / $(“ input”)。focus(function(){this.setSelectionRange(0,9999); return false;}).mouseup(function(){return false;} );
杜斯托姆

1
我在iPad和iPhone上使用的是iOS 8,@ DuStorm中的代码(在此之上的注释)是我在此处给出的所有答案中唯一起作用的代码。重申一下,以下内容至少可以在Chrome 8和Safari的iOS 8上运行: $("input").focus(function () { this.setSelectionRange(0, 9999); return false; } ).mouseup( function () { return false; });
Aaron Jessen 2014年

我必须使用focusiniOS 7而不是专注于此,iOS 7
Lucas

3

看起来焦点将起作用,但仅当从本地事件直接调用时才起作用。使用SetTimeout之类的方法来调用焦点不会出现在键盘上。ios键盘的控制非常差。这不是一个好情况。


1

在Android 2.2随附的Webkit上,以下内容对我来说很有效:

function trySelect(el) {
    setTimeout(function() {
        try {
            el.select();
        } catch (e) {
        }
    }, 0);
}

参见Chromium Issue 32865


1

使用iPad上的iOS 7,我能够完成这项工作的唯一方法是实际使用它<textarea></textarea>而不是使用<input>字段。

例如

<textarea onclick="this.setSelectionRange(0, 9999);">My text will be selected when textarea is clicked.</textarea>

如何阻止用户更改区域内的文本更加困难,因为您将文本区域设置为只读时,选择技巧将不再起作用。


1

我很疯狂地在寻找这种解决方案,而您的所有答复都帮助它为我打开了另一罐蠕虫。

客户端希望用户能够单击并选择全部让用户“制表”并在iPad上选择全部(使用外部键盘。我知道,这很疯狂...)

我对这个问题的解决方案是重新安排事件。首先聚焦,然后单击,然后触摸开始

$('#myFUBARid').on('focus click touchstart', function(e){
  $(this).get(0).setSelectionRange(0,9999);
  //$(this).css("color", "blue");
  e.preventDefault();
});

我希望这对某人有帮助,因为您为我提供了无数次帮助。


-4

如果您使用的是HTML5兼容的浏览器,则可以placeholder="xxx"input标记中使用。那应该做的。


8
我不认为这是问题的所在
caitriona 2012年
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.