如何以编程方式打开 Dojo djFilteringSelect 下拉列表
How to programmatically open a Dojo djFilteringSelect drop down list
好的,这应该是可行的——而且非常简单,只要知道如何获取 djFilteringSelect 对象的句柄即可。
用例:我已经接管了扩展现有 XPage 的请求,该 XPage 具有下拉值列表的功能,不仅在用户单击 djFilteringSelect 输入字段右侧的小箭头时 - 而且在用户只需点击该字段。此 XPage 的大部分初始条目都是在制造站点完成的(使用触摸屏 - 没有 mouse/keyboard)。后续处理由用户使用 "normal" 台计算机完成。
所以我尝试 "catch" "click"、"mousedown" 或 "mouseup" 事件。我可以做到这一点 - 但我无法掌握我知道的 filteringselect 有一个方法 "openDropDown()" 可能会做我需要做的......我也试过模拟按键事件 "arrowdown"因为如果我这样做也会提供相同的体验......我什至试图延迟按键事件并添加一些上下文 - 但没有任何效果。
所以这是我当前非常简单的示例,但它不起作用:
<xe:djFilteringSelect id="Antal" defaultValue="1">
<xp:selectItems id="selectItems13">
<xp:this.value><![CDATA[${javascript:var values=[];var i=0;while(i<=20){values.push(''+i++)};return values;}]]></xp:this.value>
</xp:selectItems>
<xp:selectItem itemLabel="20+"></xp:selectItem>
<xp:eventHandler event="onKeyUp" submit="false">
<xe:this.script><![CDATA[console.log("keyUp=" + thisEvent.keyCode)]]></xe:this.script>
</xp:eventHandler>
<xp:eventHandler event="onMouseDown" submit="false">
<xe:this.script><;
/// Hmmmm... not working
keyboardEvent.currentTarget = ct;
keyboardEvent.srcElement = se;
keyboardEvent.toElement = te;
console.log('Fire arrow down key...');
document.dispatchEvent(keyboardEvent);
},200);
]]></xe:this.script>
</xp:eventHandler></xe:djFilteringSelect>
因此,任何想法都将不胜感激 - 特别是制造网站中的用户:-)
...to drop down the list of values not only if the user clicks the small arrow to the right of the djFilteringSelect input field - but also if the user just clicks on the field.
如果我没看错你的问题,你只是想在用户点击该字段时弹出下拉菜单。这与您的其他代码不完全匹配,我不知道 dojo 如何解释来自 input 标记的点击事件并在整个 dijit 中处理它,但我尝试添加一个事件处理程序,就像我希望用户在单击相应字段时强制触发 xe:namePicker 时使用的事件处理程序一样。
我将以下内容添加到您的 xe:djFilteringSelect 中,它似乎工作正常;无论如何,正如我所期待的那样。
....
<xp:eventHandler
event="onClick"
submit="false">
<xe:this.script><![CDATA[var el = dijit.byId("#{id:Antal}");
el.toggleDropDown();]]></xe:this.script>
</xp:eventHandler>
</xe:djFilteringSelect>
[更新]
正如我们注意到的(在对此答案的评论中),这在弹出 already 被触发后起作用,但不是第一次。解决方案非常简单,使用 toggleDropDown() 函数代替 openDropDown()。看起来非常可靠,我确认它在重新加载页面后可以正常工作,正如预期的那样。似乎 toggle 函数将触发构成值列表的 DOM 元素的创建,而不是 open 函数。
[/更新]
好的,这应该是可行的——而且非常简单,只要知道如何获取 djFilteringSelect 对象的句柄即可。
用例:我已经接管了扩展现有 XPage 的请求,该 XPage 具有下拉值列表的功能,不仅在用户单击 djFilteringSelect 输入字段右侧的小箭头时 - 而且在用户只需点击该字段。此 XPage 的大部分初始条目都是在制造站点完成的(使用触摸屏 - 没有 mouse/keyboard)。后续处理由用户使用 "normal" 台计算机完成。
所以我尝试 "catch" "click"、"mousedown" 或 "mouseup" 事件。我可以做到这一点 - 但我无法掌握我知道的 filteringselect 有一个方法 "openDropDown()" 可能会做我需要做的......我也试过模拟按键事件 "arrowdown"因为如果我这样做也会提供相同的体验......我什至试图延迟按键事件并添加一些上下文 - 但没有任何效果。
所以这是我当前非常简单的示例,但它不起作用:
<xe:djFilteringSelect id="Antal" defaultValue="1">
<xp:selectItems id="selectItems13">
<xp:this.value><![CDATA[${javascript:var values=[];var i=0;while(i<=20){values.push(''+i++)};return values;}]]></xp:this.value>
</xp:selectItems>
<xp:selectItem itemLabel="20+"></xp:selectItem>
<xp:eventHandler event="onKeyUp" submit="false">
<xe:this.script><![CDATA[console.log("keyUp=" + thisEvent.keyCode)]]></xe:this.script>
</xp:eventHandler>
<xp:eventHandler event="onMouseDown" submit="false">
<xe:this.script><;
/// Hmmmm... not working
keyboardEvent.currentTarget = ct;
keyboardEvent.srcElement = se;
keyboardEvent.toElement = te;
console.log('Fire arrow down key...');
document.dispatchEvent(keyboardEvent);
},200);
]]></xe:this.script>
</xp:eventHandler></xe:djFilteringSelect>
因此,任何想法都将不胜感激 - 特别是制造网站中的用户:-)
...to drop down the list of values not only if the user clicks the small arrow to the right of the djFilteringSelect input field - but also if the user just clicks on the field.
如果我没看错你的问题,你只是想在用户点击该字段时弹出下拉菜单。这与您的其他代码不完全匹配,我不知道 dojo 如何解释来自 input 标记的点击事件并在整个 dijit 中处理它,但我尝试添加一个事件处理程序,就像我希望用户在单击相应字段时强制触发 xe:namePicker 时使用的事件处理程序一样。
我将以下内容添加到您的 xe:djFilteringSelect 中,它似乎工作正常;无论如何,正如我所期待的那样。
....
<xp:eventHandler
event="onClick"
submit="false">
<xe:this.script><![CDATA[var el = dijit.byId("#{id:Antal}");
el.toggleDropDown();]]></xe:this.script>
</xp:eventHandler>
</xe:djFilteringSelect>
[更新] 正如我们注意到的(在对此答案的评论中),这在弹出 already 被触发后起作用,但不是第一次。解决方案非常简单,使用 toggleDropDown() 函数代替 openDropDown()。看起来非常可靠,我确认它在重新加载页面后可以正常工作,正如预期的那样。似乎 toggle 函数将触发构成值列表的 DOM 元素的创建,而不是 open 函数。 [/更新]