Javascript 使用相邻元素在DOM中排序

Javascript 使用相邻元素在DOM中排序,javascript,jquery,dom,sorting,plugins,Javascript,Jquery,Dom,Sorting,Plugins,我有下面的DOM结构,我想根据创建的数据属性对其进行排序 <a id="comment-34" href="#"/> <li data-created="12342342" /> <a id="comment-35" href="#"/> <li data-created="89342342" /> <a id="comment-36" href="#"/> <li data-created="45363342" />

我有下面的DOM结构,我想根据创建的
数据
属性对其进行排序

<a id="comment-34" href="#"/>
<li data-created="12342342" />

<a id="comment-35" href="#"/>
<li data-created="89342342" />

<a id="comment-36" href="#"/> 
<li data-created="45363342" />
然而,排序之后发生的是
,但它可能会遇到相同的问题

有办法吗?同样,我不能将
  • 包装在外部
    中。我也不想动态包装
    ,以便使用tsort


    任何干净的溶液:-)?

    你不可能真正拥有
  • 编辑:更简单的版本:)


    像这样的东西应该适合你:

    var elms = [];
    $('a').each(function() { //create the array of a and li
        var pair = {
            aTag: $(this),
            liTag: $(this).next("li")
        };
        elms.push(pair);
    });
    $("a, li").detach(); //detach them from the dom
    elms.sort(function(a, b) {
        return a.liTag.data("created") < b.liTag.data("created"); //sort based upon the created data
    });
    
    $.each(elms , function(){
        $("ul").append(this.aTag).append(this.liTag); //push them back to the dom.
    });
    
    var-elms=[];
    $('a')。each(function(){//创建a和li的数组
    变量对={
    aTag:$(本次),
    利塔格:$(本).next(“李”)
    };
    榆树推(对);
    });
    $(“a,li”).detach()//将它们从dom中分离
    elms.sort(函数(a,b){
    返回a.liTag.data(“已创建”)

    继续编码示例。

    a元素移动到其各自的列表项中。那么你应该能够使用你提到的那种


    即使将元素作为兄弟元素是有效的,我仍然觉得它的形式很糟糕。

    FYI,这不是有效的HTML。不可能将
    li
    a
    元素作为兄弟元素。据我所知,这是有效的HTML。例如,在
  • 之前的
    可以用作锚。唯一可以包含li元素的元素是OL和UL,两者都不能包含A元素。@ikegami在调查中我发现你是正确的。HTML验证程序也会抱怨。我喜欢这个解决方案。它很干净。同时使用detach()和remove()值得称赞。谢谢。我们在同一分钟有完全相同的想法吗?关于分离()的想法很好。
    
    var items = [];
    $('#sortme a').each(function(){
    
      // grab the element and its next sibling
      var self = $(this)
        , next = self.next('div');
    
      items.push([
        self.remove().get(0),
        next.remove().get(0)
      ]);
    });
    
    items.sort(function(a,b){
      return a[1].getAttribute('data-created') > b[1].getAttribute('data-created');
    });
    
    $.each(items, function(){
      $('#sortme').append(this[0], this[1]);
    });
    
    var sorted = $('#sortme');
    
    sorted.find('div')
      .sort(function(a,b){
        return $(a).data('created') > $(b).data('created');
      })
      .each(function(){
        $(this).prev('a').andSelf().appendTo(sorted);
      });
    
    var elms = [];
    $('a').each(function() { //create the array of a and li
        var pair = {
            aTag: $(this),
            liTag: $(this).next("li")
        };
        elms.push(pair);
    });
    $("a, li").detach(); //detach them from the dom
    elms.sort(function(a, b) {
        return a.liTag.data("created") < b.liTag.data("created"); //sort based upon the created data
    });
    
    $.each(elms , function(){
        $("ul").append(this.aTag).append(this.liTag); //push them back to the dom.
    });