2011-10-31 18 views
5

Trong ứng dụng ASP.NET MVC 3 của tôi, tôi muốn sử dụng pagination jQuery plugin để làm cho diễn đàn của tôi ...Cách hiệu quả nhất để sử dụng Jquery pagination & lịch sử plugins cùng

Vì vậy, tôi muốn, để làm tất cả những thay đổi trang với Ajax và muốn sử dụng plugin history để quay lại trình duyệt và các nút tiếp theo ...

Mã javascript/jquery hiệu quả nhất cho điều đó là gì?

tôi đã viết mã này tháng trước, nhưng bây giờ có vẻ như tôi ugly..Check rằng

$(document).ready(function() { 

     $.history.init(function (hash) { 

      if (hash != "") { 
       NavigateToPage(hash.substring(0,hash.indexOf("page")),hash.substring(hash.lastIndexOf("_")+1)); 
      } else { 
        if(firstTimeOpen==true){ 
         firstTimeOpen=false; 
        } 
        else 
        { 
         window.location.replace("/Forum"); 
        } 
      } 

     }); 

     $(".more-button").click(function() { 

      currentForumId=$("#pagination-td").parent().prev().attr("id").substring(5); 
      $.history.load($(this).parents("tr").attr("id").substring(5)+"page_1"); 

      }); 


     }); 


    function NavigateToPage(forumId,page) { 
      lastForumId=currentForumId; 
      currentForumId=forumId; 
      var elem=$("#forum"+forumId); 
      var elemStr="#forum"+forumId; 
      if($("#pagination-td").parent().prev().attr("id").substring(5)!=forumId) 
      { 
      forumChanged=true; 
      MakeChanges(elem,page); 
      } 
      else 
      { 
       if($(".pagination").html()==null) 
       { 
        if(elem.find("a").attr("id")>@MyProject.Constants.THREAD_COUNT) 
        { 
        $("#pagination-td").pagination(elem.find("a").attr("id"), { 
        items_per_page: @MyProject.Constants.THREAD_COUNT, 
        callback: handlePaginationClick 
        }); 
        } 
       } 
      } 


      $.get('/Forum/ForumThreads', { id: forumId, beginNumber: page - 1, count: @MyProject.Constants.THREAD_COUNT }, function (data) { 
        RemoveElements(elem.prev(), @MyProject.Constants.THREAD_COUNT); 
        elem.before(data); 
        elem.hide(); 
        $("tr:not("+elemStr+"):hidden").show(300); 

      }); 
      CorrectPagination(page); 

    } 

    function RemoveElements(element) 
    { 
     if (element.hasClass("forum-desc")) return false; 
     var prevElement=element.prev(); 
     element.remove(); 
     RemoveElements(prevElement); 

    } 

    function MakeChanges(elem,page) 
    { 

      var element=elem.prev(); 
      if(forumChanged==true) 
      { 

      $.get('/Forum/ForumThreads', { id: lastForumId, beginNumber:0, count: @MyProject.Constants.THREAD_VISIBLE_COUNT }, function (data) { 
        RemoveElements($("#pagination-td").parent().prev().prev()); 
        $("#pagination-td").parent().prev().before(data); 

        $("#pagination-td").parent().prev().hide(); 
        $("#pagination-td").parent().remove(); 
        elem.after('<tr style="display:none"><td id="pagination-td" colspan="3" style="border-bottom:none;"></td></tr>'); 
        if(elem.find("a").attr("id")> @MyProject.Constants.THREAD_COUNT) 
         { 
           $("#pagination-td").pagination(elem.find("a").attr("id"), { 
           items_per_page: @MyProject.Constants.THREAD_COUNT, 
           callback: handlePaginationClick 
           }); 
         } 
         $("tr:hidden").show(300); 
         CorrectPagination(page); 
         $("#pagination-td").parent().prev().hide(); 

      }); 
      } 
    } 

    function handlePaginationClick(new_page_index,pagination_container) 
    { 
     $.history.load(currentForumId+"page_"+(new_page_index+1)); 
     return false; 
    } 
function CorrectPagination(page) { 
    $(".pagination span.current:not(.prev):not(.next)").replaceWith('<a href="#">' + $(".pagination span.current:not(.prev):not(.next)").html() + '</a>'); 

    $(".pagination a:not(.prev):not(.next)").eq(page - 1).replaceWith('<span class="current">' + $(".pagination a:not(.prev):not(.next)").eq(page - 1).html() + "</span>"); 

    if ($(".pagination span.current:not(.prev):not(.next)").next().html() == "Next") { 
     $(".pagination span.prev").replaceWith('<a class="prev" href="#">Prev</a>'); 
     $(".pagination a.next").replaceWith('<span class="current next">Next</span>'); 

    } 
    else { 
     if ($(".pagination span.current:not(.prev):not(.next)").prev().html() == "Prev") { 
      $(".pagination a.prev").replaceWith('<span class="current prev" >Prev</span>'); 
      $(".pagination span.next").replaceWith('<a class="next" href="#">Next</a>'); 

     } 
     else { 
      $(".pagination span.prev").replaceWith('<a class="prev" href="#">Prev</a>'); 
      $(".pagination span.next").replaceWith('<a class="next" href="#">Next</a>'); 
     } 
    } 
} 

Có đề của diễn đàn trong trang và tôi sử dụng một pagination (vào chủ đề đang hoạt động) ... Bằng cách nhấp nút khác nữa, luồng hiện tại được thay đổi thành chuỗi đó.

Vì vậy, trong html Tôi có điều này

<table id="forum-table" class="border-top"> 
@foreach (var forum in Model) 
{ 

    <tr class="forum-desc"> 
    <td class="forum-name" colspan="4"><a class="label-h4 purple" href="/Forum/Forums/@forum.Key.Forum.Id">@forum.Key.Forum.Name</a> 
    @if (forum.Key.Forum.Description != null) 
    { 
     <span> - </span> 
     <span>@forum.Key.Forum.Description</span> 
    }</td> 
    </tr> 

    for(int index = 0; index < forum.Value.Count; index++) 
    { 
      <tr> 
      <td class="thread-pic"><img src="/img/forum/thread-icon.png" alt="" /></td> 
      <td class="thread-name"> 
      <a href="/Forum/Thread/@forum.Value[index].Thread.Id" class="blue linked">@forum.Value[index].Thread.Title</a> 
      </td> 
      <td class="thread-post-count"> 
      <span>Posts:</span>@forum.Value[index].PostCount 
      </td> 
      <td class="thread-information"> 
      <span>by </span><a class="blue" href="/Home/UserProfile/@forum.Value[index].LastPostUserName">@forum.Value[index].LastPostUserName</a> <br /> 
      @if (forum.Value[index].LastPostDate != DateTime.MinValue) 
      { 
       @forum.Value[index].LastPostDate 
      } 
      </td> 
      </tr> 
      } 

      if (forum.Key.ThreadCount > @MyProject.Constants.THREAD_VISIBLE_COUNT) 
      { 
       <tr id="[email protected](forum.Key.Forum.Id)"> 
       <td class="more-td"> 
       <a href="javascript:void" class="blue linked more-button" id="@forum.Key.ThreadCount">more</a> 
       </td> 
       </tr> 
      } 
      if (forum.Key.Forum.Id == Model.Keys.FirstOrDefault().Forum.Id) 
      { 
       <tr style="display:none"> 
       <td id="pagination-td" colspan="3" style="border-bottom:none;"></td> 
       </tr> 
      } 
      if (forum.Key.ThreadCount == 0) 
      { 
       <tr> 
       <td colspan="4"><span>No threads available in this forum</span></td> 
       </tr> 
      } 

} 
</table> 

Vì vậy, tôi muốn ngắn nhất (hiệu quả) mã javascript/jquery để pha trộn hai plugin này.

+1

Bạn có thể đăng mã mà bạn đã thử cho đến giờ để chúng tôi có cơ sở chung để thảo luận và xem nó có thể được cải thiện không (nếu cần)? –

+0

Vâng, tất nhiên, tôi sẽ chỉnh sửa câu hỏi của tôi ngay bây giờ))) –

+0

Tôi vừa chỉnh sửa câu hỏi của mình ... –

Trả lời

2

Dylan, tôi nghĩ rằng thay đổi parent().prev() với closest() không phải là bất cứ điều gì vấn đề lớn ... Có như vậy một vấn đề lớn với mã lớn .. . Ví dụ hãy xem hàm

function CorrectPagination(page) { 
$(".pagination span.current:not(.prev):not(.next)").replaceWith('<a href="#">' + $(".pagination span.current:not(.prev):not(.next)").html() + '</a>'); 

$(".pagination a:not(.prev):not(.next)").eq(page - 1).replaceWith('<span class="current">' + $(".pagination a:not(.prev):not(.next)").eq(page - 1).html() + "</span>"); 

if ($(".pagination span.current:not(.prev):not(.next)").next().html() == "Next") { 
    $(".pagination span.prev").replaceWith('<a class="prev" href="#">Prev</a>'); 
    $(".pagination a.next").replaceWith('<span class="current next">Next</span>'); 

} 
else { 
    if ($(".pagination span.current:not(.prev):not(.next)").prev().html() == "Prev") { 
     $(".pagination a.prev").replaceWith('<span class="current prev" >Prev</span>'); 
     $(".pagination span.next").replaceWith('<a class="next" href="#">Next</a>'); 

    } 
    else { 
     $(".pagination span.prev").replaceWith('<a class="prev" href="#">Prev</a>'); 
     $(".pagination span.next").replaceWith('<a class="next" href="#">Next</a>'); 
    } 
} 
} 

Trong câu hỏi mà tôi tìm thấy một slutuion hiệu quả hơn cho nó ... Hãy nhìn vào

này 012.

jquery history plugin set current page possible?

Có cùng chức năng với mã ít hơn

var panel = jQuery(this); 
// Attach control functions to the DOM element 
this.selectPage = function(page_id){ pageSelected(page_id);} 

Và sau đó

$("#Pagination")[0].selectPage(9); //0-based, 9 = page 10 

Hãy kiểm tra chính mình ... Đối với các chức năng khác có thể là cách ngắn nhất quá ...

+0

Cảm ơn Artur Keyan ... Điều đó thực sự hữu ích ... Tôi rất vui khi nghe đề xuất của bạn về chức năng của mã javascript của tôi quá ... –

4

Nhìn chung, điều này trông giống như một cách tiếp cận tốt. Khi bạn trở nên hoàn thiện hơn với jQuery, bạn sẽ học cách kết chuỗi nhiều hơn và thực hiện các thay đổi bằng cách sử dụng con cháu nâng cao và bộ chọn lân cận yêu cầu mã ít hơn.

Hầu hết các chức năng đều hơi tiết nhưng đó không phải là điều xấu bởi vì nó cho thấy công việc của bạn.

Khối này có nhiều chỗ để cải thiện.

RemoveElements($("#pagination-td").parent().prev().prev()); 
$("#pagination-td").parent().prev().before(data); 

$("#pagination-td").parent().prev().hide(); 
$("#pagination-td").parent().remove(); 
elem.after('<tr style="display:none"><td id="pagination-td" colspan="3" style="border-bottom:none;"></td></tr>'); 

Bạn có thể làm sạch điều đó bằng cách sử dụng closest() thay vì .parent().prev(). Tôi không thể làm theo chính xác những gì bạn đang nhắm mục tiêu nhưng tôi nghĩ rằng bạn đang tìm kiếm hàng của bảng trước đó. Tôi không thể nói chính xác những gì bạn đang cố gắng ẩn và xóa nhưng việc sử dụng gần nhất() có thể giúp và làm hoạt hình ẩn và chờ nó hoàn thành trước khi xóa nội dung nào đó.

RemoveElements($("#pagination-td").closest(".thread")); 
$("#pagination-td").closest(".thread").before(data); 

$("#pagination-td").closest(".thread").hide('fast', function() { 
    $("#pagination-td").closest(".itemToRemove").remove(); }); 

$('#formTable tr:last').after('<tr class="hidden"><td id="pagination-td" colspan="3"></td></tr>'); 

Bây giờ di chuyển CSS nội tuyến của bạn đến một stylesheet

#pagination-td { border-bottom: none; } 
Các vấn đề liên quan