2011-11-22 36 views
9

Tengo una función que muestra un menú al hacer clic en él, y quiero que desaparezca después de 5 segundos. Este es mi javascript: funciona correctamente en el navegador de escritorio, pero no desaparece en los dispositivos móviles.setTimeout no funciona en safari mobile

$(function() { 
    $('#prod_btn').click(function() { 
     $(this).addClass('selected').next('ul').css('display', 'block'); 
     setTimeout(hideMenu, 5000); 
    }); 
}); 

function hideMenu() { 
    $('#prod_btn').removeClass('selected').next('ul').css('display', 'none'); 
} 

¿Dónde está el problema?

Gracias

+1

El tiempo de espera se activa en safari mobile cuando pongo una alerta() en la función hideMenu(). ¿Te funciona? –

+0

Lo intenté pero no muestra nada, parece que no activa la función ... – pugia

+1

¿Qué versiones estás usando de jquery, safari, etc.? Funciona para mí con jquery 1.6.4 y iOS 4.3 en el simulador. ¿Estás recibiendo errores? –

Respuesta

5

Acabo de tener el mismo problema. Mi código funciona bien en cualquier navegador de mi Mac, pero en los dispositivos iOs no funciona.

Uso ".bind (this)" en mi función de tiempo de espera y eso es lo que está causando el problema para mí. Cuando extiendo el objeto de función con ".bind" en mi script, funciona como un amuleto.

Mi código es algo como esto:

searchTimeout = setTimeout(function() { 
... 
}.bind(this),250); 

Para que esto funcione en dispositivos iOS I (como se mencionó anteriormente) se agregó esto:

Function.prototype.bind = function(parent) { 
    var f = this; 
    var args = []; 

    for (var a = 1; a < arguments.length; a++) { 
     args[args.length] = arguments[a]; 
    } 

    var temp = function() { 
     return f.apply(parent, args); 
    } 

    return(temp); 
} 

no veo ninguna .bind en su setTimeout, pero para otros con el mismo problema, este puede ser el problema. Es por eso que estoy publicando :-)

+1

Solo me pregunto cómo es .bind conectado a este problema. – Andy

+1

Este es un problema importante. Simplemente intenté depurar 20k líneas tratando de descubrir por qué funcionaba en iOS 6 y no en iOS 5. ¡¡¡Gracias !!! – Garrett

+0

Usando su primer ejemplo. Esto funciona en iOS 9.2! ¡Gracias! – GisMofx

1

Esto no se aplica a su código, pero un problema común con las secuencias de comandos de larga ejecución que fallan en los dispositivos iOS es que MobileSafari mata un hilo de JavaScript después de que hayan transcurrido 10 segundos. debería ser capaz de usar setTimeout y/o setInterval para evitar esto, o puede evitarlo haciendo un acceso directo a él y, por lo tanto, ejecutarlo como una aplicación. ver https://discussions.apple.com/thread/2298038, particularmente los comentarios de Dane Harrigan.

0

Tenga en cuenta también que cualquier función setTimeout es probable que se active mientras los elementos DOM se procesen si la demora se establece en un valor demasiado corto. Si bien eso puede parecer obvio, puede confundirse fácilmente con ningún método de disparar en absoluto. Una buena forma de probar es ejecutar una solicitud de alerta.

window.onLoad(alert("hey!")); 

A continuación, verifique si su función se activa después.