Як можна зробити інтерфейс jQuery "draggable ()" перетягування для сенсорного екрана?


112

У мене є інтерфейс jQuery, draggable()який працює в Firefox та Chrome. Концепція користувальницького інтерфейсу в основному клацніть, щоб створити елемент типу "пост-це".

В основному я клацаю або натискаю div#everything(100% високий і широкий), який слухає кліки, і відображається текстова область введення. Ви додаєте текст, а потім, коли закінчите, зберігаєте його. Ви можете перетягнути цей елемент навколо. Це працює у звичайних браузерах, але на iPad, з яким я можу перевірити, я не можу перетягувати елементи. Якщо натиснути, щоб вибрати (він потім трохи тьмяніє), я не можу перетягнути його. Він взагалі не перетягнеться вліво або вправо. Я можу перетягувати вгору або вниз, але я не перетягую особу div, я перетягую всю веб-сторінку.

Ось ось код, який я використовую для отримання кліків:

$('#everything').bind('click', function(e){
    var elem = document.createElement('DIV');
    STATE.top = e.pageY;
    STATE.left = e.pageX;
    var e = $(elem).css({
        top: STATE.top,
        left: STATE.left
    }).html('<textarea></textarea>')
    .addClass('instance')
    .bind('click', function(event){
        return false;
    });
    $(this).append(e);
});

А ось код, який я використовую, щоб "зберегти" замітку і перетворити вхідний розділ лише на дівовий показ:

$('textarea').live('mouseleave', function(){
    var val = jQuery.trim($(this).val());
    STATE.content = val;
    if (val == '') {
        $(this).parent().remove();
    } else {
        var div  = $(this).parent();
        div.text(val).css({
            height: '30px'
        });
        STATE.height = 30;
        if ( div.width() !== div[0].clientWidth || div.height () !== div[0].clientHeight ) {
            while (div.width() !== div[0].clientWidth || div.height () !== div[0].clientHeight) {
                var h = div.height() + 10;
                STATE.height = h;
                div.css({
                    height: (h) + 'px'
                });     // element just got scrollbars
            }
        }
        STATE.guid = uniqueID()
        div.addClass('savedNote').attr('id', STATE.guid).draggable({
            stop: function() {
                var offset = $(this).offset();
                STATE.guid = $(this).attr('id');
                STATE.top = offset.top;
                STATE.left = offset.left;
                STATE.content = $(this).text();
                STATE.height = $(this).height();
                STATE.save();
            }
        });
        STATE.save();
        $(this).remove();
    }
});

І я маю цей код, коли завантажую сторінку для збережених нотаток:

$('.savedNote').draggable({
    stop: function() {
        STATE.guid = $(this).attr('id');
        var offset = $(this).offset();
        STATE.top = offset.top;
        STATE.left = offset.left;
        STATE.content = $(this).text();
        STATE.height = $(this).height();
        STATE.save();
    }
});

Мій STATEоб’єкт обробляє збереження нотаток.

Onload - це все тіло html:

<body> 
    <div id="everything"></div> 
<div class="instance savedNote" id="iddd1b0969-c634-8876-75a9-b274ff87186b" style="top:134px;left:715px;height:30px;">Whatever dude</div> 
<div class="instance savedNote" id="id8a129f06-7d0c-3cb3-9212-0f38a8445700" style="top:131px;left:347px;height:30px;">Appointment 11:45am</div> 
<div class="instance savedNote" id="ide92e3d13-afe8-79d7-bc03-818d4c7a471f" style="top:144px;left:65px;height:80px;">What do you think of a board where you can add writing as much as possible?</div> 
<div class="instance savedNote" id="idef7fe420-4c19-cfec-36b6-272f1e9b5df5" style="top:301px;left:534px;height:30px;">This was submitted</div> 
<div class="instance savedNote" id="id93b3b56f-5e23-1bd1-ddc1-9be41f1efb44" style="top:390px;left:217px;height:30px;">Hello world from iPad.</div> 

</body>

Отже, моє запитання справді: як я можу зробити цю роботу кращою на iPad?

Я не налаштований на користувальницький інтерфейс jQuery, мені цікаво, чи це те, що я роблю неправильно з інтерфейсом jQuery або jQuery, чи можуть бути кращі рамки для того, щоб зробити перетягувані () сумісні між платформою / назад елементи, які будуть робота з інтерфейсами сенсорного екрану.

Більш загальні коментарі щодо того, як написати такі компоненти інтерфейсу, як це було б також бажано.

Дякую!


ОНОВЛЕННЯ: Мені вдалося просто draggable()зав'язати це на мій виклик інтерфейсу jQuery та отримати правильну перетягування на iPad!

.touch({
    animate: false,
    sticky: false,
    dragx: true,
    dragy: true,
    rotate: false,
    resort: true,
    scale: false
});

Плагін JQuery сенсорний зробив трюк!


1
Мені цікаво щось: чи можна перетягувати діву навколо двох-трьох пальців? Я знаю, що вам іноді доводиться використовувати кілька пальців, щоб прокручувати вбудований вміст у мобільному Safari, тому це може бути те ж саме для "перетягуваного" вмісту.
Вальтер Мундт

Вальтер Мундт дякую! Я не пробував жодних варіацій пальців, я спробую, коли отримаю його в руки!
artlung

1
два-три пальці насправді заважали «цілій сторінці» ненавмисно прокручуватися, але зміни для перетягування не змінювались.
artlung

На жаль, ця техніка, здається, не спрацювала для мене. :(
бластер

@blaster Вам потрібно буде переглянути деякі інші відповіді на інші можливі рішення
artlung

Відповіді:


138

Затративши багато годин, я натрапив на це!

jquery-ui-touch-punch

Він перекладає події крана як події клацання. Не забудьте завантажити сценарій після jquery.

У мене це працює на iPad та iPhone

$('#movable').draggable({containment: "parent"});

2
Це рішення чудово працює, ще одна відповідь, яку я втомився, була баггі і справді не допомогла
musefan

Невелика підказка: чудово працює, хоча якщо перетягується елемент, покритий шарами, як зображення з маскою над ним, жодне перетягування не активоване, але рішенням буде додавання покажчика-події: немає; на верхніх шарах.
Адлер

Це чудове і просте рішення, ви просто використовуєте плагін і продовжуєте працювати з функцією перетягування JQuery. Ідеально, дякую!
майже початківець

Це запобіжить можливість натискання елементів, які можна натиснути в межах перетягування
Абдул Садік

61

Застереження: Ця відповідь була написана в 2010 році, і технології швидко рухаються. Більш недавнє рішення див. У відповіді @ ctrl-alt-dileep нижче .


Залежно від ваших потреб, ви можете спробувати сенсорний плагін jQuery ; ви можете спробувати приклад тут . Це добре працює, щоб перетягнути мій iPhone, тоді як jQuery UI Draggable - ні.

Крім того, ви можете спробувати цей плагін, хоча це може зажадати від вас фактично записати власну функцію перетягування.

Як сторонне позначення: вірите чи ні, ми чуємо, що ми все більше чуємо про те, як сенсорні пристрої, такі як iPad та iPhone, спричиняють проблеми як для веб-сайтів, які використовують: наведення курсора / функції перемикання та вміст, що перетягується.

Якщо вас цікавить основне рішення для цього, це використовувати три нові події JavaScript; ontouchstart, ontouchmove і ontouchend. Apple фактично написала статтю про їх використання, яку ви можете знайти тут . Спрощений приклад можна знайти тут . Ці події використовуються в обох плагінах, до яких я пов’язаний.


2
Супер приємно! Все, що я повинен був зробити, це зав'язати ланцюг на .touch({ animate: false, sticky: false, dragx: true, dragy: true, rotate: false, resort: true, scale: false });мій існуючий draggable()дзвінок, і це спрацює! Мені все одно доводиться відпрацьовувати всі події, з якими я хочу розібратися, щоб отримати правильний робочий процес, але сенсорний плагін jQuery зробив свою справу!
artlung

4
плагін, здається, більше не доступний на jquery.com. ви все ще можете знайти javascript тут manifestinteractive.com/iphone/touch/js/jquery.touch.js
bjelli

1
Гей, тепер плагін відсутній і на manifestinteractive.com. Спробуйте це: plugins.jquery.com/files/jquery.touch.js.txt
Ян Хантер

5
ця відповідь більше не є дійсною. див. відповідь @ ctrl-alt-dileep нижче (jquery-ui-touch-punch) для відповіді 2012 року
bjelli

1
@bjelli Дякуємо, що вказали на це. Я оновив свою відповідь попередженням. :)
фонконрад

24

Цей проект повинен бути корисним - карта торкається подій, щоб натискати події таким чином, що дозволяє інтерфейсу jQuery працювати на iPad та iPhone без будь-яких змін. Просто додайте JS до будь-якого існуючого проекту.

http://code.google.com/p/jquery-ui-for-ipad-and-iphone/


7

jQuery ui 1.9 піклується про це за вас. Ось демонстрація попереднього:

https://dl.dropbox.com/u/3872624/lab/touch/index.html

Просто схопіть jquery.mouse.ui.js, вставіть його під файл завантаження, який ви завантажуєте, і це все, що вам потрібно зробити! Працює і для сортування.

Цей код для мене чудово працює, але якщо ви отримуєте помилки, оновлену версію jquery.mouse.ui.js можна знайти тут:

Сортироване Jquery-ui не працює на сенсорних пристроях на базі Android або IOS


3
Це чудово, що вони мають справу з цим 1.9. FWIW, я знайшов версію коду в тій демонстрації, але в ньому були помилки і не так добре. Хтось опублікував правильнішу версію цього питання: stackoverflow.com/questions/6745098/…, яка для мене працює краще.
asgeo1

Я оновив свою відповідь, щоб вирішити це. Я ще не отримав жодних помилок у своїй справі використання з оригіналом.
середній шлях

1
Посилання Dropbox перервано.
BerggreenDK


2

Я вчора боровся з подібною проблемою. У мене вже було "робоче" рішення з використанням перетягуваного інтерфейсу jQuery UI разом із jQuery Touch Punch, які згадуються в інших відповідях. Однак використання цього методу спричиняло дивні помилки на деяких пристроях Android для мене, і тому я вирішив написати невеликий плагін jQuery, який може зробити HTML-елементи перетягуючими за допомогою сенсорних подій, а не методом, який імітує фальшиві події миші.

Результатом цього є jQuery Draggable Touch, який є простим плагіном jQuery для створення елементів, що перетягуються, і має сенсорні пристрої як основну ціль за допомогою сенсорних подій (наприклад, touchstart, touchmove, touchend тощо). У ньому все ще є резервна копія, яка використовує події миші, якщо браузер / пристрій не підтримує сенсорні події.


Привіт Гейман, це гарна робота. Дякуємо, що поділилися цим. Чи буде це працювати і для зміни jQuery?
Харіс

1

Ви можете спробувати скористатися jquery.pep.js :

jquery.pep.js - це легкий плагін jQuery, який перетворює будь-який елемент DOM у об'єкт, що перетягується. Він працює в усіх браузерах - від старих до нових, від натискання до клацання. Я створив його для задоволення потреби, у якій перетягування інтерфейсу jQuery UI не виконується, оскільки він не працює на сенсорних пристроях (без деяких хакерів).

Веб-сайт , посилання GitHub


1
Дякую @martynas, я перевірю це!
artlung
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.