在“多选”中对选项进行排序时,滚动条不会移动
Scroll bar does not move when sorting options in MultiSelect
我有一个多选框,右边有两个按钮,它们在列表中上下排序一个选项。这很好,但如果我将选项向上或向下移动到多选的顶部或底部边界,滚动条将不会生效并相应移动。有什么建议吗?
JavaScript:
$(document).ready(function() {
$("#mup")[0].attachEvent("onclick", moveUpItem);
$("#mdown")[0].attachEvent("onclick", moveDownItem);
});
function moveUpItem() {
$('#list option:selected').each(function() {
$(this).insertBefore($(this).prev());
});
}
function moveDownItem() {
$('#list option:selected').each(function() {
$(this).insertAfter($(this).next());
});
}
//Holding down the Up/Down buttons
$(document).ready(function() {
var timer;
$("#mup, #mdown").on('mousedown', function() {
if (this.id === 'mup') {
timer = setInterval(moveUpItem, 250);
} else {
timer = setInterval(moveDownItem, 250);
}
}).on('mouseup', function() {
clearInterval(timer);
});
});
$(document).ready(function() {
$("#submit").click(function() {
$("#list").each(function() {
$("#list option").attr("selected","selected");
});
$("#detColumnSortorder").submit;
});
});
HTML:
<table>
<tr>
<td align="center">
<select id="list" name="fieldNames" size="15" multiple="multiple" style="width: 250px;">
<c:forEach var="field" items="${detFields}">
<option value="${field.fieldName}">${field.displayName}</option>
</c:forEach>
</select>
</td>
<td>
<button id="mup">
<img src="../images/button_up.gif" alt="Hold to move up faster."/>
</button>
</td>
<td>
<button id="mdown">
<img src="../images/button_down.gif" alt="Hold to move down faster."/>
</button>
</td>
</tr>
<tr>
<td style="text-align: center;">
<input name="action" id="submit" type="submit" value="Submit"/>
<input name="action" type="submit" value="Cancel"/>
</td>
</tr>
</table>
哇,这很有趣。Chrome/WebKit在选择中处理选项移动的方式似乎存在一些错误。我不完全确定当前的行为是什么。有时它会移动,有时它不会。
所以,我想,简单。。。我只需要编写一个快速的解决方法。事实证明,这并不那么容易。WebKit不提供对某些信息的javascript访问,例如选项高度等。
所以,经过几次变通后,我有了一个似乎有效的破解方法:
http://jsfiddle.net/jtbowden/7NEqk/
照它的价值来对待。基本上,代码在选择框的可见窗口中跟踪所选项目。如果顶部在可见窗口上方,则向上移动等
注意事项:
- 向下移动
.get().reverse()
时,您需要反向迭代选定的选项,否则,如果您有相邻的选定项目,您只需让它们交换位置,而不是向下移动。(1
在2
下方移动,然后2
在1
下方移动) - 如果浏览器没有返回选项元素的高度,那么我假设高度为
17
。这是我的最佳猜测,但你可以调整它。此外,这意味着你的选择不能有不同的高度。无论如何,我认为这在WebKit中是不可能的 - 在移动所选项目之前,我会检查与之交换的项目是否已选中。如果是,我不会交换。这可以防止当我们到达选择的底部或顶部时,选择进行交换,在那里没有任何可交换的内容。这与我在注释#1中所说的类似,但情况略有不同
- 我假设所有的选择都符合选择框架。如果它们不起作用,它仍然有效,但根据你想要的,它可能会有不同的处理方式
- 我将
return false;
放入mousedown
处理程序中。这与event.preventDefault()
等相同。它可以防止按钮从选择中窃取焦点,在Chrome中,这会使所选选项变为灰色,而不是正常的蓝色
当然,在说了所有这些之后,可能有一个更好的方法来管理这个选择系统。。。但是,我认为这是一个挑战,让它以我认为应该的方式工作。
附言:谁知道IE……我没有检查,我害怕。
相关文章:
- CSS-若窗口太小,滚动条会出现在“表格”单元格上
- 禁用(而不是隐藏)浏览器滚动条
- 在firefox和chrome中的左侧显示iframe滚动条
- jquery:将动画绑定到滚动条位置的更好方法
- 在窗口中添加滚动条
- 如何查明鼠标按下事件是否发生在滚动条上或元素中的其他任何位置
- 使用没有插件的javascript自定义滚动条
- CodeMirror.禁用垂直滚动条
- 在滚动时,在隐藏滚动条和隐藏溢出的同时触发事件
- 可以'无法使滚动条正常工作
- 强制滚动条覆盖页面内容
- 如何隐藏滚动条,但希望它继续工作
- 滚动所有嵌套的滚动条,使HTML元素进入视图
- 使用浏览器滚动条而不是iframe滚动条
- 滚动条在关闭引导对话框后消失
- javascript/获取滚动条位置的回调
- 可调整滚动条大小
- 去掉滚动条
- 在“多选”中对选项进行排序时,滚动条不会移动
- 可排序分区内的滚动条