Seleccionar texto mediante programación en un campo de entrada en dispositivos iOS (Safari móvil)

87

¿Cómo se selecciona mediante programación el texto de un campo de entrada en dispositivos iOS, por ejemplo, iPhone, iPad con Safari móvil?

Normalmente es suficiente llamar a la .select()función en el <input ... />elemento, pero esto no funciona en esos dispositivos. El cursor simplemente se deja al final de la entrada existente sin realizar ninguna selección.

sroebuck
fuente
10
No veo ninguna razón por la que ser un dispositivo táctil cambie la relevancia de la preselección del texto. Lo que dijiste sobre un dispositivo táctil también puede decirse de un dispositivo no táctil. Quiero preseleccionar texto cuando un usuario elige tocar un elemento para editarlo. En la mayoría de los casos, es probable que el usuario desee reemplazar el contenido existente, en cuyo caso podrá hacerlo sin tener que tocar ni arrastrar más. En otros casos, cuando quieran editar el contenido existente, podrían anular la selección o cambiar la selección.
sroebuck
2
Desafortunadamente, .focus (). Select () no funciona.
sroebuck
2
Estoy comenzando una recompensa por este tema. Mi objetivo es facilitar que los usuarios hagan clic en mi área de texto y toquen "Copiar" para copiar el texto al portapapeles.
Dan Fabulich
Lo mismo aquí ... parece que hay muchos métodos que no funcionan en Mobile Safari .select () y .focus () son dos de ellos.
@sroebuck ¡buena respuesta para David W. Keith! ¡Pulgares hacia arriba!
eyurdakul

Respuestas:

95
input.setSelectionRange(0, 9999);

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

jobwat
fuente
3
Esto funcionó para mí, pero tenía que incluir detener el mouse hacia arriba en las mismas entradas.
DuStorm
8
Esto no me funcionó ni en un iPad ni en un iPhone
Doug
4
Esto solo funcionó para mí si activé .focus()la entrada antes de invocar input.setSelectionRange. Si está escuchando el focusevento en la entrada, recuerde tener en cuenta un bucle infinito.
allieferr
10
Un problema que vale la pena mencionar: esto no funcionará en áreas de texto si tienen el readonlyatributo establecido.
JayPea
5
Pasé más de una hora jugando con varias soluciones. Llamar setSelectionRange()a un focuscontrolador funciona cuando se activa mediante .focus()programación, pero cuando toca manualmente la entrada de texto en iOS, la selección no ocurre. Basta decir que todo lo que necesita hacer es llamar setSelectionRange()dentro de un setTimeout de 0 y funciona como se esperaba sin importar qué desencadena el foco.
30

Nada en este hilo funcionó para mí, esto es lo que funciona en mi iPad:

// t is the input field
setTimeout(function() {
    t.setSelectionRange(0, 9999);
}, 1);
nkrop
fuente
esto hace el maldito truco! ¡Gracias! funciona con el evento 'clic'
saike
¡¡Muchas gracias!!
Vaclav Kusak
26

Es difícil probar algo negativo, pero mi investigación sugiere que esto es un error en Mobile Safari.

Tenga en cuenta que focus () funciona, más o menos, aunque puede requerir más de un toque para tener éxito, y no es necesario si está tratando de responder al toque de un usuario en el campo en cuestión, ya que el toque en sí le dará al campo atención. Por desgracia, seleccione () es simplemente no funcional en Mobile Safari.

Su mejor apuesta puede ser un informe de error con Apple .

clozach
fuente
1
Nuestras pruebas indican lo mismo. Es un error o falta en un safari móvil.
Nir Levy
2
FWIW, funciona en Chrome Desktop y Android Browser, que también se basan en WebKit.
jrummell
24

Vea este violín : (ingrese algo de texto en el cuadro de entrada y haga clic en 'seleccionar texto')

Es seleccionar texto en un cuadro de entrada en mi iPod (5.a generación iOS6.0.1), abrir el teclado y también mostrar el menú Cortar / Copiar / Sugerir ...

Usando javascript simple. No probé esto con jQuery

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

Tenga en cuenta que el número 999 es solo una muestra. Debe establecer estos números en el número de caracteres que desea seleccionar.

ACTUALIZAR:

  • iPod5 - iOS6.0.1 - Funciona bien.
  • iPad1 - iOS5.1.1 - Solo texto seleccionado. Toque la selección una vez para abrir el menú Cortar / Copiar
  • iPad2 - iOS4.3.3 - Solo texto seleccionado. Toque la selección una vez para abrir el menú Cortar / Copiar

Para los dos últimos, puede experimentar activando un evento de clic en el inputelemento

ACTUALIZACIÓN: (07-10-2013)

  • iPod5 - iOS7.0.2 - Usando el violín en el enlace: no se puede ver el texto escrito en el cuadro de entrada. Al presionar Seleccionar me redirige a facebook.com (??? wtf ???) No tengo idea de lo que está pasando allí.

ACTUALIZACIÓN: (14-11-2013)

  • iOS 7.0.3: Gracias al comentario de binki actualización que el .selectionStarty .selectionEnd hace el trabajo.

ACTUALIZACIÓN: (15-01-2015)

  • iOS 8.xx: Gracias al comentario de Michael Siebert . Tomado del comentario: tuve que escuchar los eventos de enfoque Y de clic y luego establecerTimeout / _. Debounce para que funcione en ambos casos: haga clic en la entrada o enfoque a través de tabulaciones
bart s
fuente
¡Eres mi héroe por hoy! ¡Funciona de maravilla! ;-)
andi1984
3
@ andi1984 ¿dónde reclamo la insignia de héroe?
Bart el
1
¿Conoce la compatibilidad con otras versiones de iOS? ¿Funciona en iOS5 e iOS4?
andi1984
1
Funciona para mí en iOS6 PERO a) no funciona en Chrome de escritorio b) no funciona cuando la entrada de texto está deshabilitada :( Mi caso de uso: genero una URL única y quiero facilitar el intercambio.
Mars Robertson
1
@barts Voy a suponer que terminaste en Facebook porque el menú "Compartir" en jsfiddle debe estar desordenado y se puede tocar, aunque quizás sea invisible. Terminé haciendo clic en el botón invisible de Twitter cuando probaba con iOS-7.0.3 en un iPad. También descubrí que cuando pensé que estaba <input/>haciendo tapping en tu , el iPad pensó que estaba haciendo tapping en el panel "CSS" de jsfiddle (donde todo lo que escribía era invisible). Una vez que haya dirigido mi toque a la dirección correcta <input/>, el botón "seleccionar texto" funciona perfectamente bien en iOS-7.0.3 :-).
binki
7

Lo siento, en mi publicación anterior, no noté que Javascript implicaba que querías una respuesta en Javascript.

Para obtener lo que desea en UIWebView con javascript , me las arreglé para reunir dos piezas importantes de información para que funcione. No estoy seguro sobre el navegador móvil.

  1. element.setSelectionRange(0,9999); hace lo que queremos

  2. El evento mouseUp deshace la selección.

Por lo tanto (usando Prototype):

    input.observe ('enfoque', función () {
      this.setSelectionRange (0, 9999);
    });
    input.observe ('mouseup', function (event) {
      event.stop ();
    });

Hace el truco.

Mate

Mate
fuente
3
Tenemos el mismo problema y encontramos que su solución funcionó, pero estamos usando jquery (móvil en realidad). / * seleccionar el texto dentro de los rellenos * / $ ("entrada"). focus (function () {this.setSelectionRange (0, 9999); return false;}) .mouseup (function () {return false;} );
DuStorm
1
Estoy usando iOS 8 en iPad y iPhone, y el código de @DuStorm (comentario sobre este) es lo único que funcionó para mí de todas las respuestas que se dan aquí. Para reiterar, lo siguiente al menos funciona en iOS 8 en Chrome y Safari: $("input").focus(function () { this.setSelectionRange(0, 9999); return false; } ).mouseup( function () { return false; });
Aaron Jessen
Tuve que usar en focusinlugar de enfocar para que esto funcione, iOS 7
Lucas
3

Parece que el enfoque funcionará, pero solo cuando se llame directamente desde un evento nativo. llamar al foco usando algo como SetTimeout no aparece llamar al teclado. El control del teclado ios es muy deficiente. No es una buena situación.

yodaisverde
fuente
1

Algo como lo siguiente me funciona en Webkit que viene con Android 2.2:

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

Consulte Chromium Issue 32865 .

robocat
fuente
1

Con iOS 7 en iPad, la única forma en que pude hacer que esto funcionara fue usar realmente en <textarea></textarea>lugar de <input>campo.

p.ej

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

Cómo evitar que el usuario cambie el texto dentro del área fue más difícil, ya que si hace que el área de texto sea de solo lectura, el truco de selección ya no funcionará.

Mikael Lepistö
fuente
1

Me volví loco buscando esta solución, mientras que todas sus respuestas ayudaron a abrir otra lata de gusanos para mí.

El cliente quería que el usuario pudiera hacer clic y seleccionar todo , y también dejar que el usuario 'tabulara' y seleccionara todo en el iPad (con un teclado externo. Lo sé, loco ...)

Mi solución a este problema fue reorganizar los eventos. Primero enfoque , luego haga clic , luego toque Inicio .

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

Espero que esto ayude a alguien, ya que ustedes me han ayudado innumerables veces.

adnan tariq
fuente
-4

Si está utilizando navegadores compatibles con HTML5, puede utilizarlo placeholder="xxx"en su inputetiqueta. Eso debería hacer el trabajo.

DrMad
fuente
8
No creo que esto sea lo que estaba haciendo la pregunta
caitriona