Làm cách nào để tạo giao diện người dùng jQuery 'draggable ()' div có thể kéo được cho màn hình cảm ứng?


112

Tôi có giao diện người dùng jQuery draggable()hoạt động trên Firefox và Chrome. Khái niệm giao diện người dùng về cơ bản là nhấp chuột để tạo một mục loại "post-it".

Về cơ bản, tôi nhấp hoặc nhấn vào div#everything(100% cao và rộng) lắng nghe các nhấp chuột và vùng văn bản đầu vào hiển thị. Bạn thêm văn bản và sau đó khi bạn hoàn tất, nó sẽ lưu nó. Bạn có thể kéo phần tử này xung quanh. Điều đó đang hoạt động trên các trình duyệt bình thường, nhưng trên iPad mà tôi có thể kiểm tra, tôi không thể kéo các mục xung quanh. Nếu tôi chạm để chọn (sau đó nó hơi mờ đi), thì tôi không thể kéo nó. Nó sẽ không kéo sang trái hoặc phải chút nào. Tôi có thể kéo lên hoặc xuống, nhưng tôi không kéo từng cá nhân div, tôi đang kéo toàn bộ trang web.

Vì vậy, đây là mã tôi sử dụng để nắm bắt các nhấp chuột:

$('#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);
});

Và đây là mã tôi sử dụng để "lưu" ghi chú và biến div đầu vào chỉ thành div hiển thị:

$('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();
    }
});

Và tôi có mã này khi tải trang cho các ghi chú đã lưu:

$('.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Đối tượng của tôi xử lý việc lưu các ghi chú.

Onload, đây là toàn bộ nội dung 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>

Vì vậy, câu hỏi của tôi thực sự là: làm thế nào tôi có thể làm cho điều này hoạt động tốt hơn trên iPad?

Tôi không sử dụng giao diện người dùng jQuery, tôi tự hỏi liệu đây có phải là điều tôi đang làm sai với giao diện người dùng jQuery hoặc jQuery hay không, hoặc liệu có thể có các khuôn khổ tốt hơn để thực hiện các phần tử draggable () tương thích ngược / đa nền tảng sẽ hoạt động cho giao diện người dùng màn hình cảm ứng.

Các nhận xét chung về cách viết các thành phần giao diện người dùng như thế này cũng sẽ được hoan nghênh.

Cảm ơn!


CẬP NHẬT: Tôi đã có thể đơn giản chuỗi điều này vào draggable()lệnh gọi giao diện người dùng jQuery của mình và có được khả năng kéo chính xác trên iPad!

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

Các plugin jQuery cảm ứng đã làm các trick!


1
Tôi tò mò về điều gì đó: bạn có thể kéo div xung quanh bằng hai hoặc ba ngón tay không? Tôi biết rằng đôi khi bạn phải sử dụng nhiều ngón tay để cuộn nội dung được nhúng trong Safari dành cho thiết bị di động, vì vậy nó có thể giống nhau đối với nội dung "có thể kéo".
Walter Mundt

Walter Mundt cảm ơn! Tôi chưa thử bất kỳ biến thể nào của ngón tay, tôi sẽ thử khi tôi có nó trong tay!
artlung

1
hai hoặc ba ngón tay thực sự đã ngăn không cho "toàn bộ trang" vô tình cuộn, nhưng không tạo ra thay đổi gì cho trình kéo.
artlung

Thật không may, kỹ thuật này dường như không hiệu quả với tôi. :(
blaster

@blaster Bạn sẽ cần phải nhìn vào một số trong những câu trả lời khác cho giải pháp khả thi khác
artlung

Câu trả lời:


138

Sau khi lãng phí nhiều giờ, tôi đã bắt gặp điều này!

jquery-ui-touch-punch

Nó dịch các sự kiện nhấn thành các sự kiện nhấp chuột. Hãy nhớ tải tập lệnh sau khi jquery.

Tôi đã làm việc này trên iPad và iPhone

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

2
Giải pháp này hoạt động tuyệt vời, một câu trả lời khác mà tôi mệt mỏi là có lỗi và thực sự không giúp ích được gì
Shuifan

Một mẹo nhỏ: hoạt động tuyệt vời, mặc dù nếu phần tử có thể kéo được bao phủ bởi các lớp như hình ảnh có mặt nạ ở trên nó thì không có thao tác kéo nào được kích hoạt nhưng giải pháp sẽ là thêm con trỏ-sự kiện: không có; trên các lớp trên cùng.
Adler

Đây là một giải pháp tuyệt vời và đơn giản, bạn chỉ cần sử dụng plugin và tiếp tục làm việc với chức năng có thể kéo của JQuery. Hoàn hảo, cảm ơn!
gần như là một người mới bắt đầu

Điều này sẽ ngăn các mục có thể nhấp vào trong có thể kéo.
Abdul Sadik Yalcin

61

Thận trọng: Câu trả lời này được viết vào năm 2010 và công nghệ phát triển rất nhanh. Để có giải pháp mới hơn, hãy xem câu trả lời của @ ctrl-alt-dileep bên dưới .


Tùy thuộc vào nhu cầu của bạn, bạn có thể muốn thử plugin jQuery touch ; bạn có thể thử một ví dụ ở đây . Nó hoạt động tốt khi kéo trên iPhone của tôi, trong khi jQuery UI Draggable thì không.

Ngoài ra, bạn có thể thử plugin này , mặc dù điều đó có thể yêu cầu bạn thực sự viết hàm có thể kéo của riêng mình.

Như một chú thích bên lề: Tin hay không thì tùy, chúng tôi đang nghe thấy ngày càng nhiều người bàn tán về việc các thiết bị cảm ứng như iPad và iPhone đang gây ra sự cố cho cả các trang web sử dụng: chức năng di chuột / onmouseover và nội dung có thể kéo.

Nếu bạn quan tâm đến giải pháp cơ bản cho việc này, đó là sử dụng ba sự kiện JavaScript mới; ontouchstart, ontouchmove và ontouchend. Apple thực sự đã viết một bài báo về việc sử dụng chúng, bạn có thể tìm thấy ở đây . Một ví dụ đơn giản có thể được tìm thấy ở đây . Các sự kiện này được sử dụng trong cả hai plugin mà tôi đã liên kết.


2
Siêu tuyệt vời! Tất cả những gì tôi phải làm là tiếp .touch({ animate: false, sticky: false, dragx: true, dragy: true, rotate: false, resort: true, scale: false });tục draggable()cuộc gọi hiện có của mình và nó có hiệu quả! Tôi vẫn phải giải quyết tất cả các sự kiện mà tôi muốn giải quyết để quy trình làm việc phù hợp, nhưng plugin jQuery touch đã làm được điều đó!
artlung

4
plugin dường như không còn khả dụng trên jquery.com nữa. bạn vẫn có thể tìm thấy javascript tại đây manifestestinteractive.com/iphone/touch/js/jquery.touch.js
bjelli

1
Heh, bây giờ plugin cũng bị thiếu trên Maniestinteractive.com. Hãy thử cái này: plugins.jquery.com/files/jquery.touch.js.txt
Ian Hunter

5
câu trả lời này không còn hợp lệ. xem câu trả lời của @ ctrl-alt-dileep bên dưới (jquery-ui-touch-punch) để biết câu trả lời năm 2012
bjelli

1
@bjelli Cảm ơn bạn đã chỉ ra điều này. Tôi đã cập nhật câu trả lời của mình với một cảnh báo. :)
vonconrad

24

Dự án này sẽ hữu ích - lập bản đồ chạm vào các sự kiện để nhấp vào các sự kiện theo cách cho phép giao diện người dùng jQuery hoạt động trên iPad và iPhone mà không có bất kỳ thay đổi nào. Chỉ cần thêm JS vào bất kỳ dự án hiện có nào.

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


7

jQuery ui 1.9 sẽ giải quyết vấn đề này cho bạn. Đây là bản demo của pre:

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

Chỉ cần lấy jquery.mouse.ui.js ra, dán nó vào bên dưới tệp jQuery ui bạn đang tải và đó là tất cả những gì bạn phải làm! Hoạt động tốt để phân loại.

Mã này hoạt động tốt đối với tôi, nhưng nếu bạn gặp lỗi, bạn có thể tìm thấy phiên bản cập nhật của jquery.mouse.ui.js tại đây:

Jquery-ui sortable không hoạt động trên các thiết bị cảm ứng dựa trên Android hoặc IOS


3
Điều này thật tuyệt khi họ đang đối phó với 1.9 này. FWIW, tôi thấy phiên bản mã trong bản demo đó có lỗi và không hoạt động tốt. Ai đó đã đăng phiên bản đúng hơn cho câu hỏi này: stackoverflow.com/questions/6745098/… đang hoạt động tốt hơn cho tôi.
asgeo1

Tôi đã cập nhật câu trả lời của mình để giải quyết vấn đề này. Tôi chưa gặp bất kỳ lỗi nào trong trường hợp sử dụng của mình với bản gốc.
thatmiddleway

1
Liên kết Dropbox bị hỏng.
BerggreenDK


2

Tôi đã phải vật lộn với một vấn đề tương tự ngày hôm qua. Tôi đã có một giải pháp "đang hoạt động" bằng cách sử dụng jQuery UI có thể kéo cùng với jQuery Touch Punch, được đề cập trong các câu trả lời khác. Tuy nhiên, việc sử dụng phương pháp này đã gây ra các lỗi kỳ lạ trong một số thiết bị Android đối với tôi và do đó tôi quyết định viết một plugin jQuery nhỏ có thể làm cho các phần tử HTML có thể kéo được bằng cách sử dụng các sự kiện cảm ứng thay vì sử dụng một phương pháp mô phỏng các sự kiện chuột giả.

Kết quả của việc này là jQuery Draggable Touch là một plugin jQuery đơn giản để tạo các phần tử có thể kéo được, có thiết bị cảm ứng làm mục tiêu chính bằng cách sử dụng các sự kiện chạm (như touchstart, touchmove, touchhend, v.v.). Nó vẫn có một dự phòng là sử dụng các sự kiện chuột nếu trình duyệt / thiết bị không hỗ trợ các sự kiện cảm ứng.


Chào Heyman, Công việc hay đấy. Cảm ơn vì đã chia sẻ nó. Nó sẽ hoạt động đối với jQuery có thể thay đổi kích thước?
Haris

1

Bạn có thể thử sử dụng jquery.pep.js :

jquery.pep.js là một plugin jQuery nhẹ giúp biến bất kỳ phần tử DOM nào thành một đối tượng có thể kéo được. Nó hoạt động trên hầu hết tất cả các trình duyệt, từ cũ đến mới, từ chạm đến nhấp chuột. Tôi đã xây dựng nó để phục vụ nhu cầu mà khả năng kéo của jQuery UI không đáp ứng được, vì nó không hoạt động trên các thiết bị cảm ứng (không có một số hack).

Trang web , liên kết GitHub


1
Cảm ơn @martynas, tôi sẽ kiểm tra nó!
artlung
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.