Panzoom: Zoom par pincement cassé dans Chrome v55.02883.91 sur mobile

Créé le 12 déc. 2016  ·  20Commentaires  ·  Source: timmywil/panzoom

Objet du problème

Zoom de pincement cassé dans Chrome v55.02883.91 sur Mobile et Android System WebView v55.02883.91
Cela s'applique aux appareils mobiles Android utilisant Chrome (navigateur) et les applications Cordova utilisant Android System WebView.

Votre environnement

  • jquery.panzoom.min.js 3.2.2
  • jquery-1.11.1.min.js (pour mes applications cordova), mais le site Web de démonstration ne fonctionne pas non plus.
  • Chrome cassé (voir version ci-dessus). Fonctionne toujours en utilisant "Internet" comme navigateur sur les téléphones Samsung.

Étapes à reproduire

  1. Procurez-vous un samsung galaxy S6 Edge + (ou équivalent)
  2. Mettez à niveau Chrome et/ou Android System WebView vers v55, etc.
  3. Charger dans la page de démonstration
  4. essayez de zoomer sur le tigre - elle a brisé son compagnon !

Comportement attendu

Sur la version précédente de Chrome (jusqu'à la v54, fonctionnait parfaitement, c'est-à-dire zoomé !

Comportement réel

Ce qui se passe sur la v55, c'est tout ce que vous obtenez, c'est le panoramique, pas le zoom et l'image panoramique "saute" parfois entre les doigts pincés et crée un effet clignotant lorsque l'image est retournée entre vos deux doigts.

Commentaire le plus utile

J'ai fait un hack rapide dans le code et commenté la ligne 1164 :

this.panning = true;
autorise à nouveau le zoom par pincement pour moi (et n'affecte pas le panoramique). Je ne vois pas où this.panning est défini sur false, sauf lors de l'initialisation ... YMMV.

Tous les 20 commentaires

Merci d'avoir signalé ce problème. En un instant, mon application a cessé de fonctionner sur le zoom et je ne sais pas pourquoi.

Mon application est tombée en panne aussi. Comportement étrange sur le chrome nouvellement mis à jour (les événements de glissement semblent faire défiler la fenêtre et les événements de pincement sont... bizarres). Un autre appareil avec du chrome non mis à jour fonctionne bien. Chrome mis à jour hier soir et il s'est cassé aussi.

Merci d'avoir ouvert ce problème.
Mon application cesse de fonctionner également sur le bureau Chrome pour cette raison.

Solution - ajouter
touch-action: none;
au css de votre conteneur panzoom et le navigateur n'effectuera pas ses propres événements tactiles pour ce composant.

C'est une nouveauté : https://developers.google.com/web/updates/2016/10/pointer-events

Solution - ajouter
action tactile : aucune ;
au css de votre conteneur panzoom et le navigateur n'effectuera pas ses propres événements tactiles pour ce composant.

C'est une nouveauté : https://developers.google.com/web/updates/2016/10/pointer-events

Ca ne fonctionne pas.

J'ai fait un hack rapide dans le code et commenté la ligne 1164 :

this.panning = true;
autorise à nouveau le zoom par pincement pour moi (et n'affecte pas le panoramique). Je ne vois pas où this.panning est défini sur false, sauf lors de l'initialisation ... YMMV.

J'ai fait un hack rapide dans le code et commenté la ligne 1164 :
this.panning = vrai;
autorise à nouveau le zoom par pincement pour moi (et n'affecte pas le panoramique). Je ne vois pas où this.panning est défini sur false, sauf lors de l'initialisation ... YMMV.

Merci, ça marche pour moi !

J'ai fait un hack rapide dans le code et commenté la ligne 1164 :
this.panning = vrai;

Womp ça y est.....

Ce « hack » fait l'affaire ! Fonctionne maintenant sur android 55

Re-testé sur iOS 10.2, Android 53 - fonctionne toujours comme avant !

Merci vrtual !

J'ai fait un hack rapide dans le code et commenté la ligne 1164 :
this.panning = vrai;
autorise à nouveau le zoom par pincement pour moi (et n'affecte pas le panoramique). Je ne peux pas voir où this.panning est défini sur > false, sauf lors de l'initialisation... YMMV.

Fonctionne bien pour moi... merci mec
Je fais ma propre fonction de zoom, mais cela me sauve pour l'instant... merci

Testé sur android google webview 2016 mise à jour du 14 décembre...

J'ai fait un hack rapide dans le code et commenté la ligne 1164 :
this.panning = vrai;

Cela fonctionne partiellement. Merci!

J'ai partiellement réussi à commenter cette ligne, elle zoome maintenant en haut à gauche au lieu de l'emplacement de l'interaction, mais c'est une énorme amélioration.

Il semble que le dernier chrome a changé là où la référence pageX et pageY se trouve dans l'événement.
Jusqu'à ce changement de chrome, tous les navigateurs l'avaient dans event.pageX....
Maintenant, il se trouve dans event.originalEvent.pageX...

Je suis en train de parcourir le code Panzoom. Pour le faire fonctionner sur Chrome à l'aide d'événements de souris, modifiez ces lignes :
ligne 1191:1192
Changer de:
startPageX = event.pageX; startPageY = event.pageY;
à:
if (typeof event.pageX === 'undefined'){ startPageX = event.originalEvent.pageX; startPageY = event.originalEvent.pageY; }else{ startPageX = event.pageX; startPageY = event.pageY; }
à la ligne 1232 ajouter :
if (typeof coords.pageX === 'undefined'){ coords['pageX'] = coords.originalEvent.pageX; coords['pageY'] = coords.originalEvent.pageY; }

Plus à venir pour les événements tactiles au fur et à mesure que je les traverse.

Commenter "this.panning = true;" le corrige, mais ce n'est plus aussi fluide et sur les appareils plus anciens, le zoom devient assez lent. Je suppose que le commenter utilise beaucoup plus de puissance CPU et donc les appareils plus anciens ne peuvent pas suivre.

Avez-vous essayé de mettre à jour vers la nouvelle version (3.2.2) et commentez la ligne donnée ?

Je peux confirmer que ce bug existe toujours (et que le correctif fonctionne) dans la v3.2.2 et Chrome 56.

Je ne suis pas sûr à 100%, mais voici ce que je pense être le problème :
Cette variable ( this.panning ) semble avoir pour but d'empêcher le déclenchement simultané de plusieurs instances de la fonction _startMove . Il est censé être réinitialisé à false lors de l'événement endEvent (ligne 1249), mais je suppose que cela ne fonctionne pas correctement (je n'ai pas approfondi assez pour savoir pourquoi). C'est peut-être la raison pour laquelle ThorConzales a découvert que le correctif réduisait les performances.

Solution alternative : j'ai découvert que l'ajout de this.panning = false; à la fin de la fonction _startMove (après la ligne 1255) résout également ce problème. Je n'ai pas testé sur des appareils plus anciens, donc je ne peux pas confirmer si cela aide à la perte de performances, mais si quelqu'un d'autre pouvait, je l'apprécierais.

merci @JamesCatt va essayer votre alternative.

@timmywil !?

@JamesCatt, le correctif alternatif n'a pas fonctionné pour moi et le zoom a de nouveau été interrompu (rapporté par un utilisateur car je n'ai pas d'appareil pour me tester).

La ligne de commentaire 1164 (this.panning = true) ne fonctionne pas pour moi. J'ai triché à la ligne 1143 qui change moveEvent = 'pointermove' tomoveEvent = 'touchmove', alors cela fonctionne, je ne sais pas si cela causera d'autres problèmes.

J'ai trouvé un hack résolvant ce problème.

Nous devrions définir options.which à -1 lors de l'initialisation.

$("a.panzoom-elements").panzoom({
  which: -1,
});

__AVERTISSEMENT__
Ce hack ne fonctionne que pour un appareil tactile. Peut-être que cela ne fonctionne pas pour une souris.

L'alternative de @JamesCatt n'a pas fonctionné pour moi. Le hack de @hshiozawa fonctionne, au moins sur un Pixel, sous Android 7.1.2

Cette page vous a été utile?
0 / 5 - 0 notes