2010-11-02 18 views
26

Tengo una plantilla móvil con un formulario de inicio de sesión que es la navegación basada en hash ajax/url. Si en un iPhone un usuario hace clic en el botón "ir" en el teclado del iPhone, el ajax lo autentica/registra y luego carga la siguiente página dentro de otro div y oculta el formulario de inicio de sesión actual.javascript - desenfocar un cuadro de texto

El problema es que, en un iPhone, el teclado aún aparece. ¿Hay alguna forma de desenfocar un elemento de cuadro de texto mediante javascript?

+0

http://web-design.blogs.webucator.com/files/2010/08/onFocusTShirt.gif :-) –

Respuesta

48

Utilice el método blur() o intente fijar el foco en otro elemento como un enlace.

+0

¿No hay otra manera? He intentado establecer el foco en un div y eso no funcionó – Joe

+1

¡bueno está el método 'blur()' – Xint0

+0

que funcionó con encanto! ¡Gracias! – Joe

3

Si no tiene fácil acceso al elemento específico que desea difuminar, existe una forma un poco hacky de implementar la funcionalidad "desenfocar todo".

Apenas añada el siguiente código HTML en algún lugar de su página:

<input id="blur-hack" type="text" style="position: absolute; opacity: 0;"> 

Entonces este JS se unfocus nada centrado actualmente:

document.getElementById("blur-hack").focus(); 

Tenga en cuenta que para el estilo HTML en línea, que no podemos hacer display: none o de lo contrario no puede enfocarse en él. position y opacity eliminará adecuadamente el elemento del flujo - también se podría utilizar márgenes de empujarlo lejos de la página, etc.

+2

o simplemente podría establecer 'height' en 0 – Bill

12

Esto es lo que he usado cuando .blur() no quería ser mi amigo

function blurAll(){ 
var tmp = document.createElement("input"); 
document.body.appendChild(tmp); 
tmp.focus(); 
document.body.removeChild(tmp); 
} 
+2

Esto es increíble, y justo lo que estaba buscando. Me gusta esta respuesta porque es autónoma y hace exactamente esta única cosa, y no deja ningún desorden. – thomasfuchs

0

Esto mantendrá rollo, y no causa ningún destello de un elemento

resetFocus() { 
    let scrollTop = document.body.scrollTop; 
    let body = document.body; 

    let tmp = document.createElement('input'); 
    tmp.style.opacity = 0; 
    body.appendChild(tmp); 
    tmp.focus(); 
    body.removeChild(tmp); 
    body.scrollTop = scrollTop; 
} 

basado en la solución de @ skygoo

0

Construyendo sobre la solución de @shygoo - ¡esto se traduce bien en TypeScript!

export function unfocus(): any { 
    const tmp: HTMLInputElement => document.createElement('input'); 
    document.body.appendChild(tmp); 
    tmp.focus(); 
    document.body.removeChild(tmp); 
} 

Algunas notas ...

  1. Es de tipo any para que sea compatible con el servicio de AngularJS $timeout, a pesar de que en realidad nunca devuelve nada.
  2. tmp es constante ya que nunca cambia durante el tiempo de vida de la llamada a la función.
Cuestiones relacionadas