jQuery UI Сортируемый - Div не перетаскивается, когда страница прокручивается
Заранее спасибо, что взглянули на мой вопрос.
Я создаю веб-сайт, где у меня есть список элементов div, которые можно отсортировать по оси Y с использованием сортируемого пользовательского интерфейса jQuery.
Поскольку я хочу, чтобы это работало на мобильных устройствах с использованием сенсорного ввода, мне пришлось добавить небольшой хак, чтобы убедиться, что пользовательский интерфейс jQuery можно использовать (поскольку в настоящее время он не поддерживает сенсорные события).
Взлом называется JQuery UI Touch Punch.
Сайт: jQuery UI Touch Punch.
GitHub: JQuery UI сенсорный удар.
Теперь приходит моя проблема. Иногда список становится настолько большим, что веб-сайт становится прокручиваемым, и когда сайт прокручивается, я не могу правильно перетаскивать элементы, поскольку, когда я пытаюсь перетащить div, он просто прокручивает страницу. Единственный способ, которым я могу перетащить его, это когда я дважды коснусь элемента, а затем перетащу его.
Но это действительно не то, что я хочу, так как это очень утомительно и неестественно.
Вопрос теперь в том, есть ли способ отключить прокрутку при попытке перетащить один из элементов из перетаскиваемого набора. Я пытался добавить overflow-y: hidden
на кран или добавление touch-action : none
, К сожалению, это не сработало.
РЕЗЮМЕ
Что у меня есть: в настоящее время я могу перетаскивать и сортировать список Divs с помощью сенсорного устройства, используя сенсорный удар jQuery UI и jquery UI.
Проблема: список становится настолько большим, что сайт можно прокручивать, что отключает перетаскивание одним касанием, которое мне нужно дважды нажать, чтобы перетащить элемент.
Что я хочу: я хочу иметь возможность перетаскивать элементы (без двойного нажатия), даже когда у меня есть полоса прокрутки.
Как я могу понять такое поведение / с чего мне начать? Любые советы и решения приветствуются.
И последнее, но не менее важное, вот моя скрипка.
РЕДАКТИРОВАТЬ:
Я использую:
IE 11
JQuery версия 1.11.1
jQuery-ui версия 1.11.4
2 ответа
Попробуйте заменить (рекомендуется) библиотеку Touch Punch (или в дополнение к ней) на следующий фрагмент JS и вызов init()
функция на $(document).ready();
:
- Обратите внимание, что вы можете комментировать стили
#wrapper
они были установлены только для тестирования переполнения. - В идеале вы должны оставить некоторое пространство вне перетаскиваемых объектов, чтобы прокручивать их без нежелательного перетаскивания.
Фрагмент ниже:
$(document).ready(function() {
init();
$("#myContainer").sortable({
//your code
})
});
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);
}
---> Скрипка с фрагментом, заменяющим сенсорный удар <---
---> Скрипка с фрагментом + сенсорный удар <---
(Оба протестированы в мобильном Safari и Chrome, перетаскивание достигается при первом нажатии)
Попробуйте добавить эти строки в файл js библиотеки Touch Punch.
function simulateMouseEvent(event, simulatedType) {
// Ignore multi-touch events
> if (event.originalEvent.touches.length > 1) {
> return;
> }
>
> var touch = event.originalEvent.changedTouches[0],
> simulatedEvent = document.createEvent('MouseEvents');
>
> if ($(touch.target).is("select")) {
> event.stopPropagation();
> } else {
> event.preventDefault();
> }
`
Включите вышеуказанные строки.