zoukankan      html  css  js  c++  java
  • 可以对任意有规律可循的静态内容进行排序的Jquery插件

         今天发现有人写了一个可以静态对内容进行排序的jquery插件,我测试了一下发现非常让人失望,因为他只能对最简单的table(div都不行)进行排序,哪怕是table稍微有点不对称就没办法了.鉴于此我决定重新开发一个功能更强的,先看下邊的演示效果吧.

    上图中的六个按钮分别对应了按鈕下方的六列数据.

         理论上讲只要是有规律可循的内容都能排序,我采用的核心思想就是js的sort函数,该函数要求被排序对象必须是Array,所以只要我们把那些需要排序的内容找出规律放入array就行了.不管对方的排版有多么混乱也不管需要排列的值是整数,浮点数,字符串或时间,只要有规律存在我们就能排序,听起来很玄乎哈,其实还好了,这可是我的大脑奋斗了一晚上的结晶.

        或许有童鞋会问为什么不直接使用sql的order by来排序,其实原因很简单,那就是当我们在使用ajax多次载入同种类型的数据时order by无能为力.那为什么要ajax多次载入呢?为何不一次载入然后直接order by?想象一下如果你的列表内有几万乃至上百万条数据的时候吧!在这种状况下如果还是一次载入那实在让我没什么可说的了.恐怕你得让浏览你网站的人使用小型机或中型机了,因为PC已经是没有办法胜任了.或许还会有人问,既然这么多数据为何不分页呢?我的回答是既然你决定要分页那你还要用ajax干嘛.

         下边的例子内包含插件的代码和六种不同的调用方式,另外请注意传值的方式,尤其是txt这个参数的传值方式分为两种模式,第一种模式是传递字符串型的数据,第二种模式是传递Array型的数据,另外还需要注意一下回调函数的使用.

    好了我贴出代码来给大家看一下.欢迎转载但请注明出处Email:See7di@Gmail.com,Seven的部落格http://hi.baidu.com/see7di/home

    <!DOCTYPE html PUBLIC "-//W3C//Dli XHTML 1.0 ulansitional//EN" "http://www.w3.org/ul/xhtml1/Dli/xhtml1-ulansitional.dli">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <title>Order</title>
    <script src="jquery-1.5.2.min.js" type="text/javascript"></script>
    <script src="Order.js" type="text/javascript"></script>
    <style type='text/css'>
    body{
        background-color:#FFF;
        font-size:12px;
    }
    ul{clear:both;}
    li{
        list-style:none;float:left;14%;
    }
    .aa{
        font-size:14px;color:blue;
    }
    </style>
    <script type="text/javascript">
    /*************************************************
    说明:對有規律可循的列表內容進行排序
    使用:
    1、分別設置好三個參數bos;lst;txt
    2、參照下邊的例子進行調用就行了
    注意:
    如果發現排序不准確,則說明你的三個參數設置有錯誤
    **************************************************/
    (function($){

        $.Order=function(_opt){
            var _use=false;
            var _box=_opt.box;        //盒子的抓取依據,需要排序的列表被包含在此容器內
            var _lst=_opt.lst;        //lst是即將要被重新排序的列表的抓取依據
            var _txt=_opt.txt;        //txt用來抓取排序參照值,如果很簡單則可以將該值設為字符串,如果比較複雜則建議你用Array,Array將被拆分為多層的children()來進行精確定位

            //如果沒有排序進程則執行排序
            if(!_use){
                _use=true;by=_box.data('by');
                _lst.sort(function Dosort(l1,l2){
                    if(_txt.constructor==window.Array){
                        var _tmp='';
                        for(i=0;i<_txt.length;i++){_tmp+='.children("'+_txt[i]+'")';}
                        var a='$.trim($(l1)'+_tmp+'.text())';
                        var b='$.trim($(l2)'+_tmp+'.text())';
                        _tmp=null;a=eval(a);b=eval(b);
                    }else{
                        var a=$.trim($(l1).children(_txt).text());
                        var b=$.trim($(l2).children(_txt).text());
                    }
                    
                    if(a==b){return 0;}
                    var isDt=IsTime(a) && IsTime(b);
                    if(isDt){
                        var tim1=new Date(a.replace(/-/g,"/"));
                        var tim2=new Date(b.replace(/-/g,"/"));
                        if(tim1.getTime() > tim2.getTime()){
                            return (by=='up')?1:-1;
                        }else{
                            return (by=='up')?-1:1;
                        }
                    }else if(isNaN(a) || isNaN(b)){
                        return (by=='up')?a.localeCompare(b):b.localeCompare(a);
                    }else{
                        if(a-b > 0){
                            return (by=='up')?1:-1;
                        }else{
                            return (by=='up')?-1:1;
                        }
                    }
                });
                _box.append(_lst).data('by',(by=='up'?'':'up'));
                CallBack();
                _use=false;
            }

            //判斷內容是否為時間
            function IsTime(dateString){
                dateString=$.trim(dateString);
                if(dateString==null && dateString.length==0){return false;}
                dateString=dateString.replace(/\//g,"-");
                var reg=/^(\d{1,4})(-|\/)(\d{1,2})\2(\d{1,2}) (\d{1,2}):(\d{1,2}):(\d{1,2})$/;
                var r=dateString.match(reg);
                if(r==null){
                    var reg=/^(\d{1,4})(-|\/)(\d{1,2})\2(\d{1,2})$/;
                    var r=dateString.match(reg);
                }
                return r!=null;
            }

            //排序完成後的囘調函數
            //返回:_box對象,_lst對象,_txt字符串或數組
            function CallBack(){
                if(_opt.end!=null){_opt.end(_box,_lst,_txt);}
            }
        }
    })(jQuery)

    $(function(){

        $('#h1').click(function(){
            $.Order({
                //盒子的抓取依據,需要排序的列表被包含在此容器內
                box:$('#d1'),
                //lst是即將要被重新排序的列表的抓取依據
                lst:$('#d1 ul'),
                //txt用來抓取排序參照值,如果很簡單則可以將該值設為字符串,如果比較複雜則建議你用Array,Array將被拆分為多層的children()來進行精確定位
                txt:new Array('li:eq(0)','span','strong','.aa'),
                end:function(box,lst,txt){
                    alert(lst.selector+"內有"+lst.length+"個列表!\n "+lst.selector+"的內容是:\n"+lst.text());
                    alert('box的選擇器為:'+box.selector+'\nlst的選擇器為:'+lst.selector+'\ntxt的內容為:'+txt);
                }
            })
        });
        
        $('#h2').click(function(){
            $.Order({
                box:$('#d1'),
                lst:$('#d1 ul'),
                txt:'li:eq(1)',
                end:function(box,lst,txt){
                    lst.children('li:nth-child(2)').css({'color':'blue','font-weight':'bold'});
                }
            })
        });
        
        $('#h3').click(function(){
            $.Order({
                box:$('#d1'),
                lst:$('#d1 ul'),
                txt:'li:eq(2)',
                end:function(box,lst,txt){
                    lst.children('li:nth-child(3)').css('color','blue');
                }
            })
        });
        
        $('#h4').click(function(){
            $.Order({
                box:$('#d1'),
                lst:$('#d1 ul'),
                txt:'li:eq(3)',
                end:function(box,lst,txt){
                    alert('box的選擇器為:'+box.selector+'\nlst的選擇器為:'+lst.selector+'\ntxt的內容為:'+txt);
                }
            })
        });
        
        $('#h5').click(function(){
            $.Order({
                box:$('#d1'),
                lst:$('#d1 ul'),
                txt:'li:eq(4)',
            })
        });
        
        $('#h6').click(function(){
            $.Order({
                box:$('#d1'),
                lst:$('#d1 ul'),
                txt:'li:eq(5)',
                end:function(box,lst,txt){
                    lst.children('li:nth-child(5)').css('color','orange');
                    lst.children('li:nth-child(6)').prepend(">");
                }
            })
        });
    });
    </script>
    </head>
    <body>

    <fieldset>
        <legend>Example</legend>
        <input type='button' value='1' id='h1'>
        <input type='button' value='2' id='h2'>
        <input type='button' value='3' id='h3'>
        <input type='button' value='4' id='h4'>
        <input type='button' value='5' id='h5'>
        <input type='button' value='6' id='h6'>
        <div id="d1">
            <ul>
                <li><span>Id:<strong><span class='aa'>3</span></strong></span></li>
                <li>0.811903307592451</li>
                <li>2010-11-28 11:11:45</li>
                <li>埃及</li>
                <li>ff</li>
                <li>222</li>
            </ul>
            <ul>
                <li><span>順序:<strong><span class='aa'>1</span></strong></span></li>
                <li>0.317953918742926</li>
                <li>2011-6-23 11:11:45</li>
                <li>a很強</li>
                <li>dd</li>
                <li>111</li>
            </ul>
            <ul>
                <li><span>序號:<strong><span class='aa'>4</span></strong></span></li>
                <li>0.893289602311929</li>
                <li>2011-6-9 11:11:45</li>
                <li>TVBS</li>
                <li>aa</li>
                <li>333</li>
            </ul>
            <ul>
                <li><span>XH:<strong><span class='aa'>2</span></strong></span></li>
                <li>0.936839872802068</li>
                <li>2010-12-24 11:11:45</li>
                <li>雅虎奇摩</li>
                <li>bb</li>
                <li>555</li>
            </ul>
            <ul>
                <li><span>BH:<strong><span class='aa'>5</span></strong></span></li>
                <li>0.176848827012279</li>
                <li>2011-11-13 11:11:45</li>
                <li>易居網</li>
                <li>ee</li>
                <li>444</li>
            </ul>
            <ul>
                <li><span>編號:<strong><span class='aa'>6</span></strong></span></li>
                <li>0.307295758885935</li>
                <li>2011-1-20 11:11:45</li>
                <li>埃1及</li>
                <li>cc</li>
                <li>000</li>
            </ul>
        </div>
    </fieldset>
    </body>
    </html>

  • 相关阅读:
    整数m去掉n位后剩下最大(小)值
    蛇形矩阵(二)
    Kibana源码启动报错记录--ENOSPC
    Kibana问题记录:yarn test 运行报错 error Trailing spaces not allowed no-trailing-spaces
    Vim 编辑器中全选操作
    Ubuntu系统中连接TFS的Git地址注意事项
    Ubuntu系统升级遇到问题记录
    Kibana6.2.x 插件理解
    Kibana问题搜集---下载源码,执行npm install 报错
    Kibana6.2.2源码入口
  • 原文地址:https://www.cnblogs.com/see7di/p/2239672.html
Copyright © 2011-2022 走看看