Как вызвать метод управляемого компонента на кнопке ESC?

Я хочу выполнить метод из моего управляемого компонента, когда я нажимаю клавишу ESC на клавиатуре. Я прочитал некоторые другие сообщения, но ни один из них не работает над моим приложением. Возможно, я размещаю скрипт не в том месте на странице. Я поместил его над 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» — это идентификатор кнопки на моей странице, которая вызывает метод из моего компонента. Я не знаю другого способа вызвать метод напрямую. Есть идеи?


person Noah Martin    schedule 06.09.2013    source источник
comment
Спасибо за ответ. На самом деле ничего не происходит, да, теперь я это понимаю, но как я могу адаптировать JS, чтобы моя кнопка jsf нажималась? Или иначе, если есть способ вызвать метод управляемого компонента напрямую, это было бы здорово!   -  person Noah Martin    schedule 06.09.2013


Ответы (3)


У вас должно получиться что-то вроде этого

<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, и если он найдет, он выполнит все, что выполняет кнопка!

person Amr Gawish    schedule 07.09.2013
comment
Спасибо за ответ и извините за столь поздний ответ. В clientListener вы установили type=keyPress, но в ADF 11g такого типа нет, есть: onClick, dbClick, contextMenu, mouseOver и т.д. Что вы предлагаете? Спасибо еще раз - person Noah Martin; 09.09.2013

Я благодарю @Gawish за ответ, так как он помог мне найти решение. Я не мог использовать это решение, потому что в clientListener в ADF 11g нет type: "keyPress". Однако мне это понравилось, и это работает очень хорошо:

window.onkeyup = function (e) {
          if (e.keyCode == 27) {
              var button = AdfPage.PAGE.findComponentByAbsoluteId('cb3');
              AdfActionEvent.queue(button, true);
              e.cancel();
          }
      }

Обратите внимание, e.cancel() в конце обязателен!

person Noah Martin    schedule 09.09.2013
comment
Извините за это, есть один для inputText, моя ошибка. Рад, что вы нашли ответ, хотя :) - person Amr Gawish; 09.09.2013
comment
Абсолютно нет :) Еще раз спасибо, потому что ваш ответ помог мне. Я не помечал ваш как правильный только для других, у которых может быть такая же проблема. Желаю вам хорошо провести время! - person Noah Martin; 09.09.2013

Есть другое решение: добавить <af:clientListener method="handleESCaction" type="popupCanceled"/>

в вашем компоненте adf, но убедитесь, что clientComponent=true будет добавлен в компонент.

person Divy Kumar    schedule 07.09.2015