Glisser-déposer HTML sur les appareils mobiles

89

Lorsque vous ajoutez un glisser-déposer à une page Web à l'aide de JavaScript, comme jQuery UI draggable and droppable, comment le faire fonctionner lorsqu'il est affiché via un navigateur sur un appareil mobile - où les actions de l'écran tactile pour le glisser sont interceptées par le téléphone pour faire défiler la page, etc.?

Toutes les solutions sont les bienvenues ... mes premières réflexions sont:

  1. Avoir un bouton pour les appareils mobiles qui "soulève" l'élément à faire glisser, puis les amener à cliquer sur la zone sur laquelle ils souhaitent déposer l'élément.

  2. Écrivez une application qui le fait pour les appareils mobiles plutôt que d'essayer de faire fonctionner la page Web sur eux!

  3. Vos suggestions et commentaires s'il vous plaît.

Fenton
la source
Quels appareils ciblez-vous?
Marko
22
@Marko - tous. Ce n'est pas le Web si j'exclus quelqu'un.
Fenton
Si vous ne voulez pas du tout de jQuery, jetez un œil à ce github.com/capriza/mobile-touch
oriharel

Réponses:

101

jQuery UI Touch Punch résout tout cela.

C'est une prise en charge des événements tactiles pour l'interface utilisateur jQuery. Fondamentalement, il ne fait que renvoyer l'événement tactile à l'interface utilisateur jQuery. Testé sur iPad, iPhone, Android et autres appareils mobiles tactiles. J'ai utilisé jQuery UI triable et cela fonctionne comme un charme.

http://touchpunch.furf.com/

vichsu
la source
4
Ne fonctionne pas sur le navigateur Android 4.0 d'origine. Cela fonctionne cependant sur Chrome mobile.
Timmmm
Avons-nous une longue pression avant de faire glisser? parce que lorsque nous avons utilisé la pleine largeur dans l'élément qui peut faire glisser, nous voulons faire défiler vers le bas, il fait automatiquement glisser l'élément
CaffeineShots
1
assurez-vous de faire votre dernière déclaration <script> dans la tête de votre fichier html, en particulier jquery-ui,
sinon
@vichsu Merci beaucoup pour cette réponse, qui a parfaitement résolu mon problème.
Brady Zhu
ne fonctionne vraiment pas sous Android 4.0 .. ou y a-t-il des solutions?
rashidnk
23

Il existe un nouveau polyfill pour traduire les événements tactiles en glisser-déposer, de sorte que le glisser-déposer HTML5 est utilisable sur mobile.

Le polyfill a été présenté par Bernardo Castilho sur ce post .

Voici une démo de ce post.

Le message présente également plusieurs considérations sur la conception du folyfill.

remdevtec
la source
7

La version bêta de Sencha Touch prend en charge le glisser-déposer.

Vous pouvez vous référer à leur exemple DnD . Cela ne fonctionne que sur les navigateurs Webkit d'ailleurs.

La modernisation de cette logique dans une page Web sera probablement difficile. Si je comprends bien, ils désactivent tous les panoramiques du navigateur et implémentent les événements de panoramique entièrement en javascript, permettant une interprétation correcte du glisser-déposer.

Mise à jour: le lien d'exemple d'origine est mort, mais j'ai trouvé cette alternative:
https://github.com/kostysh/Drag-Drop-example-for-Sencha-Touch

Joeri Sebrechts
la source
C'est très intéressant, donc je vais le télécharger et avoir un jeu - testé sur Android et cela fonctionne principalement, il suffit donc de regarder les détails - merci!
Fenton
6
D'accord, je n'utiliserai probablement pas cette bibliothèque en particulier (avec plus de 200k lorsqu'elle est minifiée), mais je peux utiliser les concepts qu'elle contient pour obtenir le genre d'idée. L'idée générale est que votre page ne peut pas être interprétée comme plus grande que la taille de l'écran, ce qui trompe le navigateur mobile en lui faisant ne pas intercepter les glissements / glissements!
Fenton
1
Sohnee, nous ajoutons un constructeur pour Touch 1.0 qui supprime les parties inutilisées de la bibliothèque, cela réduira considérablement l'encombrement. De plus, gzippée, la bibliothèque complète est de 50 à 80 Ko.
Michael Mullany
7

J'avais besoin de créer un glisser-déposer + rotation qui fonctionne sur le bureau, le mobile, la tablette, y compris le téléphone Windows. Le dernier a rendu les choses plus compliquées (mspointer vs événements tactiles).

La solution est venue de la grande bibliothèque Greensock

Il a fallu quelques sauts à travers des cerceaux pour rendre le même objet traînable et rotatif mais cela fonctionne parfaitement

Tomer Almog
la source
Type de licence? Libre? J'ai vérifié le site, mais il semble qu'ils vendent la bibliothèque.
ShanerM13
Cela fait 6 ans que j'ai répondu à cela. Je ne sais pas s'ils ont changé leur type de licence. C'était gratuit en 2014 ...
Tomer Almog
IDK comment j'ai négligé cela, mais greensock.com/licensing
ShanerM13
Fondamentalement, c'est gratuit à condition que votre produit soit gratuit (à l'exception du fait qu'ils permettent des frais uniques), sinon, vous devez obtenir une licence commerciale avec eux.
ShanerM13 le
3

Vous pourriez aussi bien essayer le polyfill glisser-déposer de Tim Ruffle , certainement similaire à celui de Bernardo Castilho (voir la réponse @remdevtec).

Faites simplement npm install mobile-drag-drop --save(autres méthodes d'installation disponibles, par exemple avec bower)

Ensuite, toute interface d'élément reposant sur la détection tactile devrait fonctionner sur mobile (par exemple en faisant glisser uniquement un élément, au lieu de faire défiler + faire glisser en même temps).

Frosty Z
la source
1

Jquery Touch Punch est génial, mais ce qu'il fait également est de désactiver tous les contrôles sur le div déplaçable afin d'éviter cela, vous devez modifier les lignes ... (au moment de l'écriture - ligne 75)

changement

if (touchHandled || !self._mouseCapture(event.originalEvent.changedTouches[0])){

lire

if (touchHandled || !self._mouseCapture(event.originalEvent.changedTouches[0]) || event.originalEvent.target.localName === 'textarea'
        || event.originalEvent.target.localName === 'input' || event.originalEvent.target.localName === 'button' || event.originalEvent.target.localName === 'li'
        || event.originalEvent.target.localName === 'a'
        || event.originalEvent.target.localName === 'select' || event.originalEvent.target.localName === 'img') {

ajoutez autant de ors que vous le souhaitez pour chacun des éléments que vous souhaitez `` déverrouiller ''

J'espère que ça aide quelqu'un

faneur
la source
Cela m'a vraiment aidé, merci. Je créais une liste de contrôle triable et la case à cocher ne cliquait pas car le div créé par touch-punch couvrait la case à cocher. Cela l'a résolu et cela a fonctionné. merci ....
Mikeys4u
1

voici ma solution:

$(el).on('touchstart', function(e) {
    var link = $(e.target.parentNode).closest('a')  
    if(link.length > 0) {
        window.location.href = link.attr('href');
    }
});
Alper Aydingül
la source
1

La bibliothèque JS triable est compatible avec les écrans tactiles et ne nécessite pas jQuery.

La façon dont il gère les écrans tactiles nécessite de toucher l'écran pendant environ 1 seconde pour commencer à faire glisser un élément.

En outre, ils présentent un test vidéo montrant que cette bibliothèque s'exécute plus rapidement que JQuery UI Sortable.

Zoup
la source