<a href="#" onclick="numsort()">sort by price</a>
<ul id="list">
<li><span class="n">green day</span> <span class="m">100$</span> <span class="time">2008-11-19</span></li>
<li><span class="n">green day</span> <span class="m">250$</span> <span class="time">2008-11-19</span></li>
<li><span class="n">green day</span> <span class="m">600$</span> <span class="time">2008-11-19</span></li>
<li><span class="n">green day</span> <span class="m">500$</span> <span class="time">2008-11-19</span></li>
<li><span class="n">green day</span> <span class="m">400$</span> <span class="time">2008-11-19</span></li>
<li><span class="n">green day</span> <span class="m">300$</span> <span class="time">2008-11-19</span></li>
<li><span class="n">green day</span> <span class="m">200$</span> <span class="time">2008-11-19</span></li>
</ul>
请问这个列表怎么用js按照价格排序 ,点击sort by date后,调用numsort(),请问该怎么写?

解决方案 »

  1.   

    先把数据提取出放进内存排号序,
    然后用oRemove = object.removeChild(oNode)
    这个把序列不对的行弄掉,再正确的地方append回去
      

  2.   

    <a href="#" onclick="numsort()">sort by price</a>
    <ul id="list">
    <li><span class="n">green day</span> <span class="m">100$</span> <span class="time">2008-11-19</span></li>
    <li><span class="n">green day</span> <span class="m">250$</span> <span class="time">2008-11-19</span></li>
    <li><span class="n">green day</span> <span class="m">600$</span> <span class="time">2008-11-19</span></li>
    <li><span class="n">green day</span> <span class="m">500$</span> <span class="time">2008-11-19</span></li>
    <li><span class="n">green day</span> <span class="m">400$</span> <span class="time">2008-11-19</span></li>
    <li><span class="n">green day</span> <span class="m">300$</span> <span class="time">2008-11-19</span></li>
    <li><span class="n">green day</span> <span class="m">200$</span> <span class="time">2008-11-19</span></li>
    </ul>
    <script>
    var l=document.getElementById("list")
    var list=l.getElementsByTagName("li"),n=list.length;
    var list2=[]
    for(var i=0;i<n;i++){
    var li=list[i];
    list2[i]={p:parseFloat(li.getElementsByTagName("span")[1].innerHTML),e:li}
    }function numsort(){
    list2.sort(function(o1,o2){return o1.p-o2.p})
    for(var i=0;i<n;i++){
    l.appendChild(list2[i].e);
    }
    }
    </script>
      

  3.   

    <script language="JavaScript"> 
    function numsort(){ 
        var obj=document.getElementById("list")
        var li =obj.getElementsByTagName("li");
        var m;
        for(var i=li.length-1;i>=0;i--){
            m=li[i];
            for(var j=i;j>=0;j--){
                if(li[j].getElementsByTagName("span")[1].innerHTML<
                     m.getElementsByTagName("span")[1].innerHTML){
                    m=li[j]
                }
            }
            obj.appendChild(m);
        }
        
    };
    </script> <a href="#" onclick="numsort()">sort by price</a>
    <ul id="list">
    <li><span class="n">green day</span> <span class="m">100$</span> <span class="time">2008-11-19</span></li>
    <li><span class="n">green day</span> <span class="m">250$</span> <span class="time">2008-11-19</span></li>
    <li><span class="n">green day</span> <span class="m">600$</span> <span class="time">2008-11-19</span></li>
    <li><span class="n">green day</span> <span class="m">500$</span> <span class="time">2008-11-19</span></li>
    <li><span class="n">green day</span> <span class="m">400$</span> <span class="time">2008-11-19</span></li>
    <li><span class="n">green day</span> <span class="m">300$</span> <span class="time">2008-11-19</span></li>
    <li><span class="n">green day</span> <span class="m">200$</span> <span class="time">2008-11-19</span></li>
    </ul>
      

  4.   

    谢谢两位大哥  那么按时间排序的思路是什么? 将时间转化为unix timestamp格式吗?
      

  5.   

    <script language="JavaScript"> 
    function numsort(){ 
        var obj=document.getElementById("list")
        var li =obj.getElementsByTagName("li");
        var m;
        for(var i=li.length-1;i>=0;i--){
            m=li[i];
            for(var j=i;j>=0;j--){
                var d1=new Date(li[j].getElementsByTagName("span")[2].innerHTML.replace("-","/"));
                var d2=new Date(m.getElementsByTagName("span")[2].innerHTML.replace("-","/"));
                if(d1<d2){
                    m=li[j]
                }
            }
            obj.appendChild(m);
        }
        
    };
    </script> <a href="#" onclick="numsort()">sort by price</a>
    <ul id="list">
    <li><span class="n">green day</span> <span class="m">100$</span> <span class="time">2008-11-19</span></li>
    <li><span class="n">green day</span> <span class="m">250$</span> <span class="time">2008-11-18</span></li>
    <li><span class="n">green day</span> <span class="m">600$</span> <span class="time">2008-11-17</span></li>
    <li><span class="n">green day</span> <span class="m">500$</span> <span class="time">2008-11-29</span></li>
    <li><span class="n">green day</span> <span class="m">400$</span> <span class="time">2008-11-10</span></li>
    <li><span class="n">green day</span> <span class="m">300$</span> <span class="time">2008-11-09</span></li>
    <li><span class="n">green day</span> <span class="m">200$</span> <span class="time">2008-11-14</span></li>
    </ul>
      

  6.   

    你那在IE8下是错误。我的下面CODE在IE8下也错误(IE其它版本未测试),但在FIREFOX 3.6中运行正常,原因是:document.getElementById("list").innerHTML在FF中输出正确,但在IE8.0中除了最后一行有“</li>”字符串外,前面所有的“</li>”都被IE8.0抹杀掉了—造成正则无法匹配。
    CODE:<a href="#" onclick="numsort(true)">sort by price</a><br><br>
    <a href="#" onclick="numsort(false)">sort by times</a><ul id="list">
    <li><span class="n">green day</span> <span class="m">100$</span> <span class="time">2008-11-19</span></li>
    <li><span class="n">green day</span> <span class="m">250$</span> <span class="time">2008-11-18</span></li>
    <li><span class="n">green day</span> <span class="m">600$</span> <span class="time">2008-11-17</span></li>
    <li><span class="n">green day</span> <span class="m">500$</span> <span class="time">2008-11-29</span></li>
    <li><span class="n">green day</span> <span class="m">400$</span> <span class="time">2008-11-10</span></li>
    <li><span class="n">green day</span> <span class="m">300$</span> <span class="time">2008-11-09</span></li>
    <li><span class="n">green day</span> <span class="m">200$</span> <span class="time">2008-11-14</span></li>
    </ul><script type=text/javascript>
    function numsort(bool){
        var i = bool ? 0 : 1,
        reg = bool ? new RegExp("[^>]+(?=\\$)","gi") : new RegExp("[^-]+(?=<\\/span>)","gi"),
        arr = document.getElementById("list").innerHTML.match(/<li[\S|\s]*?\/li>/g).sort(function(x,y){
                  return parseInt(x.match(reg)[i]) - parseInt(y.match(reg)[i])
        });
        document.getElementById("list").innerHTML = arr.join("");
    }
    </script>
      

  7.   

    干啥非得用正则?不太习惯用正则,看着晕……
    不用正则的代码如下,IE8可用  <a href="#" onclick="numsort(true)">sort by price </a> <br> <br> 
    <a href="#" onclick="numsort(false)">sort by times </a> <ul id="list"> 
    <li> <span class="n">green day </span> <span class="m">100$ </span> <span class="time">2008-11-19 </span></li> 
    <li> <span class="n">green day </span> <span class="m">250$ </span> <span class="time">2008-11-18 </span></li> 
    <li> <span class="n">green day </span> <span class="m">600$ </span> <span class="time">2008-11-17 </span></li> 
    <li> <span class="n">green day </span> <span class="m">500$ </span> <span class="time">2008-11-29 </span></li> 
    <li> <span class="n">green day </span> <span class="m">400$ </span> <span class="time">2008-11-10 </span></li> 
    <li> <span class="n">green day </span> <span class="m">300$ </span> <span class="time">2008-11-09 </span></li> 
    <li> <span class="n">green day </span> <span class="m">200$ </span> <span class="time">2008-11-14 </span></li> 
    </ul> <script type=text/javascript> 
    function numsort(bool){ 
        var field = bool ? 1 : 2; 
        var obj=document.getElementById("list");
    var li =obj.getElementsByTagName("li");
    var m,d1,d2;
        for(var i=li.length-1;i>=0;i--){
            m=li[i];
            for(var j=i;j>=0;j--){
    if(!bool) {
    d1=new Date(li[j].getElementsByTagName("span")[2].innerHTML.replace("-","/"));
    d2=new Date(m.getElementsByTagName("span")[2].innerHTML.replace("-","/"));
    } else {
    d1 = li[j].getElementsByTagName("span")[1].innerHTML;
    d2 = m.getElementsByTagName("span")[1].innerHTML;
    }
                if(d1<d2){
                    m=li[j]
                }
            }
            obj.appendChild(m);
        }

    </script>
      

  8.   

    脚本部分还可以再简化一点function numsort(bool){ 
        var field = bool ? 1 : 2; 
        var obj=document.getElementById("list");
    var li =obj.getElementsByTagName("li");
    var m;
        for(var i=li.length-1;i>=0;i--){
            m=li[i];
            for(var j=i;j>=0;j--){
    var d1 = bool ? li[j].getElementsByTagName("span")[1].innerHTML : new Date(li[j].getElementsByTagName("span")[2].innerHTML.replace("-","/"));
    var d2 = bool ? m.getElementsByTagName("span")[1].innerHTML : new Date(m.getElementsByTagName("span")[2].innerHTML.replace("-","/"));
                if(d1<d2){
                    m=li[j];
                }
            }
            obj.appendChild(m);
        }
      

  9.   

    按时间排序 已经解决了 用了json格式,谢谢大家的关注function datesort(){
    var obj=document.getElementById("list")
    var li =obj.getElementsByTagName("li");
    var li2 = new Array();
    for(var i=0;i<li.length;i++){
    var date = Date.parse(li[i].getElementsByTagName('span')[2].innerHTML.replace(/-/g,"/"));
    li2[i] = {t:date,e:li[i]};
    }
    li2.sort(function(o1, o2){return o1.t - o2.t});
    li2.reverse();
    for(var i=0;i<li.length;i++){
            obj.appendChild(li2[i].e);
        }}
      

  10.   

    return 10#,按时间排序应该采用你的new Date准确和简洁,但你那双重循环貌似比正则还晕。再就是数组join一次性inner HTML与for循环appendChild HTML效率相比呢?我是说最基本的思路。
    同时,我很想确定在IE8.0中“document.getElementById("list").innerHTML”获取字符串是否真的存在该问题(BUG),我把“ul”标签换成“div”也一样的,或者是我的IE8.0没安装好?还请帮忙“alert(document.getElementById("list").innerHTML)”一下下。