2010-11-04 37 views
8

Đây là một vấn đề không rõ ràng, nhưng tôi đang sử dụng jQuery Sortables và cố gắng lấy hai danh sách được kết nối hoạt động cùng nhau độc đáo khi được định vị là fixed. Tất cả đều hoạt động tốt cho đến khi bạn cuộn trang một chút sao cho hai danh sách cuối cùng được định vị trên đầu trang của nhau. Sau đó, các danh sách dường như bị nhầm lẫn là người nào sẽ nhận được mục đang được kéo, có nghĩa là bạn nhận được một loạt các jittering xảy ra khi nó xuất hiện/biến mất trong mỗi danh sách. Có vẻ như vấn đề là cả hai danh sách đều xử lý các sự kiện chuột/sắp xếp vì mục đang được kéo kỹ thuật trên cả hai danh sách, nhưng những gì tôi muốn là có danh sách xếp chồng (tức là position: fixed) nuốt các sự kiện để danh sách chính cơ bản không cố gắng nhận mục.Xử lý danh sách sắp xếp jQuery chồng chéo

Dưới đây là mã tối thiểu dụ:

<html> 
<head> 
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.3/jquery.min.js"></script> 
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.6/jquery-ui.min.js"></script> 
    <style type="text/css"> 
     ul { list-style-type: none; padding: 0; float: left; } 
     li { margin: 5px; padding: 5px; width: 500px; border: solid 1px #F00; background-color: #FFF; } 
     #overlayed { position: fixed; top: 0; background-color: #000; margin: 20px; padding: 10px; } 
     #overlayed li { width: 50px; float: left; } 
    </style> 
    <script type="text/javascript"> 
     $(function() { 
      $("ul").sortable({ connectWith: "ul", opacity: 0.6 }).disableSelection(); 
     }); 
    </script> 
</head> 
<body> 
<div id="overlayed"> 
    <ul> 
     <li>Item X</li> 
     <li>Item Y</li> 
     <li>Item Z</li> 
    </ul> 
</div> 
<br/><br/><br/><br/><br/> 
<ul> 
    <li>Item 01</li> 
    <li>Item 02</li> 
    <li>Item 03</li> 
    <li>Item 04</li> 
    <li>Item 05</li> 
    <li>Item 06</li> 
    <li>Item 07</li> 
    <li>Item 08</li> 
    <li>Item 09</li> 
    <li>Item 10</li> 
    <li>Item 11</li> 
    <li>Item 12</li> 
    <li>Item 13</li> 
    <li>Item 14</li> 
    <li>Item 15</li> 
    <li>Item 16</li> 
    <li>Item 17</li> 
    <li>Item 18</li> 
    <li>Item 19</li> 
    <li>Item 20</li> 
    <li>Item 21</li> 
    <li>Item 22</li> 
    <li>Item 23</li> 
    <li>Item 24</li> 
    <li>Item 25</li> 
    <li>Item 26</li> 
    <li>Item 27</li> 
    <li>Item 28</li> 
    <li>Item 29</li> 
    <li>Item 30</li> 
</ul> 
</body> 
</html> 

Vậy câu hỏi là, làm thế nào để khắc phục nó?

+0

Đi sâu vào mã thư viện, tìm hiểu chức năng bạn đang sử dụng thực sự hoạt động như thế nào, khi đó bạn sẽ có thể giải quyết vấn đề của mình. – aaaaaaaaaaaa

Trả lời

5

Tôi đã kết thúc khắc phục sự cố này bằng cách mở rộng chức năng sortable được tạo sẵn để tạo ra một fixedSortable phát hiện và chọn lọc bỏ qua di chuột qua danh sách khi có lớp phủ tại chỗ. Vì mục đích của tôi, tôi chỉ cứng mã hóa các quy tắc, vì điều đó phù hợp với các ràng buộc về thời gian/nhu cầu của tôi, nhưng bạn sẽ có thể làm cho nó hoàn toàn chung chung mà không cần nỗ lực quá nhiều.

Trước hết đây là các mã (giải thích dưới đây):

<html> 
<head> 
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js"></script> 
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.6/jquery-ui.min.js"></script> 
    <style type="text/css"> 
     ul { list-style-type: none; padding: 0; float: left; } 
     li { margin: 5px; padding: 5px; width: 500px; border: solid 1px #F00; background-color: #FFF; } 
     #overlayed { position: fixed; top: 0; background-color: #000; margin: 20px; padding: 10px; } 
     #overlayed li { width: 50px; float: left; } 
    </style> 
    <script type="text/javascript"> 
     (function ($, undefined) { 
      $.widget("ui.fixedSortable", $.ui.sortable, { 
       _init: function() { 
        this.element.data("sortable", this.element.data("fixedSortable")); 
        return $.ui.sortable.prototype._init.apply(this, arguments); 
       }, 
       _create:function() { 
        var result = $.ui.sortable.prototype._create.apply(this, arguments); 
        this.containerCache.sortable = this; 
        return result; 
       }, 
       _intersectsWithPointer: function (item) { 
//This line.... 
        if (item.instance.element.hasClass("main-list") && this.positionAbs.top + this.offset.click.top < $(window).scrollTop() + 87) { 
         return false; 
        } 
        return $.ui.sortable.prototype._intersectsWithPointer.apply(this, arguments); 
       }, 
       _intersectsWith: function(containerCache) { 
//Also this line.... 
        if (containerCache.sortable.element.hasClass("main-list") && this.positionAbs.top + this.offset.click.top < $(window).scrollTop() + 87) { 
         return false; 
        } 
        return $.ui.sortable.prototype._intersectsWith.apply(this, arguments); 
       } 
      }); 
     })(jQuery); 

     $(function() { 
      $("ul").fixedSortable({ connectWith: "ul", opacity: 0.6 }).disableSelection(); 
     }); 
    </script> 
</head> 
<body> 
<div id="overlayed"> 
    <ul> 
     <li>Item X</li> 
     <li>Item Y</li> 
     <li>Item Z</li> 
    </ul> 
</div> 
<br/><br/><br/><br/><br/> 
<ul class="main-list" > 
    <li>Item 01</li> 
    <li>Item 02</li> 
    <li>Item 03</li> 
    <li>Item 04</li> 
    <li>Item 05</li> 
    <li>Item 06</li> 
    <li>Item 07</li> 
    <li>Item 08</li> 
    <li>Item 09</li> 
    <li>Item 10</li> 
    <li>Item 11</li> 
    <li>Item 12</li> 
    <li>Item 13</li> 
    <li>Item 14</li> 
    <li>Item 15</li> 
    <li>Item 16</li> 
    <li>Item 17</li> 
    <li>Item 18</li> 
    <li>Item 19</li> 
    <li>Item 20</li> 
    <li>Item 21</li> 
    <li>Item 22</li> 
    <li>Item 23</li> 
    <li>Item 24</li> 
    <li>Item 25</li> 
    <li>Item 26</li> 
    <li>Item 27</li> 
    <li>Item 28</li> 
    <li>Item 29</li> 
    <li>Item 30</li> 
</ul> 
</body> 
</html> 

Nếu thích nghi này chính mình, bạn sẽ cần phải thay đổi hai dòng nhận xét đánh dấu trên. Về cơ bản các câu lệnh if nên được đánh giá là true (và do đó trả về false) nếu mục được di chuột qua (item.instance.elementcontainerCache.sortable.element) là không lớp phủ và sự kiện (this) đang xảy ra trong giới hạn của lớp phủ. Bằng cách này danh sách chính không bao giờ nhận được sự kiện ở vị trí của trang nơi lớp phủ. Vì vậy, trong mã này danh sách chính không nhận được bất kỳ sự kiện nào nếu chúng xuất hiện ở đầu 87 pixel của màn hình, vì đó là nơi lớp phủ cố định của tôi (không hoàn toàn chính xác trong ví dụ này), nhưng hy vọng nó vẫn hợp lý).

+3

không biết nếu điều này là hữu ích cho bất cứ ai nhưng Ive thả mã của Alconja vào JSBin để bạn có thể thấy nó hoạt động. http://jsbin.com/iqemid/2 tất cả nhờ Alconja cho mã này ^^ – azzy81

2

Đây là lỗi tôi nghĩ rằng bạn đang gặp phải, và sửa chữa đơn giản hơn rất nhiều:

http://bugs.jqueryui.com/ticket/7065

+1

Tôi nghĩ rằng đó là lỗi tương tự, nhưng đề xuất sửa chữa không bao gồm tất cả các kịch bản (bao gồm cả một đề cập bởi OP). Tôi nghĩ rằng sửa chữa thực sự đòi hỏi phải xác định bối cảnh xếp chồng của tất cả các thùng chứa có thể phân hủy dưới con trỏ và chọn vùng chứa trên cùng theo thứ tự z. –

+0

Ah, có thể là sự thật. Bản sửa lỗi chỉ bao gồm các danh sách trùng lặp do tràn: bị ẩn, không phải do lệnh z. Nó có vẻ như bạn cần phải sắp xếp các ứng cử viên theo thứ tự z đầu tiên và sau đó đi qua chúng cho đến khi bạn nhận được một hit. – Jason

0

Tôi chạy vào vấn đề này trên một trang mà tôi có một danh sách theo chiều dọc trên một danh sách thứ hai . Mặc dù tràn được thiết lập để ẩn, tràn không nhìn thấy của danh sách hàng đầu vẫn chặn di chuyển trên sự kiện cho danh sách bên dưới nó (điều này có thể được xác nhận bằng cách đặt tràn vào tự động trong danh sách trên cùng để giúp hình dung chồng chéo). Đó là một vấn đề z-index.

sửa chữa của tôi là đặt mã này trong trường hợp ngừng sắp xếp được:

//expliclty hide the overflow items 
$('.topList .item:gt(5)').hide(); 
$('.topeList .item:first').show(); 

Những gì tôi đang làm ở đây là ẩn một cách rõ ràng các yếu tố đầu danh sách, chỉ để lại top 5 có thể nhìn thấy do đó không có DOM bù đắp chồng chéo giữa danh sách trên cùng và dưới cùng.

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