最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

javascript 節(jié)點排序 2

 更新時間:2011年01月31日 19:02:09   作者:  
對支持sourceIndex的HTML文檔的節(jié)點重排,使用JK提供的思路,速度至少比單純使用nodes.sort(function(a,b){return a.sourceIndex - b.sourceIndex})這種方式快兩倍
復(fù)制代碼 代碼如下:

//靈感來自
//http://www.cnblogs.com/jkisjk/archive/2011/01/28/array_quickly_sortby.html
var hasDuplicate = false;
var sortBy = function(nodes){
var result = [], array = [], n = nodes.length, i = n, node;
while(node = nodes[--n]){
(array[n] = new Number(~~node.sourceIndex))._ = node;
}
array.sort(function(a,b){
if(a === b) hasDuplicate = true;
return a - b ;
});
while( i )
result[--i] = array[i]._;
return result;
}

但標準瀏覽器不支持這屬性,在IE中,XML文檔也沒有此屬性,這時就需要跟據(jù)節(jié)點的parentNode與nextSibling,但如果單單是兩兩比較,速度是提升不了的。因此我們就轉(zhuǎn)而比較最近公共祖先的孩子們的順序了。這時,算法的威力就體現(xiàn)出來了。這是第一版,根據(jù)某一朋友提供的LCA搞出來的東西,當然大體思路還是歸功于JK大神。但實際效果不如意,比jQuery的那個sortOrder慢,估計問題出在求LCA上。
復(fù)制代碼 代碼如下:

//根據(jù)這里JK提供的思路
//http://www.cnblogs.com/rubylouvre/archive/2011/01/28/1947286.html#2020900
var tick = 0, hasDuplicate = false;
var Rage = {
//form http://www.cnblogs.com/GrayZhang/archive/2010/12/29/find-closest-common-parent.html
getLCA:function(nodes){
var hash = {}, i = 0,
attr = "data-find"+(++tick),
length = nodes.length,
node,
parent,
counter = 0,
uuid;
while(node = nodes[i++]){
parent = node;
while(parent){
if(parent.nodeType === 1){
break;
}
uuid = parent.getAttribute(attr);
if(!uuid){
uuid = "_" + (++counter);
parent.setAttribute(attr,uuid);
hash[uuid] = {node:parent,count:1};
}else{
hash[uuid].count ++;
}
parent = parent.parentNode;
}
}
for(var i in hash){
if(hash[i].count === length){
return hash[i].node;
}
}
},
getList : function(nodes,parent){//獲取當前元素到最近公共祖先間的所有祖先,包括自己
var list = [];
while(node){
if(node === parent){
break;
}
list.unshift(node);
node = node.parentNode;
}
return list;
},
getLists : function(){
var lists = [], getList = Rage.getList, i=0, node, list;
while(node = nodes[i++]){
list = getList(node,parent);
if(list.length){
lists[ lists.length ] = list;
}
}
return lists;
},
sortList : function(a,b){
var n = Math.min(a.length,b.length),ap,bp;
for(var i=0; i < n; i++){
ap = a[i],bp = b[i]
if(ap !== bp){
while(ap = ap.nextSibling){
if(ap === bp){
return -1
}
}
return 1
}
}
return a.length-b.length;
},
uniqueSort : function(nodes){
var length = nodes.length;
var LCA = Rage.getLCA(nodes);
var lists = Rage.getLists(nodes,LCA);
lists.sort(Rage.sortList);
var list, i = 0, result = [];
while(list = lists[i++]){
result[result.length] list.pop();
}
if(result.length !== length){
result.unshift(LAC);
if(result.length != length){
hasDuplicate = true;
}
}
return result;
}
}

下面是第二版,經(jīng)過改進,終于比jQuery的那個快上三倍(測試對象為擁有260多個節(jié)點的文檔)
復(fù)制代碼 代碼如下:

var hasDuplicate = false;
var Rage = {
getList : function(node){
var list = [];
while(node){
if(node.nodeType === 9){
break;
}
list.unshift(node);
node = node.parentNode;
}
return list;
},
getLists : function(nodes){
var lists = [], getList = Rage.getList, i=0, node;
while(node = nodes[i++]){
lists[ lists.length ] = getList(node);
}
return lists;
},
sliceList : function(lists,num){
var result = [], i = 0, list;
while(list = lists[i++]){
list = list.slice(num);
if(list.length){
result[ result.length ] = list;
}
}
return result;
},
sortList : function(a,b){
var n = Math.min(a.length,b.length),ap,bp;
for(var i=0; i < n; i++){
ap = a[i],bp = b[i]
if(ap !== bp){
while(ap = ap.nextSibling){
if(ap === bp){
return -1
}
}
return 1
}
}
return a.length-b.length;
},
uniqueSort : function(nodes){
var length = nodes.length;
var lists = Rage.getLists(nodes);
lists.sort(function(a,b){
return a.length - b.length;
});
var depth = lists[0].length, length = lists.length, parent, cut, ii = 0;
for(var i =0; i < depth; i++){
parent = lists[0][i];
cut = true;
for(var j = 1;j < length; j++){
if(parent !== lists[j][i]){
cut = false;
break;
}
}
if(cut){
ii++
}else{
break;
}
}
var LCA = lists[0][ii-1];
lists = Rage.sliceList(lists,ii);
lists.sort(Rage.sortList);
var list, i = 0, result = [];
while(list = lists[i++]){
result[result.length] = list.pop();
}
if(result.length !== length){
result.unshift(LCA);
if(result.length != length){
hasDuplicate = true;
}
}
return result;
}
}

相關(guān)文章

  • TableSort.js表格排序插件使用方法詳解

    TableSort.js表格排序插件使用方法詳解

    這篇文章主要為大家詳細介紹了TableSort.js表格排序插件的使用方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-02-02
  • js實現(xiàn)跨域訪問的三種方法

    js實現(xiàn)跨域訪問的三種方法

    這篇文章主要介紹了js實現(xiàn)跨域訪問的三種方法,包括基于iframe實現(xiàn)跨域、基于script標簽實現(xiàn)跨域以及后臺代理方式 ,感興趣的小伙伴們可以參考一下
    2015-12-12
  • JavaScript?WebSocket實現(xiàn)實時雙向聊天

    JavaScript?WebSocket實現(xiàn)實時雙向聊天

    這篇文章主要為大家詳細介紹了如何基于JavaScript?WebSocket實現(xiàn)實時雙向聊天,文中的示例代碼講解詳細,有需要的小伙伴可以參考一下
    2024-04-04
  • JS中FRAME的操作問題實例分析

    JS中FRAME的操作問題實例分析

    這篇文章主要介紹了JS中FRAME的操作問題實例分析,詳細講述了js針對frame框架操作中的各種訪問問題,需要的朋友可以參考下
    2014-10-10
  • 老生常談JavaScript中的this關(guān)鍵字

    老生常談JavaScript中的this關(guān)鍵字

    相對于很多其他的面向?qū)ο笳Z言來說,this代表的就是當前對象。本篇文章通過實例給大家介紹js中的this關(guān)鍵字,感興趣的朋友一起看看吧
    2016-10-10
  • js給頁面加style無效果的解決方法

    js給頁面加style無效果的解決方法

    js給頁面加style沒有效果的情況,想必大家都有見到吧,下面有個不錯的解決方法,大家可以參考下
    2014-01-01
  • 在多個頁面使用同一個HTML片段《續(xù)》

    在多個頁面使用同一個HTML片段《續(xù)》

    上一篇文章中我們使用textarea來模擬AJAX的返回結(jié)果,造成了一些誤解。 這里我們首先用asp.net的Generic Handler做一個簡單的后臺來重現(xiàn)這個AJAX過程。
    2011-03-03
  • 利用vscode調(diào)試編譯后的js代碼詳解

    利用vscode調(diào)試編譯后的js代碼詳解

    看了網(wǎng)上好多在vscode上調(diào)試javascript的代碼,總是出現(xiàn)問題,索性自己寫一個,下面這篇文章主要給大家介紹了關(guān)于如何利用vscode調(diào)試編譯后的js代碼的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們一起來看看吧
    2018-05-05
  • 原生js實現(xiàn)鼠標跟隨效果

    原生js實現(xiàn)鼠標跟隨效果

    本文主要分享了原生js實現(xiàn)鼠標跟隨效果的實例,具有很好的參考價值,下面跟著小編一起來看下吧
    2017-02-02
  • JavaScript之filter_動力節(jié)點Java學(xué)院整理

    JavaScript之filter_動力節(jié)點Java學(xué)院整理

    filter也是一個常用的操作,它用于把Array的某些元素過濾掉,然后返回剩下的元素。下面通過實例代碼給大家簡答介紹下javascript中的filter,需要的的朋友參考下吧
    2017-06-06

最新評論

新沂市| 浦江县| 鹤岗市| 启东市| 嵩明县| 澎湖县| 义马市| 洱源县| 柞水县| 宁波市| 常州市| 长沙市| 水富县| 成安县| 同德县| 揭阳市| 修武县| 闽侯县| 壶关县| 改则县| 南召县| 青浦区| 文成县| 巴彦淖尔市| 霍城县| 余庆县| 临湘市| 望都县| 桃源县| 和田市| 东明县| 康乐县| 阿鲁科尔沁旗| 荃湾区| 临沭县| 裕民县| 枣阳市| 泽库县| 泽州县| 明溪县| 宁明县|