解决方案
$(document).ready(function () {
var selectTop;
var mustChangeScrollTop = false;
$('.multi-select').on('scroll',function (e) {
if (mustChangeScrollTop){
$(this).scrollTop(selectTop);
mustChangeScrollTop = false;
}
return true;
});
$('.multi-select option').on('mousedown',function (e) {
e.preventDefault();
selectTop = $(this).parent().scrollTop();
$(this).prop('selected', $(this).prop('selected') ? false : true);
mustChangeScrollTop = true;
return false;
});
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<select title="Title" class="multi-select" style="width: 143px; height: 250px; overflow: scroll;" multiple="multiple">
<option value="1">1 </option>
<option value="2">2 </option>
<option value="3">3</option>
<option value="4">4</option>
<option value="5">5</option>
<option value="6">6</option>
<option value="7">7</option>
<option value="8">8</option>
<option value="9">9</option>
<option value="10">10</option>
<option value="11">11</option>
<option value="12">12</option>
<option value="13">13</option>
<option value="14">14</option>
<option value="15">15</option>
<option value="16">16</option>
<option value="17">17</option>
<option value="18">18</option>
<option value="19">19</option>
<option value="20">20</option>
<option value="21">21</option>
<option value="22">22</option>
<option value="23">23</option>
<option value="24">24</option>
<option value="25">25</option>
<option value="26">26</option>
<option value="27">27</option>
<option value="28">28</option>
<option value="31">31</option></select>
解释
我注意到在Chrome中,mousedown事件返回后有一个不必要的滚动条。因此,解决方案/解决方法是添加onscroll事件并重置(
$(this).scrollTop(selectTop);
)选定区域的顶部(
selectTop
)更改所选选项之前的状态(
selectTop = $(this).parent().scrollTop();
mustChangeScrollTop
变量是必需的,因为onscroll事件不仅在Chrome中出现不必要的滚动时调用,而且在用户手动滚动时调用。所以当不必要的滚动即将发生时(也就是当用户选择一个选项时),我们设置
对于true,然后(当不必要的滚动出现时),我们通过检查它是否为true来理解它,然后将其设置回false,这样就不会影响用户的滚动。