poco me encontré con este problema, mientras que el desarrollo de un juego en el que un usuario utilizando dispositivos pares WebSockets. Lamentablemente, ninguna de las soluciones mencionadas anteriormente funciona.
En resumen, el juego involucraba a un usuario que se suscribía a un canal a través de un formulario en su teléfono. Una vez suscritos, sacudirían el dispositivo y se vería un escenario en su escritorio. El problema era que cada vez que alguien sacudía un dispositivo iOS, aparecía la alerta "deshacer tipeo".
Aquí están las dos únicas soluciones que he encontrado para este problema.
Evite que su entrada pierda el foco. Esto requerirá que evite el envío de formularios si la entrada es parte de un formulario. También debe escuchar "touchstart" en lugar de "hacer clic" en cualquier delimitador y evitar que el evento touchstart se propague. Esto evitará que el anclaje obtenga el foco y que su entrada pierda el foco. Este enfoque tiene algunas desventajas con seguridad.
Agregar un controlador de eventos "keydown" a la ventana y evitar que el evento de propagación. Esto evita que cualquier valor se inserte en la entrada de los dispositivos iOS. También tuve que crear un objeto que asignara los códigos clave al personaje apropiado. Esta es la ruta que terminé yendo porque todo lo que necesitaba en mi entrada era un código de 6 caracteres, así que solo necesitaba números. Si necesita más que solo números, esto puede ser un dolor en el culo. Al pulsar la tecla, enganche ese carácter a través del código clave y establezca el valor de la entrada. Esto engaña a iOS para que piense que nunca se insertó ningún valor en la entrada a través del teclado, por lo que no hay nada que deshacer.
Tenga en cuenta la prevención de la propagación de evento KeyDown no impide la entrada en el navegador de Android de valores, por lo que sólo funcionará con normalidad. Pero eso está bien, ya que este no es un problema de Android. Puede evitar que los valores duplicados se inserten escuchando el evento de entrada en la entrada en sí y eliminando el oyente de selección si se recibe este evento.
var codes = {
48: 0,
49: 1,
50: 2,
51: 3,
52: 4,
53: 5,
54: 6,
55: 7,
56: 8,
57: 9
},
myInput = document.getElementById("myInput");
var keydownHelper = function (e) {
e.preventDefault();
myInput.removeEventListener("input", inputHelper);
var val = myInput.value;
// Delete
if (e.keyCode === 8 && val.length) {
myInput.value = val.slice(0, val.length - 1);
return;
}
// If not a number, do nada
if (typeof codes[e.keyCode] === "undefined") { return; }
val += codes[e.keyCode];
myInput.value = val;
};
var inputHelper = function (e) {
e.preventDefault();
window.removeEventListener("keydown", keydownHelper);
};
myInput.addEventListener("input", inputHelper);
window.addEventListener("keydown", keydownHelper);
¡Gracias por compartir! No estoy en condiciones de establecer un caso de prueba en este momento, pero su respuesta parece estar muy bien investigada y hacer lo que solicité en la pregunta original, por lo que la estoy aceptando como la correcta si nadie tiene cualquier objeción :) –