2012-12-17 31 views
0

我有一個可以在dom中重新排列的單詞列表,我需要按特定順序抓住每個單詞。我(有點)計算了我需要它們的順序,並使用jQuery將該數字用作它們的Id。爲每個()元素按Id排序,而不是dom位置運行函數

我的問題是我如何通過每個人都從最低編號的Id開始,以最高結束?

的HTML看起來是這樣的:

<span class="chosenword" id="577.9848041534424" style="position: absolute; top: 320px; left: 442.9999694824219px; z-index: 1;">Word!</span> 

和JS是這樣的:

$('.chosenword').each(function(){ 
    var position = $(this).position(); 
    var id = ((position.left) * (position.top)); 
    $(this).attr('id', id); 
    var chosenword = $(this).html(); 


    $('#chosenwords').append(chosenword); 
    $('#chosenwords').append(" "); 
    }); 

請注意,我沒有真正抓住具有ID,這樣我可以在環繞跨度抓住他們後不會重新排列他們,至少我不想。

任何想法?

+0

啊......你能不能他們輸出到DOM排序,以開始?我認爲你所要做的將是非常低效的。 –

回答

2

.sort()他們先,然後用.each()像你循環正在已經做:

$($('.chosenword').toArray().sort(function(a,b){return +a.id - b.id;})).each(function(){ 
    // your existing code here 
}); 

或者如果緩存jQuery對象,你可以在地方對它進行排序,從而節省您不必後創建另一個jQuery對象排序:

var $chosen = $('.chosenword'); 
[].sort.call($chosen, function(a,b){return +a.id - b.id;}); 
$chosen.each(function() { 
    // your existing code here 
}); 
+1

jQuery將'Array.prototype.sort'放入'$ .fn'中 - 您可以調用'$('。chosenword')。sort' – Dennis

+0

@Dennis - 我沒有意識到這一點。謝謝。現在您已經指出了我的觀點,並且在文檔中看不到它,並且在jquery.js中它有一條評論「僅供內部使用」。 - 所以是的,它會工作,但jQuery團隊似乎沒有鼓勵,但我認爲這是一個_good_功能,他們想要促進... – nnnnnn

+0

不得不猴子一點與我原來的代碼,但那知道了謝謝! – jthomasbailey

1

兩件事:

儘量不要在ID使用的號碼。一般來說,如果標識符以字母或下劃線開頭,那麼它最好。

<div><span class="chosenword" order="1">Word 1</span> - 
<span class="chosenword" order="550">Word 550</span> - 
<span class="chosenword" order="57">Word 57</span> 
</div> - 
<div id="chosenwords"></div>​ 

試排數組,然後要通過他們每個人你設置後,他們的訂單

$('.chosenword').each(function(){ 
    var position = $(this).position(); 
    var order = ((position.left) * (position.top)); 
    $(this).attr('order', order); 
}); 

$('.chosenword').sort(sortByOrderAttr).each(function() { 
    var chosenword = $(this).html() + " - "; 
    $('#chosenwords').append(chosenword); 
}); 

function sortByOrderAttr(a, b) { 
    var idA = parseInt($(a).attr('order')); 
    var idB = parseInt($(b).attr('order')); 
    if (idA < idB) { 
     return -1; 
    } else { 
     return 1 
    } 
}​ 
+0

_「一般而言,如果標識符以字母或下劃線開頭,那麼它最好」_ - 爲什麼? html5規範允許使用數字,所有現代瀏覽器都支持它(不是嗎?)... – nnnnnn

+0

想象一下您可能想要將您的dom抽象成js對象以保存在數據庫或其他便攜式目的中的場景。這將會容易得多,因爲數字不允許成爲js vars。對於你正在排序的數據來說,它在語義上也是不正確的,因爲它是元素的「id」,你應該給數據添加標籤,以便在上下文之外有一定的意義。 –

+0

我無法想象想要一個變量名稱是一個元素的ID。一個變量_value,_也許,但不是一個變量_name._如果我將DOM抽象爲一個JS對象,那麼這個id很可能最終會作爲一個屬性值,或者最終可能以屬性名稱結束,其中任何一個用數字就沒問題了......(我確實同意''data-sort-order =「...」對於OP的做法會更好,但這是另一個問題。) – nnnnnn

相關問題