タグ付けされた要素の任意のセットをソートする単純な JavaScript 関数を次に示します。
function sortElements(parentId, tagClass) {
var itemsToSort, p = document.getElementById(parentId);
if (p.getElementsByClassName) {
itemsToSort = p.getElementsByClassName(tagClass);
} else {
itemsToSort = getElementsByClassName(tagClass, "*", p);
}
// get all data into a sortable array
var data = [], order = [], item, placeHolder, i;
for (i = 0; i < itemsToSort.length; i++) {
item = itemsToSort[i];
// save position of item by inserting a placeholder right before it
placeHolder = document.createElement(item.tagName);
item.parentNode.insertBefore(placeHolder, item);
order.push(placeHolder);
// save item and text
data.push({obj: item, text: strTrim(item.innerHTML)});
}
// sort the item array by the text
data.sort(function(a, b) {
return(a.text.localeCompare(b.text));
});
// now reinsert items in sorted order
for (i = 0; i < data.length; i++) {
item = data[i].obj;
placeHolder = order[i];
// insert in new location
placeHolder.parentNode.insertBefore(item, placeHolder);
// remove placeholder
placeHolder.parentNode.removeChild(placeHolder);
}
}
function strTrim(str) {
return(str.replace(/^\s+/, "").replace(/\s+$/, ""));
}
// replacement for older versions of IE
function getElementsByClassName(className, tag, elm){
var testClass = new RegExp("(^|\\s)" + className + "(\\s|$)");
var tag = tag || "*";
var elm = elm || document;
var elements = (tag == "*" && elm.all)? elm.all : elm.getElementsByTagName(tag);
var returnElements = [];
var current;
var length = elements.length;
for(var i=0; i<length; i++){
current = elements[i];
if(testClass.test(current.className)){
returnElements.push(current);
}
}
return returnElements;
}
http://jsfiddle.net/jfriend00/EztNw/で動作を確認できます。このデモでは、関数が要素の任意のセットで機能することを示すために、OP のテーブル セルと順序付きリストを並べ替えることを示しています。
私が認識している唯一の制限は、タグ付き要素を他のタグ付き要素の子にすることはできないということです。テーブル内のセルに適しています。
これも使用するgetElementsByClassName()
ため、古いバージョンの IE が必要な場合は、その代替/シムが追加されます (これは jsFiddle に含まれています)。
これがどのように機能するかは次のとおりです。
- 並べ替えたいすべてのオブジェクトのリストを取得する
- 各項目が現在配置されている場所に一時的なプレースホルダー オブジェクトを配置して、ソートされた順序で元に戻す場所がわかるようにします
- 並べ替えるオブジェクトの配列と並べ替えキー (この場合はテキスト) を作成します。
- その配列をソートする
- プレースホルダーを使用して、ソートされたオブジェクトを現在ソートされている順序で再挿入します。スロットが使用された後、プレースホルダーを削除します。
</p>