2014-12-04 55 views
0

試圖孩子DIV基於數據進行排序屬性排序子格屬性

下面正在被CM生成的HTML代碼和數據可以在任何隨機順序進行檢索。

的HTML代碼是

<section class="box explore"> 
<div id="ProductContainer" class="row"> 
     <div id="1232132" data-name="B" data-category="Category_A" class="explore-cell"> 
     <h>B</h> 
     <p>Category_A</p> 
     </div> 
    <div id="123" data-name="A" data-category="Category_A" class="explore-cell"> 
     <h>A</h> 
     <p>Category_A</p> 
    </div> 
    <div id="1232152351" data-name="C" data-category="Category_A" class="explore-cell"> 
     <h>C</h> 
     <p>Category_A</p> 
    </div> 
    <div id="12342341" data-name="E" data-category="Category_B" class="explore-cell"> 
     <h>E</h> 
     <p>Category_B</p> 
    </div> 
    <div id="1325321" data-name="D" data-category="Category_B" class="explore-cell"> 
     <h>D</h> 
     <p>Category_B</p> 
    </div> 

</div> 

的java

$('div').sort(function (a, b) { 

    var contentA = $(a).attr('data-name'); 
    var contentB = $(b).attr('data-name'); 
    return (contentA < contentB) ? -1 : (contentA > contentB) ? 1 : 0; 

})

的jsfiddle http://jsfiddle.net/w8gkshue/

如果有人Ç點右邊的我直接指出如何按產品名稱或類別進行最佳排序。

更新希望可以得到較好的explination

+0

排序是什麼意義? – Madbreaks 2014-12-04 22:22:22

+0

您是否試圖根據您的排序重新定位dom元素? – LouisK 2014-12-04 22:28:43

+0

divs生成行和單元格的網格視圖,單元格出現故障。我試圖使用http://stackoverflow.com/questions/6133723/sort-divs-in-jquery-based-on-attribute-data-sort作爲一個起點,但沒有與字符串 – foO 2014-12-04 22:30:40

回答

1

可以使用的.sort方法這樣

var $wrapper = $('#ProductContainer'); 

$wrapper.find('.explore-cell').sort(function (a, b) { 
    return a.getAttribute('data-name') > b.getAttribute('data-name'); 
}) 
.appendTo($wrapper); 

,但我不知道有關跨瀏覽支持

+0

將工作將是最好的mtehod attech的div ID而不是類然後有多行類 – foO 2014-12-04 23:04:14

+0

多數民衆贊成那是真的,感謝您的建議 – 2014-12-04 23:13:52

+0

它不起作用,當你使用ID – foO 2014-12-04 23:15:49

1

編輯:我錯過了jQuery標籤...仍然保留答案。

var productCt = document.getElementById('ProductContainer'), 
 
    reInsertProductCt = tempRemove(productCt); 
 

 

 
[].slice.call(productCt.children) 
 
    .sort(function (a, b) { 
 
    var aName = a.dataset.name, 
 
     bName = b.dataset.name; 
 
    
 
    return aName < bName? -1 : +(aName > bName); 
 
    }) 
 
    .forEach(productCt.appendChild.bind(productCt)); 
 

 
reInsertProductCt(); 
 

 

 

 

 

 
function tempRemove(el) { 
 
    var parent = el.parentNode, 
 
     nextSibling = el.nextSibling; 
 
    
 
    parent.removeChild(el); 
 
    
 
    return function() { 
 
     if (nextSibling) parent.insertBefore(el, nextSibling); 
 
     else parent.appendChild(el); 
 
    }; 
 
}
<div id="ProductContainer" class="row"> 
 
     <div id="1232132" data-name="B" data-category="Category_A" class="explore-cell"> 
 
     <h>TEST NAME B</h> 
 
     <p>TEST</p> 
 
     </div> 
 
    <div id="123" data-name="A" data-category="Category_A" class="explore-cell"> 
 
     <h>TEST NAME A</h> 
 
     <p>TEST</p> 
 
    </div> 
 
    <div id="1232152351" data-name="C" data-category="Category_A" class="explore-cell"> 
 
     <h>TEST NAME C</h> 
 
     <p>TEST</p> 
 
    </div> 
 
    <div id="12342341" data-name="E" data-category="Category_B" class="explore-cell"> 
 
     <h>TEST NAME E</h> 
 
     <p>TEST</p> 
 
    </div> 
 
    <div id="1325321" data-name="D" data-category="Category_B" class="explore-cell"> 
 
     <h>TEST NAME D</h> 
 
     <p>TEST</p> 
 
    </div> 
 

 
</div>

0

僅調用排序它們實際上不會在視覺上改變DOM,它只是返回一個有序集合。所以基本上你只需要獲得收集,排序,然後返回。像這樣的東西應該工作:

$('#ProductContainer > div').detach().sort(function (a, b) { 
    var contentA = $(a).data('name'); 
    var contentB = $(b).data('name'); 
    return (contentA < contentB) ? -1 : (contentA > contentB) ? 1 : 0; 
}).appendTo('#ProductContainer'); 

你要確保你使用detach()方法,而不是remove()方法,如分離()將保留所有與收集相關的數據和事件項目。

0

爲什麼選擇按類別或按名稱進行排序?

我試圖編寫一個通用的multisort函數發生器,它也應該與本機數組排序功能一起工作。

JSFIDDLE HERE

生成該multisort一個函數,它有兩個參數。

  1. 列優先級列表順序(首先按類別或按名稱?您決定)。
  2. 我也想爲列提供值的方法(因爲你可能不會以相同的方式爲每個列檢索它們),它是一個對象,它爲每列描述一個檢索數據的函數。

function getMultisortFn(columns, provideColumnData) { 
    return function (a, b) { 
     for (var i = 0, l = columns.length; i < l; i++) { 
      var column = columns[i]; 
      var aColumnData = provideColumnData[column.name](a, column.name); 
      var bColumnData = provideColumnData[column.name](b, column.name); 
      if (aColumnData !== bColumnData) { 
       if (column.asc) { 
        return String.prototype.localeCompare.call(aColumnData, bColumnData); 
       } 

       return String.prototype.localeCompare.call(bColumnData, aColumnData);  
      } 
     } 
    }; 
} 

現在,這是你實際使用的multisort產生

function retrieveDataAttribute(item, attribute) { 
    return $(item).data(attribute); 
} 

var $container = $('#ProductContainer'); 
var $products = $container.find('div'); 

var multisort = getMultisortFn([{ 
     name: 'category', 
     asc: false 
    }, { 
     name: 'name', 
     asc: true 
    }], { 
     name: retrieveDataAttribute, 
     category: retrieveDataAttribute 
    }); 



$products.sort(multisort); 

最後的DOM操作應用新秩序

$products.detach().appendTo($container); 
部分

編輯感謝plalx

$container.detach().append($products).appendTo('section.box.explore'); 
+0

感謝您的例子 – foO 2014-12-05 12:46:00

+0

在追加它們之前,不需要分離'$ products'。此外,它是在追加產品之前要分離的'$容器',以避免多次重排。 – plalx 2014-12-05 14:31:17

+0

@plalx你是完全正確的!謝謝 – axelduch 2014-12-05 14:36:09