2013-03-13 61 views
3

我有一個選擇元素具有多個屬性。我使用javascript在列表中上下移動項目。InsertAfter選擇與多項屬性不滾動項目到視圖

HTML:

<select id="sel" size="10" multiple> 
    <option>1</option> 
    <option>2</option> 
    ... 
    <option>14</option> 
</select> 
<span id="moveDown">Move Down</span> 

而下面的javascript:

$("#moveDown").button().click(function() { 
    var select = $("#sel"); 
    var selItem = $("#sel option:selected") 
    var next = selItem.last().next(); 
    selItem.insertAfter(next); 
}); 

我的問題是,在Chrome和IE,如果所選擇的項目被滾出視圖,選擇列表中不滾動以保持項目在視圖中。 Firefox始終保留最上面的選定項目。

如果我刪除多個屬性,然後一切都按預期工作,但我需要能夠選擇多個項目爲此列表的其他功能。

我的問題是,我如何滾動到選定的項目?我一直在使用位置試過,偏移和高度,但他們在選擇所有0鉻:

console.log(selItem.position().top); 
console.log(selItem.offset().top); 
console.log(selItem.height()); 

下面是一個說明問題的一個小提琴:http://jsfiddle.net/ywypB/4/

+0

有趣的問題,但它似乎是Chrome錯誤。它對於選項'offset()。top,height,outerHeight和clientHeight返回0。幾乎不可能計算,而不會拋出任何可怕的值。相關問題:http://stackoverflow.com/a/7205792/1331430但如果你不能獲得選項的偏移,scrollTop將無法正常工作。 – 2013-03-13 14:32:44

回答

1

很奇怪!好的一種方法是使用.scrollTop()

爲什麼不嘗試這樣的事情(我知道不理想,但一個可能的解決方案):

$("#moveDown").button().click(function() { 
    var select = $("#sel"); 
    var selItem = $("#sel option:selected"); 
    var next = selItem.last().next(); 
    var index = selItem.insertAfter(next).index() + 1; 
    if(index > $('#sel').attr('size')){ 
     $('#sel').scrollTop(17 * parseInt(index - $('#sel').attr('size'))); //17 is height of option 
    } 
}); 

DEMO: http://jsfiddle.net/dirtyd77/ywypB/16/

+0

我不是神奇數字的忠實粉絲,如果CSS改變字體大小,那就會崩潰。我一直在玩綁定到字體大小,但我不能完全正確地工作。此外,一旦物品超出其原始順序,索引仍然是原始值,因此當您移動物品時,它會開始跳躍很多。 – 2013-03-13 20:58:12

+0

我在這裏更改了我的jsfiddle:http://jsfiddle.net/dirtyd77/ywypB/23/,它應該修復字體大小問題。 *小心*:這是hacky: - / – Dom 2013-03-13 21:48:10

相關問題