41 votes

Jquery click ne fonctionne pas sur ipad

Nous avons une application web qui utilise Jquery blockUI pour ouvrir une fenêtre contextuelle et effectuer une action. Tout cela fonctionne bien sur Safari et IE 8. Le problème est avec l'Ipad. Aucune des actions dans le pop up ne répond. il reste juste sur cette page. même fermer ne fonctionne pas. Faut-il ajouter quelque chose d'autre ? Voici le code qui ouvre une page et l'événement de clic pour la fermeture.

<script>
$(document).ready(function() {
  $.ajaxSetup( {
           cache:false
   });

        $("#sendInviteDiv").load("invite.htm?action=view&pid="+pid);
            $.blockUI({ message: $('#sendInviteDiv'),
                centerY: 0,
                    css: {
                top:  ($(window).height() - 550) /2 + 'px',
                        left: ($(window).width() - 870) /2 + 'px',
                        width: '870px'
                }
            });
            //var ua = navigator.userAgent;
            //var event = (ua.match(/iPad/i)) ? "touchstart" : "click";
            //alert(ua);

            $('#closeInvite').click($.unblockUI);

    $('#inviteBtn').click(function() {
//script to load 
       //setPositionDetails('${formName}','inviteBtn');

       });
}

});

</script>

J'apprécie les conseils.

javascript est activé et les popups sont autorisés dans les paramètres Safari de l'Ipad.

2 votes

Activez la console de débogage dans les préférences de Safari (Settings - Safari - Developer). Des messages d'erreur ?

86voto

Rich Bradshaw Points 33598

J'utilise généralement

.bind("click touchstart", function(){

});

au lieu de :

.click(function(){

});

De cette façon, vous liez le bon événement. C'est aussi plus rapide, le toucher réagit beaucoup plus vite que le clic pour une raison quelconque.

14 votes

Dans mon cas, j'ai dû utiliser bind("click tap", ...)

0 votes

C'est ce que les développeurs de webkit devraient noter quelque part au tout début, pas nous qui essayons de trouver le problème. sinon, bonne trouvaille, Rich !

0 votes

L'événement doit être lié directement à l'élément pour qu'iOS puisse enregistrer des événements sur cet élément. Cela signifie que les gestionnaires d'événements délégués ne fonctionneront pas ( .on("click touch", "selector", function() { … } ne fonctionne pas).

37voto

lachie_h Points 133

Je sais que cette question a été posée il y a longtemps, mais j'ai trouvé une réponse en cherchant cette question exacte.

Il existe deux solutions.

Vous pouvez soit définir un attribut onlick vide sur l'élément html :

<div class="clickElement" onclick=""></div>

Vous pouvez également l'ajouter dans les css en définissant le curseur du pointeur :

.clickElement { cursor:pointer }

Le problème est que sur ipad, le premier clic sur un élément non ancré s'enregistre comme un survol. Ce n'est pas vraiment un bug, car cela aide les sites qui ont des menus survolés qui n'ont pas été optimisés pour les tablettes/mobiles. Le fait de placer le curseur ou d'ajouter un attribut onclick vide indique au navigateur que l'élément est bien une zone cliquable.

(via http://www.mitch-solutions.com/blog/17-ipad-jquery-live-click-events-not-working )

25voto

Brian Points 11

MISE À JOUR : j'ai changé .bind a .on car c'est désormais la méthode préférée selon jQuery.

Depuis la version 1.7 de jQuery, la fonction .on() est la méthode préférée pour attacher des gestionnaires d'événements à un document. jquery.com

EXEMPLE :

$('.button').on("click touchstart", function() {

});

Vous trouverez ci-dessous la version définitive de la click y touchstart parce qu'il se déclenche toujours même avec les nouveaux objets du DOM qui sont ajoutés après que le DOM ait été chargé. Incorporer cette solution ultime d'événement de clic pour n'importe quel scénario.

$(document).on("click touchstart", ".button", function () {

});

7voto

Samson Points 31

Utilice bind à la place. Rendez-le plus convivial.

Exemple :

var clickHandler = "click";

if('ontouchstart' in document.documentElement){
    clickHandler = "touchstart";
}

$(".button").bind(clickHandler,function(){
    alert('Visible on touch and non-touch enabled devices');
});

0 votes

Et cela permet d'éviter le délai d'un événement de clic sur les appareils tactiles.

1 votes

L'utilisation des liaisons de variables était la solution la plus adaptée à ma situation particulière. Si un utilisateur a des problèmes avec l'événement qui se déclenche deux fois dans le mobile à cause d'une double liaison, c'est la bonne solution.

2voto

Grâce aux commentaires précédents, j'ai pu constater que tous les éléments suivants ont fonctionné pour moi :

Soit l'ajout d'un stub onclick à l'élément

onclick="void(0);" 

ou l'utilisateur un style de pointeur de curseur

style="cursor:pointer;"

ou comme dans mon code existant, mon code jquery est nécessaire robinet ajouté

$(document).on('click tap','.ciAddLike',function(event)
{
    alert('like added!'); // stopped working in ios safari until tap added
});

J'ajoute une référence croisée aux Apple Docs pour les personnes intéressées. Voir Apple Docs:Rendre les événements cliquables

(Je ne sais pas exactement quand mon application hybride a cessé de traiter les clics, mais je crois me souvenir qu'ils fonctionnaient sous iOS 7 et avant).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X