jQuery.sur() et.délégué() ne fonctionne pas sur iPad

Si vous essayez cet extrait sur le bureau, Tout fonctionne.
Chaque fois que vous essayez sur iPad, il ne fera rien.

$('body').on('click', '#click', function() {
    alert("This alert won't work on iPad");
});
div { 
  font-size: 24px; 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="click">Click here</div>

Simple .click() handler fonctionne, mais ce n'est pas ce que je veux. Il en va de même pour .delegate(); et .live()

Est-ce un bug ou quelque chose?

27
demandé sur Simon Arnold 2012-04-15 23:09:22

7 réponses

C'est un bug/Fonctionnalité Safari mobile: les événements de clic ne feront pas de bulles jusqu'au corps.

L'ajout de onclick="" est une solution de contournement connue, mais à mon humble avis, il est plus facile d'attacher votre écouteur sur un premier enfant de <body>.

Voir: http://www.quirksmode.org/blog/archives/2010/09/click_event_del.html

31
répondu mddw 2012-04-15 19:57:24

Changez le style du curseur du corps sur iOS en "pointeur" et tout fonctionnera parfaitement. Vous n'aurez pas à ajouter onclick="" sur chaque élément que vous souhaitez cliquable...

<script type="text/javascript">
    $(function() {
        // The trick
        if (/ip(hone|od)|ipad/i.test(navigator.userAgent)) {
           $("body").css ("cursor", "pointer");
        }
        // The test
        $("body").on("click", "#click", function() {
            alert("This also works on iOS !");
        });
    });
</script>
<div id="click">Click here</div>

Je sais ce que vous pensez en ce moment: "WTF!".

26
répondu Boroboro 2012-08-29 13:39:44

Je ne sais pas pourquoi cela ne fonctionne pas, c'est probablement un bug, mais il y a une bonne solution de contournement. Il suffit de mettre onclick="" à la div que vous déléguez et cela fonctionnera parfaitement

<div id="click" onclick="">Click here</div>
<script>
$("body").on("click", "#click", function() {
    alert("This works on iPad");
});
</script>

Violon

12
répondu Martin. 2012-04-15 19:16:51

Sur iOS il n'y a pas d'événement bouillonnant sans un style de curseur.
Donc, dans votre CSS, vous devez ajouter cursor: pointer; à l'élément.

$('body').on('click', '#click', function() {
    alert("This alert won't work on iPad");
});
#click { 
  font-size: 24px; 
  cursor: pointer;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="click">Click here</div>

Je sais qu'il a été demandé il y a longtemps, mais j'ai pensé qu'une solution CSS simple {[6] } pourrait aider.

9
répondu Simon Arnold 2014-11-13 20:57:32

J'ai trouvé une solution sur http://www.danwellman.co.uk/fixing-jquery-click-events-for-the-ipad/

Faites l'approche suivante:

var isIPad = function() {
    return (/ipad/i).test(navigator.userAgent);
};
var isIPhone = function() {
    return (/iphone/i).test(navigator.userAgent);
};
var isIPod = function() {
    return (/ipod/i).test(navigator.userAgent);
};

Et où vous liez le Click-event-handler, faites-le:

var eventName = (isIPod() || isIPad() || isIPhone()) ? "touchstart" : "click";
// if you are using jquery-mobile
eventName = (isIPod() || isIPad() || isIPhone()) ? "touchstart" : "vclick";

$(".selector").bind(eventName, function(e) {
    //do something here
});
// or
$(document).on(eventName, ".selector", function(e) {
    //do something here
});

C'est ça.

3
répondu algorhythm 2013-11-21 08:28:07

Je faisais face à ce problème sur iPhone 5C et ci-dessous.
Cela a fonctionné pour moi:

body {
  cursor:pointer;
}
0
répondu Rakesh Yembaram 2016-02-16 17:31:12

J'ai eu un problème avec un message que j'ajoute au corps html. J'ai trouvé ce problème sur l'événement [jQuery 'click' ne fonctionne pas sur iOS Safari?

J'ai utilisé ceci

$('body').on('click touchstart', 'someselect', function(){})

Et cela a fonctionné sur iPhone 4S et iPhone 5S

0
répondu Cosmin Cojocaru 2017-05-23 12:26:27