2012-03-13 29 views
6

Tôi hiện đang khám phá jQuery Mobile để phát triển phiên bản di động của trang tổng quan có thông tin về thứ tự. Và kế hoạch là gì, là sử dụng một danh sách đơn giản không có thứ tự với tất cả các đơn đặt hàng và mọi người có thể nhấp vào liên kết mà họ muốn biết thêm. Vì danh sách này có thể trở nên khá lớn, nên có khả năng lọc dễ dàng với jQuery Mobile.Bộ lọc dữ liệu di động jQuery, trong trường hợp không có kết quả

Chỉ cần một cái gì đó như thế này:

<ul data-role="listview" data-filter="true"> 
    <li><a href="#">Item 1</a></li> 
    <li><a href="#">Item 2</a></li> 
    <li><a href="#">Item 3</a></li> 
    <li><a href="#">Item 4</a></li> 
</ul> 

data-filter="true" chăm sóc hiển thị một thanh tìm kiếm và nó thực sự hoạt động khá tốt đẹp.

Nhưng vấn đề duy nhất của tôi là, khi không có gì được tìm thấy, nó chỉ hiển thị không có gì, và tôi muốn có một chút văn bản nói điều gì đó như "Xin lỗi, không có đơn đặt hàng nào được tìm thấy".

Có ai biết nếu điều này là có thể với jQuery Mobile, hoặc là nó một cái gì đó đã được mã hóa từ đầu?

+1

Kiểm tra xem '$ ('ul [data-role =" listview "]> li'). Size() <1' có thể? Nếu không có chức năng tích hợp là – Johan

+0

@Johan, Cảm ơn, tôi đã suy nghĩ về một cái gì đó như thế, nhưng trước tiên muốn chắc chắn rằng không có hàm dựng sẵn nào tồn tại. Bởi vì bạn có thể lấy thanh tìm kiếm với một thuộc tính dữ liệu, bạn có thể thay đổi trình giữ chỗ bằng một thuộc tính, vì vậy tôi đã thấy rằng việc thay đổi 'trường hợp không có kết quả' cũng sẽ không thành vấn đề. – Crinsane

+0

Ok, âm thanh như nó sẽ tồn tại một cái gì đó tương tự, tôi đoán bạn sẽ phải chờ đợi và xem nếu ai đó biết nó tốt hơn so với tôi câu trả lời. Ít nhất bạn có một kế hoạch sao lưu bây giờ :) – Johan

Trả lời

7
//wait to do event binding until the page is being initialized 
$(document).delegate('[data-role="page"]', 'pageinit', function() { 

    //cache the list-view element for later use 
    var $listview = $(this).find('[data-role="listview"]'); 

    //delegate event binding since the search widget is added dynamically 
    //bind to the `keyup` event so we can check the value of the input after the user types 
    $(this).delegate('input[data-type="search"]', 'keyup', function() { 

     //check to see if there are any visible list-items that are not the `#no-results` element 
     if ($listview.children(':visible').not('#no-results').length === 0) { 

      //if none are found then fadeIn the `#no-results` element 
      $('#no-results').fadeIn(500); 
     } else { 

      //if results are found then fadeOut the `#no-results` element which has no effect if it's already hidden 
      $('#no-results').fadeOut(250); 
     } 
    }); 
});​ 

Đây là một bản demo: http://jsfiddle.net/6Vu4r/1/

+0

Được rồi, dường như làm việc khá tốt đẹp. Vì vậy, không có xây dựng thực sự trong tùy chọn cho điều này ... hmm, okay. Btw, bạn có nhận thấy rằng một khi bạn nhận được một điểm mà không tìm thấy kết quả, chữ cái tiếp theo bạn gõ vào phần tử '# no-results' sẽ fadeOut một lần nữa, chữ cái tiếp theo nó fadeIn một lần nữa, v.v. – Crinsane

+0

@Crinsane Tôi nghĩ rằng sử dụng '.not (this)' sẽ bỏ qua phần tử '# no-results' từ vùng chọn nhưng tôi phải thay đổi thành' .not ('# no-results') '. Tôi ** cập nhật ** câu trả lời của tôi, đây là bản demo mới: http://jsfiddle.net/6Vu4r/1/ – Jasper

+0

Mặc dù tôi đã hy vọng tôi sẽ phạt một xây dựng trong chức năng, tôi thích đoạn mã này quá, vì vậy cảm ơn bạn rất nhiều! – Crinsane

2

Cảm ơn bạn

Tôi đang sử dụng mã này với một phần mở rộng. Tôi không muốn viết mỗi lần li không kết quả # này.

$(document).delegate('[data-role="page"]', 'pageinit', function() { 

var $listview = $(this).find('[data-role="listview"]'); 
$listview.append('<li id="no-results" style="display:none;">[No results found]</li>'); 
$listview.listview('refresh'); 
$(this).delegate('input[data-type="search"]', 'keyup', function() { 
    if ($listview.children(':visible').not('#no-results').length === 0) { 
     $('#no-results').fadeIn(500); 
    } else { 
     $('#no-results').fadeOut(250); 
    } 
}); 
}); 
1

Nếu bạn sử dụng mã của Jasper trong danh sách có dấu phân cách tự động, bạn có thể thấy phần tử "không có kết quả" bị ẩn tạo dải phân cách. Để tránh điều đó, tôi đã sử dụng mã này:

if ($listview.children(':visible').not('#no-results').length === 0) { 

     // if none are found then fadeIn the `#no-results` element 
     $('#no-results').fadeIn(500); 

    } else { 

     // if results are found then fadeOut the `#no-results` element which 
     // has no effect if it's already hidden 
     $('#no-results').fadeOut(250); 
     $listview.children('.ui-li-divider:visible').not('#no-results').each(function()    { 
      if($(this).next("#no-results").length > 0) 
       $(this).hide(); 
     }); 
    } 

Nếu có giải pháp tốt hơn, vui lòng chia sẻ.

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