2011-01-07 30 views
8

Tôi có một số UL theo chiều dọc xuống một trang. Chúng được thiết lập bằng cách sử dụng jQueryUI's sortable(). Ví dụ sống của tôi là:Làm cách nào để kéo từ danh sách dọc được kết nối đến mục đầu tiên của một danh sách khác bên dưới với jQueryUI Sắp xếp?

http://jsfiddle.net/GVqPF/2/

tôi có thể kéo từ câu trả lời để làm cho nó trở thành yếu tố cuối cùng trong câu hỏi. Nhưng khi tôi kéo từ câu hỏi đến câu trả lời, trình giữ chỗ chuyển sang mục thứ hai trong danh sách câu hỏi. Tại thời điểm đó tôi có thể kéo nó lên trên cùng. Nhưng tôi không thể kéo trực tiếp đến vị trí đầu tiên trong danh sách Câu trả lời.

Here is a video thể hiện sự cố.

Bất kỳ ý tưởng nào tại sao tôi gặp sự cố này kéo từ danh sách ở trên vào phần tử đầu tiên của danh sách bên dưới?

Tôi đã thử chỉnh sửa phần đệm và lề trên cả hai danh sách và các mục có thể sắp xếp.

Cảm ơn, Denis

+2

Đây có phải là sự cố về trình duyệt không? Tôi có thể kéo mọi thứ từ Câu hỏi đến Trả lời và Trả lời câu hỏi mà không gặp bất kỳ sự cố nào trong Chrome. BTW - sự sắp xếp trong IE7 bị tắt. – nolabel

+0

Tôi đã mô phỏng vấn đề trong FF, Opera và Chrome. Bạn có thể kéo Câu hỏi lên đầu danh sách Câu trả lời bằng cách để phần giữ chỗ di chuyển đến vị trí thứ hai trước không? –

+0

Tôi không thể tạo lại vấn đề đó trong Chrome 9, cho những gì nó đáng giá. Câu hỏi xuất hiện chính xác nơi tôi kéo chúng trong các câu trả lời, bao gồm cả đầu. –

Trả lời

0

Khi bạn kéo một LI từ một danh sách vào một danh sách kết nối các "khoảng trống" trong danh sách cũ biến mất. Điều này làm cho các danh sách bên dưới nó "di chuyển lên" trên trang, giống như con trỏ của bạn đến danh sách tiếp theo. Điều này làm cho mục được kéo của bạn bị lơ lửng trên không gian thứ 2 thay vì số 1, buộc bạn phải di chuyển con trỏ lên lần nữa để có được khoảng trống thứ nhất.

Nếu danh sách của bạn nằm cạnh nhau theo chiều ngang, bạn sẽ không thấy vấn đề này (nhưng, tất nhiên, điều đó không giúp bạn).

Tôi chưa đưa ra giải pháp thực tế, nhưng hy vọng điều này sẽ giúp giải quyết vấn đề.

+0

Nếu đúng như vậy, tôi tò mò tại sao http://jsfiddle.net/GVqPF/8/ không hoạt động như mong đợi. –

+0

Vâng, jsfiddle của bạn cho thấy khá rõ ràng lý thuyết của tôi là sai. Thật thú vị, với phiên bản của bạn, tôi chỉ gặp vấn đề khi lần đầu tiên tôi kéo một mục vào danh sách. Thậm chí không cho phép đi (tức là, không bao giờ thả vật phẩm), nếu tôi kéo nó lên trên và sau đó lại rơi xuống, nó vẫn hoạt động. (Trong Chrome 10). –

+0

Vâng, nó khá kỳ quặc. Hành vi cũng giống nhau khi bạn đi từ danh sách dưới cùng đến danh sách trên cùng - thay vì đường viền xuất hiện ở cuối danh sách trên cùng, nó xuất hiện ở vị trí thứ hai. Nhưng, điều này dường như chỉ xảy ra đôi khi. Tôi khá bối rối. –

2

Đây là quan sát của tôi và lời giải thích hợp lý cho hành vi kỳ lạ này.

Khi di chuyển một phần tử từ vùng chứa câu hỏi sang vùng chứa câu trả lời, trình giữ chỗ ban đầu tự thêm vào phần đầu câu trả lời trước khi di chuyển con trỏ tiếp theo nhận được câu trả lời1 và answer2.Thực sự, điều này sẽ không xảy ra khi trình giữ chỗ nhảy trước answer1 và sau đó giữa answer1 và answer2.
* PS: * Hiệu ứng này có thể không hiển thị trong cửa sổ jsfiddle nhưng nếu bạn xây dựng một trang HTML mới với mã đã cho, bạn sẽ thấy những gì tôi đang nói.

Điều tra thêm cho thấy có lỗi trong plugin giao diện người dùng jquery có thể sắp xếp. Lấy phiên bản phát triển của jquery.ui.sortable.js và tìm cụm từ này "var dist = 10000; var itemWithLeastDistance = null". Mục tiêu của đoạn mã này là để tìm ra phần tử gần nhất gần nhất khi con trỏ di chuyển từ vùng chứa này sang vùng chứa khác.

Quan sát biến "cur" (Tôi đã thêm lệnh console.log() cho firebug). Giá trị của biến này luôn là . Vì giá trị của cur luôn là '0', mã cho rằng sẽ tính sai phần tử <li> cuối cùng là 'mụcWithLeastDistance' và nhảy sai ở đó.

//When entering a new container, we will find the item with the least distance and append our item near it 
       var dist = 10000; var itemWithLeastDistance = null; var base = this.positionAbs[this.containers[innermostIndex].floating ? 'left' : 'top']; 
       for (var j = this.items.length - 1; j >= 0; j--) { 
        if (!$.ui.contains(this.containers[innermostIndex].element[0], this.items[j].item[0])) continue; 
        var cur = this.items[j][this.containers[innermostIndex].floating ? 'left' : 'top']; 
        //my comments 
        console.log("cur : %s for iteration: %s has base %s", cur, j, base); 
        if (Math.abs(cur - base) < dist) { 
         dist = Math.abs(cur - base); itemWithLeastDistance = this.items[j]; 
         //my comments 
         console.debug(this.items[j]); 
        } 
       } 

Cho tôi biết cộng đồng nghĩ gì. chúng tôi có thể báo cáo điều này với nhóm jquery ui.

Các vấn đề liên quan