Javascript 如何以编程方式打开Dojo djFilteringSelect下拉列表

Javascript 如何以编程方式打开Dojo djFilteringSelect下拉列表,javascript,dojo,xpages,Javascript,Dojo,Xpages,好的,这应该是可行的——而且非常简单,如果你知道如何获得djFilteringSelect对象的句柄的话 用例:我已经接管了一个扩展现有XPage的请求,该XPage不仅具有在用户单击djFilteringSelect输入字段右侧的小箭头时下拉值列表的功能,而且还具有在用户仅单击该字段时下拉值列表的功能。此XPage的大多数初始条目都是在制造现场完成的(使用触摸屏-无鼠标/键盘)。后续处理由用户使用“普通”计算机完成 所以我试着“捕捉”点击、鼠标下移或鼠标移动事件。我可以做到这一点——但我无法获

好的,这应该是可行的——而且非常简单,如果你知道如何获得djFilteringSelect对象的句柄的话

用例:我已经接管了一个扩展现有XPage的请求,该XPage不仅具有在用户单击djFilteringSelect输入字段右侧的小箭头时下拉值列表的功能,而且还具有在用户仅单击该字段时下拉值列表的功能。此XPage的大多数初始条目都是在制造现场完成的(使用触摸屏-无鼠标/键盘)。后续处理由用户使用“普通”计算机完成

所以我试着“捕捉”点击、鼠标下移或鼠标移动事件。我可以做到这一点——但我无法获得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><![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如何从输入标记解释click事件并在整个dijit中使用它,但我尝试添加一个事件处理程序,就像我希望用户在单击相应字段时强制触发xe:namePicker时使用的事件处理程序一样

我在xe中添加了以下内容:djFilteringSelect,它似乎工作正常;反正我也希望如此

。。。。
[更新] 正如我们所注意到的(在对这个答案的评论中),这是在弹出窗口已经被触发之后起作用的,但不是第一次。解决方案非常简单,使用toggleDropDown()函数代替openDropDown()。看起来很可靠,我确认它在新的页面加载后正常工作,正如预期的那样。与open函数相反,toggle函数似乎会触发创建组成值列表的DOM元素。 [/更新]


您的触摸屏用户是否可以选择使用不同类型的控件?我相信你会找到一款完全符合你和你的用户期望的产品。。。。是的,可能是。但并不理想,因为它们“看起来”像一台普通的计算机。我不知道如何确定他们是否使用触摸屏,但也值得尝试遵循这一路线。谢谢你有没有尝试过9.0.1的deviceBean功能?也许这有助于区分您的设备。此外,对于某些移动控制事件,如“xe:singlePageApp”或“xe:appPage”,您手头还有其他有用的事件处理程序。幸运的是,这些电脑都是普通电脑——只有触摸屏和“软键盘”。所以不是真正的SPA(单页应用)候选。实际上,我们只需要几个字段就可以更容易地用手指“点击”——而不是为一部分用户重新设计页面;-)谢谢你的建议,埃里克。很抱歉,我以前没有时间在客户的环境中进行测试。然而,它似乎不起作用-这可能是由于其他原因。。但是我得到了一个客户端JS错误:TypeError:无法读取null-。。。我已经检查了我得到的id(变量'el')实际上不是空的。这是Dojo代码中更深层次的东西……奇怪的是,这已经存在了大约一个月了,我回去检查了我的XPage。我在中尝试了这一点,发现它有效,只是在我第一次通过用户交互触发下拉菜单之后;在此之前,它会抛出类型错误。是的,这是正确的-这里的经验相同。。。。太近了!最后一点怎么解决呢?@JohnDalsgaard用el.toggleDropDown()代替el.openDropDown()。我更新了我的答案。答对了!似乎有效。将用“真正的”触摸屏对其进行测试。非常感谢你!!!