测试和工作!
jquery.jscrollpane.js
由于以下原因,我发现插件存在错误:
第一个原因:
执行以下操作时...
$(function(){
$('.pretty_sb').selectbox();
$('.sbOptions').jScrollPane();
});
第一行将(..).selectbox()
自定义 htmlselect
并在其中创建以下内容DOM
:
<ul id="sbOptions_82218379" class="sbOptions" style="display: none; (..)>
然后第二行将在脚本执行过程中在标签(..).jScrollPane()
内创建以下子元素:ul
<div class="jspContainer" style="width: 155px; height: 454px;">
还有里面的以下子元素jspContainer
:
<div class="jspPane" style="padding: 5px 0px 0px; top: 0px; left: 0px; width: 155px;">(..)</div>
此时jspPane
element 包含的 html 元素select
一目了然。
最后尝试获取元素的scrollHeight
(友好的称为height
)以jspPane
创建滚动条。似乎一切都会奏效,但不是。
怎么了?
对插件unminified
版本进行一些调试(从官方网站获得:http: //jscrollpane.kelvinluck.com/script/jquery.jscrollpane.js)jquery.jscrollpane.js
您将在 上看到,line 177
代码正试图通过使用如下简单的方法来获取scrollHeight
的:pane
javascript
contentHeight = pane[0].scrollHeight;
这将在将来用于创建,scrollbar
但是当试图获取父元素的这个CSS
属性时,display: none
这将导致0
.
因此,line 182
脚本将确定该区域不可滚动(isScrollableV = false)
,因此不会出现滚动条。
如果你不想相信。尝试scrollHeight
自己获取(我做了一个简短的例子,只是或comment
旁边孩子uncomment
的display: none;
财产:http : //jsfiddle.net/oscarj24/3Ycp7/)。div
CSS
第二个原因:
这真的很有趣,但检查line 112
插件jquery.jscrollpane.js
,你会看到以下评论:
// TODO: Deal with where width/ height is 0 as it probably means the element is hidden and we should
// come back to it later and check once it is unhidden...
似乎作者没有处理元素是否hidden
存在,因此它将返回or0
使该区域不可滚动(作为第一个原因描述)。height
width
但是,为什么这个代码片段有效?
$('.pretty_sb').selectbox({
onOpen: function (inst) {
$('.sbOptions').jScrollPane();
}
});
因为当打开 时combobox
,内容hidden
不再(onOpen
监听器使伎俩,您可以检查DOM
并查看display: none
fromul
标记已消失)
并且允许jquery.jscrollpane.js
插件获得它想要的内容并进一步向元素添加另一个CSS
类(jspScrollable
),ul
这意味着该区域是可滚动的,并且在新的滚动条上一切正常。
解决方案:
我真的不推荐这个解决方案,但也许你可以自己编辑插件的unminified
版本 。jquery.jscrollpane.js
但是你将对侵犯作者许可和其他人负责(只是说请不要对我粗鲁)。这样,您将调用 just $(selector).jScrollPane();
,仅此而已。
按照作者comment
所说的去做并评估元素是否hidden
存在,但这对于您的情况来说真的很难完成,因为如果“关闭”并且需要一个侦听器,则ul
标记将是(类似于您最后一种实现此功能的方法) .hidden
combobox
event
我认为符合您要求的解决方案是继续使用您的最后一种方法(使用onOpen
带有一些“更正”的侦听器的方法,就像我稍后/下面所说的那样)。但我一点也不喜欢它,因为你每完成一次就(..).jScrollPane()
一次又一次地重复这个动作。click
另外,我认为没有其他方法可以解决这个问题。
现场演示:http: //jsfiddle.net/oscarj24/8VX4d/33/
jQuery代码:
/* Define a default global variable with some value for scrollable area height. */
var DEFAULT_SBHEIGHT = 150;
$(function(){
$('.cat_list').jScrollPane();
$('.pretty_sb').selectbox({
onOpen: function (inst) {
$('.sbOptions')
.height(DEFAULT_SBHEIGHT)
.jScrollPane();
}
});
});
只是要知道,有很多可能的“脚本执行”情况,但我只是试图深入分析这种情况。
希望这可以帮助。