我想在键盘上按 ESC 键时从我的托管 Bean 执行一个方法。我已经阅读了其他一些帖子,但没有一个正在处理我的应用程序。也许我没有将脚本放在页面中的正确位置。我把它放在dhe af:document(它是一个ADF应用程序)上面,也在af:document中。这是JS代码:
<af:resource type="javascript">
$(document).keyup(function (e) {
if (e.which == 27) {
document.getElementById('cb3').click();
}
});
</af:resource>
"cb3"是我页面上一个按钮的 ID,它从我的 Bean 调用该方法。我不知道直接调用该方法的另一种方法。知道吗?
你应该有这样的东西
<af:document title="Press ESC to do some action" id="d1">
<f:facet name="metaContainer">
<af:resource type="javascript">
function onKeyPress(evt){
var _keyCode = evt.getKeyCode();
if (_keyCode == AdfKeyStroke.ESC_KEY ){
var button = AdfPage.PAGE.findComponentByAbsoluteId('cb1');
AdfActionEvent.queue(button,true);
evt.cancel();
}
}
</af:resource>
</f:facet>
<af:commandButton text="Execute when ESC key is pressed" clientComponent="true" id="cb1" actionListener="#{someScope.someFunction}" />
<af:clientListener method="onKeyPress" type="keyPress"/>
</af:document>
这将为文档创建一个客户端侦听器,该侦听器应在任何按键上执行,并侦听 ESC 键,如果发现它执行按钮执行的任何内容!
我感谢@Gawish的回复,因为它帮助我找到了解决方案。我无法使用该解决方案,因为在 ADF 11g 的 clientListener 中没有类型:"按键"。但是我确实喜欢这个,而且效果很好:
window.onkeyup = function (e) {
if (e.keyCode == 27) {
var button = AdfPage.PAGE.findComponentByAbsoluteId('cb3');
AdfActionEvent.queue(button, true);
e.cancel();
}
}
注意,最后的 e.cancel() 是强制性的!
还有另一种解决方案:添加<af:clientListener method="handleESCaction" type="popupCanceled"/>
在 ADF 组件中,但请确保应在组件中添加客户端组件=true。