2016-01-10 3 views
0

Я пытаюсь создать плагин, подходящий для моих нужд, который добавляет некоторые функции в таблицы. Конечно, есть тысячи плагинов, таких как dataTables.js и т. Д., Но легкое решение более подходит для того, что я пытаюсь сделать.Создайте плагин jquery: запустите только один раз для каждого выбора

Задача (и): Если есть 2 таблицы или более, код выполняется несколько раз для каждой таблицы и, конечно, если вы фильтруете одну таблицу, разбивайте одну страницу на одну таблицу и меняете страницу каждого ... она применяется ко всем ,

Любая помощь была бы оценена, и если у вас есть идеи усовершенствования, они приветствуются! Как только я закончу, я опубликую это на github, если кто-то интересуется простой версией datatables ...!

https://jsfiddle.net/ygery/gm02mvpk/

function tableOptions(selector, paginate, npages, filter, responsive) { 

    var $table = $(selector); 
    var currentPage = 0; 

    function tablePaginate() { 
    $table.bind('paginate', { 
     pages: npages 
    }, function(event) { 
     $('.pagination').remove(); 
     // if(npages !=) 
     //alert(event.data.pages); 
     var $row = $table.find('tbody tr:not(.hidden)').addClass('row-pagination'); 
     $row.hide() 
     $row.slice(currentPage * npages, (currentPage + 1) * npages).show(); 
     var numRows = $table.find('.row-pagination').length; 

     var numPages = Math.ceil(numRows/npages); 
     var $pager = $('<ul class="pagination"></ul>'); 

     $('<li class="table-prev"></li>').html('<a href="#"><</a>').bind('click', { 
     prevPage: currentPage - 1 
     }, function(event) { 
     if (currentPage != 0) { 
      currentPage = event.data['prevPage']; 
      $table.trigger('paginate'); 
      $(this).addClass('active').siblings().removeClass('active'); 
      $(this).hide(); 
     } 

     }).appendTo($pager).addClass('clickable'); 

     for (var page = 0; page < numPages; page++) { 
     $('<li class="table-page" data-page=' + parseInt(page + 1) + '></li>').html('<a href="#">' + parseInt(page + 1) + '</a>').bind('click', { 
      newPage: page 
     }, function(event) { 

      currentPage = event.data['newPage']; 
      //$table.trigger('paginate'); 
      $(this).addClass('active').siblings().removeClass('active'); 
     }).appendTo($pager).addClass('clickable'); 
     } 

     $('<li class="table-next"></li>').html('<a href="#">></a>').bind('click', { 
     nextPage: currentPage + 1 
     }, function(event) { 
     if (currentPage != numPages - 1) { 
      currentPage = event.data['nextPage']; 
      //$table.trigger('paginate'); 
      $(this).addClass('active').siblings().removeClass('active'); 
     } 

     }).appendTo($pager).addClass('clickable'); 


     $pager.insertAfter($table); 
     if (currentPage == 0) { 
     $('.table-prev').addClass('disabled').attr('onclick', 'event.preventDefault();'); 
     } 
     if (currentPage == numPages - 1) { 
     $('.table-next').addClass('disabled').attr('onclick', 'event.preventDefault();'); 
     } 
     $('li[data-page="' + parseInt(currentPage + 1) + '"]').addClass('active'); 

     if (numPages > 5) { 
     var $this = parseInt(currentPage + 1); 
     $('.table-page').hide(); 
     if (currentPage == 0) { 
      currentPage = currentPage + 1; 
     } 
     for (var page = currentPage; page < currentPage + 2; page++) { 
      $('.table-page[data-page="' + parseInt(page + 1) + '"]').show(); 
      if (page == currentPage + 1) { 
      var dots = '<li class="disabled" onclick="event.preventDefault();"><a href="#">...</a></li>'; 
      $('.table-page[data-page="' + parseInt(page + 1) + '"]').after(dots); 
      } 
     } 
     for (var page = currentPage; page > currentPage - 1; page--) { 
      $('.table-page[data-page="' + parseInt(page) + '"]').show(); 
      //if(page == currentPage+1) { 
      // var dots = '<li class="disabled" onclick="event.preventDefault();"><a href="#">...</a></li>'; 
      // $('.table-page[data-page="'+parseInt(page - 1)+'"]').after(dots); 
      //} 
     } 
     } 

    }); 
    $table.trigger('paginate'); 
    } 

    function tableFilter() { 
    $(".table-search").keyup(function() { 
     $('li[data-page="1"]').click(); 
     var input = $(this); 
     var $row = $table.find('tbody tr'); 
     var $cell = $row.find('td'); 

     if (input.val() != '') { 
     $row.addClass('hidden').removeClass('row-pagination'); 
     $($cell).each(function(i, obj) { 
      if ($(obj).find('input').length) { 
      var $content = $(obj).find('input').val().toLowerCase().indexOf(input.val().toLowerCase()); 
      } else { 
      if ($(obj).find('select').length) { 
       var $content = $(obj).find('select option:selected').text().toLowerCase().indexOf(input.val().toLowerCase()); 
      } else { 
       if ($(obj).text().length) { 
       var $content = $(obj).text().toLowerCase().indexOf(input.val().toLowerCase()); 
       } else { 
       var $content = $(obj).html().toLowerCase().indexOf(input.val().toLowerCase()); 
       } 
      } 

      } 
      if ($content > -1 && input.val()) { 
      $(obj).parent().removeClass('hidden'); 
      $(obj).parent().addClass('row-pagination'); 
      } 
     }); 
     $table.trigger('paginate'); 

     } else { 
     $table.find('tr').removeClass('hidden').addClass('row-pagination'); 
     $table.trigger('paginate'); 
     } 

    }); 
    } 

    function tableResponsive() { 
    $(window).resize(function() { 
     if ($(window).width() < 767) { 
     if (!$('.responsive-toggle').length) { 
      $table.find('thead tr th:first-child').before('<td class="responsive-toggle"><i class="glyphicon glyphicon-phone"></i></td>'); 
      $table.find('tbody tr td:first-child').before('<td class="responsive-toggle"><i class="glyphicon glyphicon-menu-down"></i></td>'); 

     } 
     var max = $table.width(); 
     //alert(max); 
     } else { 
     $('.responsive-toggle').remove(); 
     } 
    }).resize(); 


    } 

    $table.each(function() { 
    if (paginate || filter) { 
     var $header = '<div class="col-sm-2 table-pagination-select"></div><div class="col-sm-6 table-options"></div><div class="col-sm-4 table-search-input"></div><hr />'; 
     $table.before($header); 
     $table.wrap('<div class="col-md-12"></div>'); 
    } 
    if (paginate) { 
     var $target = $('.table-pagination-select'); 
     var $select = '<select name="" id="" class="form-control table-select"><option value="10">10</option><option value="25">25</option><option value="50">50</option><option value="100">100</option><option value="all">Tous</option></select>'; 
     $($select).appendTo($target); 
     //$('.table-select').select2(); 
     tablePaginate(); 
    } 
    if (filter) { 
     var $target = $('.table-search-input'); 
     var $searcher = '<input type="text" class="form-control table-search" placeholder="Rechercher..." />'; 
     $($searcher).appendTo($target); 
     tableFilter(); 
    } 
    if (responsive) { 
     tableResponsive(); 
    } 



    }) 

} 

tableOptions('.table', true, 10, true, true); 
+1

Если вы хотите создать JQuery плагин, вы должны использовать '$ .fn.tableOptions = функция() {... } ', поэтому вы можете вызвать его, используя:' $ ('. table'). tableOptions() ' – jcubic

+0

Просто интересуйтесь функциональностью вашего плагина. Вы хотели бы описать это немного больше? мы можем общаться на https://chat.stackoverflow.com/rooms/100303/jquery-plugin-discussion-on-a-question – Sachin

+0

@jcubic - есть ли какие-либо документы о том, как создавать эти функции? Я видел этот синтаксис много, но я все еще учился! – YannickHelmut

ответ

1

Вы можете установить данные об объекте JQuery:

function tableOptions(selector, paginate, npages, filter, responsive) { 

    var $table = $(selector); 
    if ($table.data('table')) { 
    return; 
    } else { 
    $table.data('table', true); 
    } 
+0

Я, наверное, что-то пропустил, но это не работает ... не могли бы вы показать мне, как использовать это в jsfiddle?! Я построил функцию с $ .fn, спасибо вам, это намного больше смысла! – YannickHelmut

Смежные вопросы