滚动包含FilteringSelect或ComboBox的页面时,Dojo下拉分离

时间:2011-09-26 19:48:38

标签: combobox dojo scroll

由于ComboBox和FilteringSelect使用'dijitPopup',其DOM元素在结束体标记之前插入(可能有助于确保它出现在z-index-wise之上),这意味着如果ComboBox包含在一个独立于窗口本身滚动的元素,用户打开下拉列表,然后使用滚轮滚动窗口(或任何包含元素),菜单部分不随控件本身移动。

是否有一种直接的方法可以确保视图的菜单部分相对于控件本身保持正确定位,而不是简单地假设其起始位置正常?

编辑:似乎是一个已知问题(http://bugs.dojotoolkit.org/ticket/5777)。我明白为什么他们把dijit弹出窗口放在关闭z-index堆栈和溢出剪切问题的关闭body标签之前,但是看起来这可能不是理想的方法来处理这里讨论的bug以及类似的事情:

  

您可以将Dijit主题限制为只有一小部分页面;您   通过将主题的CSS类应用于块级别来完成此操作   元素,例如div。但是,请记住任何基于弹出窗口的   小部件(或使用弹出窗口的小部件,例如dijit.form.ComboButton,   dijit.form.DropDownButton和dijit.form.Select)创建并放置   弹出窗口的DOM结构作为正文的直接子   element - 表示您的主题不会应用于弹出窗口。

〜来自http://dojotoolkit.org/documentation/tutorials/1.6/themes_buttons_textboxes/

2 个答案:

答案 0 :(得分:1)

不确定这是否是最好的解决方案,但这就是我想出的:

由于可以通过编程方式添加/删除窗口小部件,并且为了避免将解决方案与我们在所有情况下无法始终依赖的某些特定周围标记耦合,我所做的是挂钩ComboBox的_showResultList和_hideResultList方法,当弹出窗口打开时,遍历DOM直到我们到达<html>标签,在每个祖先上添加onscroll监听器。

onscroll事件的处理程序只是:

var myPos = dojo.position(this.domNode, true);
this._popupWidget.domNode.parentNode.style.top = '' + (myPos.y + myPos.h) + "px";

其中this是有问题的小部件。我使用dojo.hitch将处理程序范围限定到窗口小部件。在close方法中,我删除了监听器。我必须在它出现之前清理一下代码,但是当它最终确定时,我会将它添加到这个答案中。

注意:我只在这里显示更新y位置。部分清理是添加x位置更新,以防有人水平滚动。

答案 1 :(得分:0)

虽然它很老我只是遇到了同样的问题而且看起来像是一个Dojo问题而且修复程序可以在这里找到https://bugs.dojotoolkit.org/changeset/30911/legacy