включение перетаскивания на мобильном устройстве с сенсорным экраном - PullRequest
15 голосов
/ 09 января 2010

Я только недавно получил телефон Android и обнаружил, что перетаскивание на моем сайте не работает! Я понимаю, почему это не так, но кто-нибудь нашел решение этой проблемы? Я использую JQuery для реализации D & D ...

Ответы [ 6 ]

32 голосов
/ 02 октября 2012

Я использовал jQuery UI touch punch - он работает путем взлома mousedown, функций mouseup и заменяет их touchstart, touchend и т. Д.

О: http://touchpunch.furf.com/

SCRIPT: https://raw.github.com/furf/jquery-ui-touch-punch/master/jquery.ui.touch-punch.min.js

КОД:

включают в себя:

<script src="jquery.ui.touch-punch.min.js"></script>

после вашего файла сценария jquery UI в вашем заголовке.

3 голосов
/ 22 февраля 2014

Я использовал ответ TouchPunch выше, и он работал отлично. Одна заметка об этом, хотя. Я обнаружил, что с помощью ссылки на сайте github (и выше):

СЦЕНАРИЙ: https://raw.github.com/furf/jquery-ui-touch-punch/master/jquery.ui.touch-punch.min.js

не работал на устройствах Android, работающих под управлением мобильного Chrome, но необработанный, читаемый человеком источник с сайта работал Это на дату публикации, конечно, это может быть исправлено, но в то же время, возможно, это сэкономит вам несколько циклов отладки.

2 голосов
/ 24 сентября 2012

Старая тема, я знаю .......

У меня здесь есть решение, которое учитывает любой ввод или другой элемент, который должен реагировать на «щелчки» (например, вводы) на перетаскиваемом элементе. Это решение позволило использовать любую существующую библиотеку перетаскивания, основанную на событиях mousedown, mousemove и mouseup, на любом сенсорном устройстве (или cumputer). Это также кросс-браузерное решение.

Я провел тестирование на нескольких устройствах и работает быстро (в сочетании с функцией перетаскивания в ThreeDubMedia (см. Также http://threedubmedia.com/code/event/drag)).). Это решение jQuery, поэтому вы можете использовать его только с библиотеками jQuery. I для этого использовали jQuery 1.5.1 , поскольку некоторые более новые функции не работают должным образом с IE9 и выше (не тестировалось с более новыми версиями jQuery).

До вы добавляете любую операцию перетаскивания к событию вы должны сначала вызвать эту функцию :

simulateTouchEvents(<object>);

Вы также можете заблокировать все компоненты / дочерние элементы для ввода или для ускорения обработки событий, используя следующий синтаксис:

simulateTouchEvents(<object>, true); // ignore events on childs

Вот код, который я написал. Я использовал несколько хороших трюков для ускорения оценки (см. Код).

function simulateTouchEvents(oo,bIgnoreChilds)
{
 if( !$(oo)[0] )
  { return false; }

 if( !window.__touchTypes )
 {
   window.__touchTypes  = {touchstart:'mousedown',touchmove:'mousemove',touchend:'mouseup'};
   window.__touchInputs = {INPUT:1,TEXTAREA:1,SELECT:1,OPTION:1,'input':1,'textarea':1,'select':1,'option':1};
 }

$(oo).bind('touchstart touchmove touchend', function(ev)
{
    var bSame = (ev.target == this);
    if( bIgnoreChilds && !bSame )
     { return; }

    var b = (!bSame && ev.target.__ajqmeclk), // Get if object is already tested or input type
        e = ev.originalEvent;
    if( b === true || !e.touches || e.touches.length > 1 || !window.__touchTypes[e.type]  )
     { return; } //allow multi-touch gestures to work

    var oEv = ( !bSame && typeof b != 'boolean')?$(ev.target).data('events'):false,
        b = (!bSame)?(ev.target.__ajqmeclk = oEv?(oEv['click'] || oEv['mousedown'] || oEv['mouseup'] || oEv['mousemove']):false ):false;

    if( b || window.__touchInputs[ev.target.tagName] )
     { return; } //allow default clicks to work (and on inputs)

    // https://developer.mozilla.org/en/DOM/event.initMouseEvent for API
    var touch = e.changedTouches[0], newEvent = document.createEvent("MouseEvent");
    newEvent.initMouseEvent(window.__touchTypes[e.type], true, true, window, 1,
            touch.screenX, touch.screenY,
            touch.clientX, touch.clientY, false,
            false, false, false, 0, null);

    touch.target.dispatchEvent(newEvent);
    e.preventDefault();
    ev.stopImmediatePropagation();
    ev.stopPropagation();
    ev.preventDefault();
});
 return true;
}; 

Что он делает: Сначала он преобразует события одного касания в события мыши. Он проверяет, вызвано ли событие элементом в / в элементе, который нужно перетаскивать. Если это элемент ввода, такой как input, textarea и т. Д., Он пропускает перевод, или если к нему прикреплено стандартное событие мыши, он также пропускает перевод.

Результат: Каждый элемент перетаскиваемого элемента все еще работает.

Удачного кодирования, привет, Эрвин Хаантес

1 голос
/ 08 февраля 2010

В iPhone, по крайней мере, есть определенные события, такие как ontouchstart, ontouchend и т. Д. Они являются частью webkit, но в отношении Android гораздо меньше информации, чем iPhone. Я думаю, что ответ на этот вопрос заключается в том, что функция перетаскивания должна использовать эти события, а не события, которые вы обычно используете, или использовать оба.

Эта статья может представлять интерес - http://backtothecode.blogspot.com/2009/10/javascript-touch-and-gesture-events.html

0 голосов
/ 17 января 2012

Я нашел пример, который работает на сенсорном экране моего планшета Android http://www.quirksmode.org/m/tests/drag.html Используется «событие ontouchstart»

0 голосов
/ 21 февраля 2011

Существует плагин jQuery для перетаскивания, поддерживающий мобильные устройства и устройства с сенсорным экраном:

http://plugins.jquery.com/project/mobiledraganddrop

На мобильном устройстве нажмите, чтобы выбрать предмет, и нажмите, чтобы выбрать место для перетаскивания. Это позволяет обойти проблему перетаскивания действий устройством или браузером.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...