2012-06-12 44 views
18

Có thư viện javascript tải một danh sách khổng lồ một cách hiệu quả bằng cách chỉ tải phần có thể xem của danh sách đó và giả mạo thanh cuộn không?Hiển thị danh sách lớn trong HTML

<div id='container'> 
    <!-- Empty but height is set to take up space to fake scrollbar --> 
    <div id='hidden-before'></div>  

    <!-- Preloaded in case the user scrolls up --> 
    <div id='preload-before'></div> 

    <!-- User can see this. Height == #container's height --> 
    <div id='viewable-section'></div> 

    <!-- Preloaded in case the user scrolls down --> 
    <div id='preload-after'></div> 

    <!-- Empty but height is set to take up space to fake scrollbar --> 
    <div id='hidden-after'></div>  
</div> 

Google Documents làm ví dụ này cho tài liệu văn bản lớn.

Lưu ý: Điều tôi đang tìm kiếm phức tạp hơn cuộn vô hạn. Cuộn vô hạn chỉ đợi bạn nhấn đáy và nó sẽ tải thêm dữ liệu, mở rộng thanh cuộn. Những gì tôi đang tìm kiếm sẽ làm cho bạn nghĩ rằng tất cả dữ liệu đã được tải vì thanh cuộn được giả mạo. Khi bạn nhấn đáy, bạn đã thực sự nhấn vào cuối danh sách mà tôi muốn hiển thị.

+0

Bạn nên cân nhắc cách tạo danh sách nhỏ hơn, có thể nhóm các danh mục đó vào không? Tải một phần danh sách có nghĩa là tìm kiếm trong trang có thể sẽ không hoạt động, vì vậy bạn đang khiến người dùng cuộn qua danh sách và tìm kiếm theo cách thủ công thay vì nhập tìm kiếm. – RobG

+0

Tôi nghĩ Google Documents thực hiện việc đó dựa trên * trang *, có chiều cao cố định. Trên danh sách HTML, không có cách nào để biết chiều cao mỗi mục danh sách sẽ mất, trừ khi bạn tải chúng vào DOM. – bfavaretto

+0

@bfavaretto Chắc chắn nhưng tôi cũng có thể có chiều cao cố định cho từng mục danh sách mà tôi muốn hiển thị. – jhchen

Trả lời

9

Cân nhắc Clusterize.js

Plugin này thực hiện chính xác những gì bạn yêu cầu .

+0

cách kết hợp plugin này với tải hàng động? –

+1

@SouhaiebBesbes sử dụng các phương thức .append, .prepend hoặc .update. Xem tài liệu – Denis

+0

[Clusterize.js] (https://www.uplabs.com/posts/clusterize-js-commercial-license) theo giấy phép GNU GPL v3, $ 25 cho giấy phép thương mại duy nhất và $ 110 cho giấy phép thương mại mở rộng . –

4

Đó là một kỹ thuật được gọi là "cuộn vô hạn" và nhiều thư viện hỗ trợ nó. Nếu bạn đang sử dụng jQuery, hãy xem tại địa chỉ:

http://www.infinite-scroll.com/

Như bạn đã biết, ý tưởng này là để xác định "bao nhiêu" của dữ liệu người dùng có thể hiện thấy, và sau đó thực hiện một yêu cầu cho chỉ có nhiều, nhưng đặt cuộn liên quan đến kích thước của toàn bộ tập hợp. Bằng cách đó, khi người dùng cuộn qua một điểm nhất định, bạn có thể yêu cầu phần tiếp theo của tập dữ liệu.

ExtJS cũng có điều này như là một phần của khuôn khổ dựa trên thành phần của chúng. Đây là a grid example.

+1

Như @LarryK đã nói về câu trả lời đã bị xóa của mình: "Lưu ý rằng bạn cần phải thực hiện các thay đổi trên ứng dụng phía máy chủ của mình để hỗ trợ các yêu cầu phân trang từ ứng dụng khách". – bfavaretto

+0

@bfavaretto: Vâng, đây là điều đáng nói. Và, tùy thuộc vào độ phức tạp của trang của bạn (ví dụ: có cần phân loại động hay nhóm), điều này có thể yêu cầu _quite a bit_ của sửa đổi phía máy chủ. – voithos

+0

Xin lỗi tôi nên rõ ràng hơn. Tôi đã cập nhật câu hỏi để hy vọng truyền đạt sự khác biệt giữa những gì tôi đang tìm kiếm và cuộn vô hạn. Một lần nữa, Google Docs làm những gì tôi đang tìm kiếm, mà bạn sẽ không được mô tả như cuộn vô hạn. – jhchen

2

Bạn đã thử thuộc tính tràn trong css chưa? Chỉ cần cung cấp cho div vùng chứa của bạn chiều rộng và chiều cao chuẩn như sau:

#container {height: 500px; chiều rộng: 500px; overflow: auto;}

+1

Vấn đề là tôi không muốn tải tất cả các phần tử HTML vì tôi sẽ có rất nhiều yếu tố và nó sẽ chậm. Tôi chỉ muốn tải những người dùng sẽ thấy và tải những người khác khi họ cuộn. – jhchen

1

bài này đề cập đến câu hỏi của bạn và trình bày câu trả lời - http://engineering.linkedin.com/linkedin-ipad-5-techniques-smooth-infinite-scrolling-html5

Không phải là kẻ giết người cắm bạn sau nhưng đi một chặng đường dài để giải thích làm thế nào bạn sẽ đi về việc tạo chính nó.

UPDATE: Có một thư viện mới mang tên infinity.js, thông tin thêm ở đây - https://stackoverflow.com/a/12108015/921259

3

Tôi chạy vào một vấn đề tương tự. Kịch bản là tôi đã có một (~ 400 + yếu tố) lớn được hiển thị trong danh sách, trong đó mỗi phần tử có thể có chế độ xem riêng. Việc tạo, bố cục và vẽ của DOM cho các phần tử đó chậm hơn mức cần thiết khi tryign để hiển thị toàn bộ danh sách bên trong DIV cuộn.

Tôi đã xem xét một số giải pháp.

InfinityJS [1] khá gần với những gì tôi muốn, ngoại trừ yêu cầu phần tử chứa các mục danh sách đã được thêm vào DOM.

vô hạn cuộn [2] bởi Paul Irish cũng thú vị, nhưng đã giải quyết được một vấn đề cụ thể khác với những gì tôi cần giải quyết.

MegaList [3] đến gần với những gì tôi muốn. Andrew (tác giả) đã thực hiện một công việc tuyệt vời để thiết kế nó cho di động đầu tiên, với sự hỗ trợ cảm ứng, v.v.Một báo trước cho tôi là dường như giả định một mô hình danh sách lựa chọn nghiêm ngặt và làm nhiều hơn một chút so với tôi muốn một thành phần danh sách thực hiện (ví dụ: ràng buộc để thay đổi kích thước các sự kiện và cố gắng xử lý tự động).

Vì vậy, tôi bắt đầu viết một thành phần danh sách khung hình được mô hình hóa yếu sau phiên bản UITableView của iOS - và được gọi là khung nhìn js-virtual-list (vlv :-). Đó là một công việc đang diễn ra và tôi sẽ không khuyên bạn nên làm điều đó ở trên trừ khi bạn có những nhu cầu tương tự mà không được đáp ứng đầy đủ với những điều đó.

Nguồn đang ở đây https://github.com/shyam-habarakada/js-virtual-list-view.

đóng góp cần thiết :-)

[1] http://airbnb.github.io/infinity/

[2] http://www.infinite-scroll.com/

[3] https://github.com/triceam/MegaList

1

Bạn có thể xem xét sử dụng số <iron-list> của Polymer thực sự tiêu thụ tất cả dữ liệu nhưng chỉ gắn một số nút vào DOM và xử lý ràng buộc dữ liệu để hiển thị đúng nội dung khi người dùng cuộn qua.

Tôi đã sử dụng nó trước đây và có kết quả rất tốt với danh sách tùy chỉnh gồm 2000 mục (các mục đó là các thành phần tùy chỉnh phức tạp) cuộn liền mạch.

Mặc dù tôi chưa thử bản thân mình, nhóm Polymer tuyên bố rằng nó có thể dễ dàng trộn lẫn với các khung công tác khác.

https://www.webcomponents.org/element/PolymerElements/iron-list

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