好的,这应该是可行的,而且非常简单,只要知道如何获取djFilteringSelect对象的句柄即可。
用例:我已经接受了一个扩展现有XPage的请求,该请求具有以下功能:不仅在用户单击djFilteringSelect输入字段右侧的小箭头时,而且在用户单击时,都可以下拉值列表场。此XPage的大多数初始输入都在制造现场完成(使用触摸屏-无需鼠标/键盘)。用户使用“普通”计算机进行后续处理。
因此,我尝试“捕获”“单击”,“ mousedown”或“ mouseup”事件。我可以做到这一点-但我无法掌握我知道有方法“ openDropDown()”的filteringselect,该方法可能会执行我需要做的...。我还尝试了模拟按键事件“ 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><![CDATA[var ct = thisEvent.currentTarget;
var se = thisEvent.srcElement;
var te = thisEvent.toElement;
setTimeout(function(ct,se,te){
var keyboardEvent = document.createEvent("KeyboardEvent");
var initMethod = typeof keyboardEvent.initKeyboardEvent !== 'undefined' ? "initKeyboardEvent" : "initKeyEvent";
keyboardEvent[initMethod](
"keyup", // event type : keydown, keyup, keypress
true, // bubbles
true, // cancelable
Window, // viewArg: should be window
false, // ctrlKeyArg
false, // altKeyArg
false, // shiftKeyArg
false, // metaKeyArg
40, // keyCodeArg : unsigned long the virtual key code, else 0
0 // charCodeArgs : unsigned long the Unicode character associated with the depressed key, else 0
);
/// 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>
因此,任何想法都会受到赞赏-尤其是制造站点中的用户:-)
最佳答案
...不仅可以在用户单击djFilteringSelect输入字段右侧的小箭头时(也可以在用户单击该字段时)下拉值列表。
如果我没看错您的问题,则只想在用户单击该字段时调出下拉菜单。这与您的其他代码不完全匹配,我也不知道dojo如何解释input标签中的click事件并在整个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>
[更新]
正如我们注意到的那样(在此答案的注释中),此操作在触发弹出窗口后才起作用,但不是第一次。解决方案非常简单,使用toggleDropDown()函数代替openDropDown()。看起来很稳定,我确认它在按预期重新加载页面后可以工作。与打开功能相反,切换功能似乎将触发包含值列表的DOM元素的创建。
[/更新]