我想我做到了! :)
重點是防止option
標記mousedown
事件上的任何其他傳播,並手動管理select
框的聚焦。
見jsFiddle
我試圖使它明確的,因爲我可以:
$('option')
.on('mousedown', function(e){
// Prevent any other propagations
e.stopImmediatePropagation();
// Focus on the select DOM element
// but saving the scrollTop of each parent before
$(this)
.parents()
.filter(function(){
// filter only those which have a scroll visible
return $(this)[0].scrollHeight > $(this)[0].clientHeight;
})
.each(function(_,elt){
// and for each, save the scroll value in data set
$(elt).data('saveScroll', $(elt).scrollTop());
})
// Then trigger the focus option of the select DOM element
// And finally the custom 'scrollback' event
$(this).parent('select')
.trigger('focus')
.trigger('scrollback');
});
$('select')
// This customized event is for getting back the value of the scroll of all parents
// only if this value exists
.on('scrollback'
, function(e){
$(this)
.parents()
.filter(function(){
// filter only those which have this data in data-set
return 0 === $(this).data('saveScroll') || ~~$(this).data('saveScroll');
})
.each(function(_,elt){
// and for each, putting back the right scroll value
$(elt).scrollTop($(elt).data('saveScroll'));
$(elt).removeData('saveScroll');
})
});
這可能不是完美的,因爲它是一個黑客。
至少它甚至與multiple
-一起工作。它是跨瀏覽器兼容的。
你可以應用overflow:scroll;當鼠標懸停在元素上時,否則溢出:隱藏; – Mazzu
它溢出並不重要:hiddeon或溢出:滾動。兩個值都有兩個小提琴。但結果是一樣的。 –
我不確定你將哪些行爲歸類爲錯誤。父元素太小而不能包含整個'select'元素。如果Chrome沒有滾動父元素,則只有一半選項可見。你想阻止Chrome嘗試顯示整個'select'元素? –