【问题标题】:javascript sort of HTML elementsjavascript 类型的 HTML 元素
【发布时间】:2012-04-28 11:53:07
【问题描述】:

我正在尝试对 li 元素进行排序并得到一个意外的结果 我需要排序3次才能正确得到,

我哪里弄错了? javascript

var sort_by_name = function(a, b) {
    return a.innerHTML.toLowerCase() > b.innerHTML.toLowerCase();
}
$this = $("ol#table1");
var list = $this.children();
list.sort(sort_by_name);
console.log(list);
$this.html(list);

HTML

<ol id="table1" style="display: block; ">
   <li class="menu__run">I</li>
   <li class="menu__run">IXX</li>
   <li class="menu__run">I</li>
   <li class="menu__run">I</li>
   <li class="menu__run">I</li>
   <li class="menu__run">I</li>
   <li class="menu__run">I</li>
   <li class="menu__run">I</li> 
   <li class="menu__run">IXX</li>
   <li class="menu__run">I</li>
   <li class="menu__run">I</li>
   <li class="menu__run">I</li>
   <li class="menu__run">I</li>
   <li class="menu__run">I</li>
   <li class="menu__test">st</li>
   <li class="menu__test">st</li>
   <li class="menu__test">st</li>
</ol>

fiddle example

【问题讨论】:

    标签: javascript jquery sorting


    【解决方案1】:

    有更好的排序方法。

    1. 您需要一个返回正确值的比较函数:-1、0 和 1。
    2. localeCompare()就是这样一个比较函数。
    3. 您可以只移动 DOM 元素而不是重新生成 HTML。
    4. 您可以直接在原始选择器中获取 LI 元素。
    5. "#table1" 是比 "ol#table1" 更高效的选择器。

    我建议这样做:

    $("div#btn").click(function() {
        var sort_by_name = function(a, b) {
            return a.innerHTML.toLowerCase().localeCompare(b.innerHTML.toLowerCase());
        }
    
        var list = $("#table1 > li").get();
        list.sort(sort_by_name);
        for (var i = 0; i < list.length; i++) {
            list[i].parentNode.appendChild(list[i]);
        }
    });​
    

    你可以在这里看到工作:http://jsfiddle.net/jfriend00/yqd3w/

    【讨论】:

    • 你可以为不同的
      s下的对象做这样的事情吗?
    • @shevski - 我确信也可以对另一个场景进行排序,但您必须显示 HTML 并描述您希望它排序的内容。
    • 我再问一个问题
    • 您正在比较人眼,因此您想忽略所有标记。您想要比较的是.textContent,而不是.innerHTML,它只查看呈现为用户可见的文本数据。
    • @Mike'Pomax'Kamermans - 是的,这完全取决于 OP 他们想要排序的内容,但.textContent 确实是一个不错的选择。
    【解决方案2】:

    custom compareFunction 需要返回 -1、0 或 1。

    function sort_by_name(a, b) {
        var sa = a.innerHTML.toLowerCase(), sb = b.innerHTML.toLowerCase();
        return sb<sa ? -1 : sb>sa ? 1 : 0;
    }
    

    【讨论】:

      【解决方案3】:
      var sort_by_name = function(a, b) {
          return $(a).text().toLowerCase().localeCompare($(b).text().toLowerCase());
      }
      

      您可以改用 localeCompare 来使事情变得更加优雅和可行。

      见 jsfiddle http://jsfiddle.net/Qww87/11/

      【讨论】:

        【解决方案4】:

        根据文档,它需要数值。 更容易理解:

            var sort_by_name = function(a, b) {
                 if(a.innerHTML.toLowerCase() < b.innerHTML.toLowerCase()) return -1;
                 if(a.innerHTML.toLowerCase() > b.innerHTML.toLowerCase()) return 1;
                 return 0;
            }
        

        【讨论】:

          【解决方案5】:

          使用我的 jquery 插件排序内容:

             $('ol#table1').sortContent({asc:true})
          

          就是这样!

          演示: http://jsfiddle.net/abdennour/SjWXU/

          【讨论】:

          • 您的仓库不再可用。
          猜你喜欢
          相关资源
          最近更新 更多
          热门标签