2013-08-01 43 views
1

我使用下面的jQuery在表單中選擇元素進行排序:jQuery在頁面刷新時選擇排序更改顯示選項。發生了什麼?

$('select.select-sortable').each(function() { 
    var options = $(this).children(); 
    var arr = options.map(function(_, o) { return { t: $(o).text(), v: o.value }; }).get(); 
    arr.sort(function(o1, o2) { return o1.t > o2.t ? 1 : o1.t < o2.t ? -1 : 0; }); 
    options.each(function(i, o) { 
     o.value = arr[i].v; 
     $(o).text(arr[i].t); 
    }); 
}); 

排序的作品,但在每一個頁面刷新顯示值的變化。無論有多少選項存在,它都會按照第1個選項 - >第3個選項 - >第2個選項 - >第1個選項的順序進行更改。

我已將$(this).children(":first").attr("selected", true);添加到循環中,它將選項鎖定到第一個選項,但我仍不明白dsiplay爲什麼會發生更改,以及爲什麼按此順序。有沒有人有任何想法?

回答

0

這是因爲瀏覽器緩存而發生的。它存儲有關在按下重新加載之前選擇哪個選項(使用什麼值)的信息。如果您隨時更改選項值,則瀏覽器將在下次重新加載時反映這些更改,但腳本會立即再次修改這些值。它與你追趕:)

Btw。你不必這樣做:$(this).children(":first").attr("selected", true);簡單的options[0].selected = true;放在options.each之後就足夠了。

1

問題主要是因爲選項的selected屬性未被捕獲。

$('select').each(function() { 
    var options = $(this).children(); 
    var arr = options.map(function(_, o) { 
     return { t: $(o).text(), v: o.value, s: $(o).attr('selected') }; 
    }).get(); 
    arr.sort(function(o1, o2) { return o1.t > o2.t ? 1 : o1.t < o2.t ? -1 : 0; }); 
    options.each(function(i, o) { 
     o.value = arr[i].v; 
     $(o).text(arr[i].t); 
     if(arr[i].s!==undefined){ 
     $(o).attr('selected','selected'); 
     } 
    }); 
}); 
+0

你的if語句似乎有問題。當我包含它時,它會停止分揀機的運作。 – evanjdooner

+0

不知道爲什麼它不會工作,但我已經改變了條件來檢查未定義的值。 http://jsbin.com/opuzot/1/edit – vsr

+0

我認爲問題在於你的函數在頁面加載時保留了選擇,但是它沒有設置初始選擇的值。 要澄清,選項的值和文本字段略有不同,以便具有按字母順序排列的文本的選項不是初始默認選擇,具有按字母順序排列的值的選項是。這是應用「selected」屬性的值,因此即使列表按文字按字母順序排序,它也是第一個「已選」值。 – evanjdooner

0

試試下面的代碼,它排序,並選擇價值,你會通過在.EQ()

var arr = [], 
$select = $("#ddsort"), 
$options = $select.children(); 

$options.each(function(index, obj){ 
    arr.push($(this).val()); 
}); 

Array.sort(arr); 
$select.empty(); 

$.each(arr,function(index, obj){ 
    $select.append("<option value="+obj+">"+obj+"</option>"); 
}); 

$select.children().eq(2).attr("selected","selected"); 

看到這裏的工作例如:http://jsfiddle.net/tFDNx/3/

我希望它能幫助。

相關問題