2011-10-31 17 views
5

En mi aplicación ASP.NET MVC 3 Quiero usar pagination Plugin de jQuery para hacer mi foro ...La forma más eficiente de usar jQuery de paginación e historia plugins juntos

por lo que quiero, hacer todos los cambios de página con Ajax, y desea utilizar el complemento history para trabajar con la parte posterior del navegador y los botones siguientes ...

¿Cuál es el código javascript/jquery más eficiente para eso?

que escribí hace este código mes, pero ahora me parece que ugly..Check

$(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>'); 
     } 
    } 
} 

Hay hilos de foro en la página y utilice uno de paginación (a hilo activo) ... Al hacer clic otro botón más, el hilo actual se cambia a ese hilo.

Así en el html que tienen este

<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> 

así que quiero más corto (eficiente) de código Javascript/jQuery para la mezcla de estos dos plugins.

+1

¿Podría publicar el código que ha intentado hasta el momento para tener una base común de discusión y ver cómo se puede mejorar (si es necesario)? –

+0

Sí, por supuesto, voy a editar mi pregunta ahora))) –

+0

Acabo de editar mi pregunta ... –

Respuesta

2

Dylan, creo que cambiando parent().prev() con closest() no es nada grave problema ... Hay grandes problemas de este tipo con grandes código .. . por ejemplo echar un vistazo a esa función

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>'); 
    } 
} 
} 

en esa pregunta me encontré con un slutuion más eficiente para que ... tome un vistazo a este

jquery history plugin set current page possible?

Existe misma función con menos código

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

Y luego

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

Vamos a comprobar usted mismo ... Para otras funciones pueden ser camino más corto también ...

+0

Gracias Artur Keyan ... Eso realmente útil ... Me complacerá escuchar sus sugerencias sobre la función de mi código de javascript también ... –

4

En general, este parece un enfoque decente. A medida que mejore con jQuery, aprenderá a encadenar más y a realizar cambios utilizando descendientes avanzados y selectores adyacentes que requieren menos código.

La mayoría de las funciones son un poco detalladas, pero eso no es malo porque muestra su trabajo.

Este bloque tiene mucho que mejorar.

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>'); 

Usted puede ser capaz de limpiar eso usando closest() en lugar de .parent().prev(). No pude seguir exactamente su orientación, pero creo que estaba buscando la fila de la tabla anterior. No puedo decir exactamente lo que intentas ocultar y eliminar, pero usar más cercano() podría ayudar y animar el hide y esperar a que se complete antes de eliminar algo.

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>'); 

Ahora mueve la CSS en línea en una hoja de estilo

#pagination-td { border-bottom: none; } 
Cuestiones relacionadas