SetTimeout ne fonctionne pas sur safari mobile

J'ai une fonction qui montre un menu en cliquant dessus, et je veux qu'il disparaisse après 5 secondes. C'est mon javascript – il fonctionne correctement sur le navigateur de bureau, mais il ne disparaît pas sur les mobiles.

$(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'); } 

Où est le problème?

Merci

Je viens d'avoir le même problème. Mon code est génial dans tous les navigateurs de mon Mac, mais sur les périphériques iOs, cela ne fonctionne pas.

J'utilise ".bind (this)" sur ma fonction timeout et c'est ce qui me cause le problème. Quand j'élève l'objet de fonction avec ".bind" dans mon script, ça fonctionne comme un charme.

Mon code est quelque chose comme ceci:

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

Pour que cela fonctionne sur les périphériques iOs, je (comme mentionné ci-dessus) vient d'ajouter ceci:

 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); } 

Je ne vois pas de .bind sur votre setTimeout, mais pour d'autres personnes ayant le même problème, ce peut être le problème. C'est pourquoi je publie 🙂

J'ai déplacé votre exemple vers un jsbin, et ça fonctionne sur mon iPhone 4.

Testez-le ici depuis vos appareils: http://jsbin.com/asihac/5

Vous pouvez voir le code ici http://jsbin.com/asihac/5/edit

L'exemple est l'utilisation de jQuery – plus tard et j'ai seulement ajouté la classe css requise.

Cela ne s'applique pas à votre code, mais un problème commun avec les scripts de longue durée qui échouent sur les périphériques iOS est que MobileSafari tue un thread de JavaScript après 10 secondes se sont écoulés. Vous devriez pouvoir utiliser setTimeout et / ou setInterval pour contourner cela, ou vous pouvez l'éviter en faisant un raccourci vers lui et donc l'exécuter en tant qu'application. Voir https://discussions.apple.com/thread/2298038 , en particulier les commentaires de Dane Harrigan.

Gardez à l'esprit également que toute fonction setTimeout est réellement susceptible d'être déclenchée alors que les éléments DOM sont en cours de rendu si le délai est défini comme trop court. Bien que cela puisse sembler évident, il peut être facilement confondu sans aucune méthode de tir. Un bon moyen de tester consiste à afficher une alerte.

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

Ensuite, vérifiez si votre fonction se déclenche après.