zoukankan      html  css  js  c++  java
  • jQuery DataTables插件分页允许输入页码跳转

    背景说明

    项目中使用jQuery DataTables插件来实现分页表格,但是默认的分页样式不能输入页码进行跳转,在页数非常多的时候使用很不方便,最主要的还是没有达到产品部门的设计要求,所以我需要寻找相应的解决方案。
     
    原始效果图
    20161227_01
    目标效果图
    20161227_02

    方案分析

    一开始,我在网上搜索到了相关资料。
     
    【官方】Navigation with text input
    这个是jQuery DataTables官方提供的插件,虽然实现了输入页码跳转的功能,但是和我目标效果不一致
     
    【CSDN】DataTables页码后面添加可输入页码跳转
    这个方案是直接修改jquery.datatables.js的源码,在原有分页的后面添加输入框,然后在表格加载完成事件fnDrawCallback中为输入框添加事件。
     
    本来,我想沿用官方的方式,单独写一个插件,这样不会污染DataTables插件原有代码,但是实在是水平有限,所以采用了CSDN直接修改插件代码的方式。
    • 在添加输入框的原理上和CSDN博客描述的一致
    • 但是对于事件的处理,不在fnDrawCallback中进行,而是直接在添加输入框之后,紧接着根据id对输入框和确认按钮进行事件设置
    • 而且CSDN博客中的事件代码在我这个版本的DataTables插件中无法执行,我转而参考了官方插件的事件代码,最终形成了我的方案

    插入代码

    注意:我使用的是DataTables 1.10.12版本,不同版本实现可能不同。
    [javascript] view plain copy
    1. // START 2016-12-27添加,用于输入分页页码  
    2. $(".gotoPage").remove();  
    3. var pageHtml = "<span class='gotoPage' style='margin-left: 10px;'>" +  
    4.         "<span>到第</span>" +  
    5.         "<input type='text' style=' 40px; padding-left: 2px; padding-right: 2px; text-align: center;' class='integer' id='textGotoPage' data-prev='"+(page+1)+"' value='"+(page+1)+"'>" +  
    6.         "<span>页</span>" +  
    7.         "<a class='paginate_button' style=' 40px; border-right: 1px solid #e4e4e4;' id='btnGotoPage'>确认</a>" +  
    8.         "</span>";  
    9. $(pageHtml).appendTo(container);  
    10.   
    11. // 对页码输入进行限制,只能输入数字  
    12. var sfn = function() {  
    13.     var value = $(this).val();  
    14.     if (value == '') {  
    15.         $(this).data("prev", $(this).val());  
    16.         return;  
    17.     }  
    18.   
    19.     var max = $(this).attr("maxlength");  
    20.     if (value.length > max)  
    21.         $(this).val(value.slice(0, max));  
    22.   
    23.     var regex = /^d+$/;  
    24.     if (!regex.test(value)) {  
    25.         $(this).val($(this).data("prev"));  
    26.     }  
    27.   
    28.     $(this).data("prev", $(this).val());  
    29. };  
    30.   
    31. var testinput = document.createElement('input');       
    32. if('oninput' in testinput){   
    33.     document.getElementById("textGotoPage").addEventListener("input", sfn, false);   
    34. else {  
    35.     $("#textGotoPage").onpropertychange = sfn;   
    36. }  
    37.   
    38. // 为确认按钮添加点击事件,执行分页跳转  
    39. $("#btnGotoPage").click(function(){  
    40.     var textGotoPage = $("#textGotoPage").val();  
    41.     if (textGotoPage == null || textGotoPage === '' || textGotoPage.match(/[^0-9]/)) {  
    42.         // 没有输入或者输入了非数字,清除非数字  
    43.         $("#textGotoPage").val(textGotoPage.replace(/[^d]/g, ''));  
    44.         return;  
    45.     }  
    46.   
    47.     if(parseInt(textGotoPage) > 0){  
    48.         var oSettings = settings;  
    49.   
    50.         var iNewStart = oSettings._iDisplayLength * (textGotoPage - 1);  
    51.         if (iNewStart < 0) {  
    52.             iNewStart = 0;  
    53.         }  
    54.         if (iNewStart >= oSettings.fnRecordsDisplay()) {  
    55.             iNewStart = (Math.ceil((oSettings.fnRecordsDisplay()) / oSettings._iDisplayLength) - 1) * oSettings._iDisplayLength;  
    56.         }  
    57.   
    58.         oSettings._iDisplayStart = iNewStart;  
    59.         _fnDraw(oSettings);  
    60.     }  
    61. });  
    62. // END 
  • 相关阅读:
    ssm之spring+springmvc+mybatis整合初探
    mybatis缓存之整合第三方缓存工具ehcache
    mybatis缓存之二级缓存
    mybatis缓存之一级缓存
    mybatis动态sql之利用sql标签抽取可重用的sql片段
    mybatis动态sql之bind标签
    mybatis动态sql之内置参数_parameter和_databaseId
    mybatis动态sql之使用foreach进行批量插入的两种方式
    mybatis动态sql之foreach补充(三)
    Visitor Pattern
  • 原文地址:https://www.cnblogs.com/qianzf/p/7475919.html
Copyright © 2011-2022 走看看