Javascript перетаскивание для сенсорных устройств [закрыто]
Я ищу плагин drag & DROP, который работает на сенсорных устройствах.
Я хотел бы аналогичную функциональность jQuery UI plugin что позволяет "сбрасывать" элементы.
The плагин jqtouch поддерживает перетаскивание, но не падает.
здесь это перетаскивание, которое поддерживает только iPhone / iPad.
может ли кто-нибудь указать мне в направлении плагина drag & drop, который работает на android/ios?
...Или можно было бы обновить плагин jqtouch для droppability, он уже работает на Andriod и IOS.
спасибо!
5 ответов:
вы можете с помощью пользовательского интерфейса jQuery для перетаскивания с дополнительной библиотеки, которая переводит события мыши на контакт, который является то, что вам нужно, я рекомендую https://github.com/furf/jquery-ui-touch-punch при этом ваше перетаскивание из пользовательского интерфейса jQuery должен работать на сенсорных устройствах
или вы можете использовать этот код, который я использую, он также преобразует события мыши в аут, а он работает как по волшебству.
function touchHandler(event) { var touch = event.changedTouches[0]; var simulatedEvent = document.createEvent("MouseEvent"); simulatedEvent.initMouseEvent({ touchstart: "mousedown", touchmove: "mousemove", touchend: "mouseup" }[event.type], true, true, window, 1, touch.screenX, touch.screenY, touch.clientX, touch.clientY, false, false, false, false, 0, null); touch.target.dispatchEvent(simulatedEvent); event.preventDefault(); } function init() { document.addEventListener("touchstart", touchHandler, true); document.addEventListener("touchmove", touchHandler, true); document.addEventListener("touchend", touchHandler, true); document.addEventListener("touchcancel", touchHandler, true); }и в вашем документе.готов просто вызвать функцию init ()
код найден от здесь
для тех, кто хочет использовать это и сохранить функциональность "щелчок" (как Джон Ландхеер упоминает в своем комментарии), Вы можете сделать это с помощью всего лишь нескольких модификаций:
добавить пару глобалов:
var clickms = 100; var lastTouchDown = -1;затем измените оператор switch от оригинала на этот:
var d = new Date(); switch(event.type) { case "touchstart": type = "mousedown"; lastTouchDown = d.getTime(); break; case "touchmove": type="mousemove"; lastTouchDown = -1; break; case "touchend": if(lastTouchDown > -1 && (d.getTime() - lastTouchDown) < clickms){lastTouchDown = -1; type="click"; break;} type="mouseup"; break; default: return; }вы можете настроить "clickms" на свой вкус. В основном это просто наблюдение за "touchstart", за которым быстро следует "touchend", чтобы имитировать щелчок.
Спасибо за вышеуказанные коды! - Я попробовал несколько вариантов, и это был билет. У меня были проблемы в том, что preventDefault предотвращал прокрутку на ipad - теперь я тестирую перетаскиваемые элементы, и до сих пор он отлично работает.
if (event.target.id == 'draggable_item' ) { event.preventDefault(); }
У меня было то же решение, что и ответ gregpress, но мои перетаскиваемые элементы использовать класс вместо идентификатора. Кажется, это работает.
var $target = $(event.target); if( $target.hasClass('draggable') ) { event.preventDefault(); }
старый поток я знаю.......
проблема с ответом @ryuutatsuo заключается в том, что он блокирует также любой вход или другой элемент, который должен реагировать на "клики" (например, входы), поэтому я написал это решение. Это решение позволило использовать любую существующую библиотеку перетаскивания, которая основана на событиях mousedown, mousemove и mouseup на любом сенсорном устройстве (или cumputer). Это также кросс-браузерное решение.
я протестировал на нескольких устройствах, и он работает быстро (в сочетании с функцией перетаскивания из ThreeDubMedia (см. Также http://threedubmedia.com/code/event/drag)). Это решение на jQuery, так что вы можете использовать его только с помощью jQuery библиотеки. Я использовал 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 и т. д., он пропускает перевод, или если к нему прикреплено стандартное событие мыши, он также пропустит перевод.
результат: Каждый элемент на перетаскиваемом элементе все еще работает.
счастливого кодирования, greetz, Эрвин Haantjes
Comments