Можно ли смоделировать нажатие сочетания клавиш, нажав на ссылку с помощью JavaScript? - PullRequest
0 голосов
/ 29 июня 2010

Я создаю сенсорное приложение в формате «Itunes LP», которое использует html, css и javascript в Itunes для создания «цифрового LP».Приложение будет иметь несколько пластинок для сенсорного экрана.В полноэкранном режиме (в Itunes и LP) вы можете нажать «клавишу esc», чтобы выйти из LP и войти в «представление прикрытия», где вы можете выбрать другой LP для исследования.У меня не будет клавиатуры или мыши, поэтому мне нужно создать кнопку / ссылку, которая будет выполнять одно действие, когда пользователь нажимает на эту ссылку, - симулировать нажатие клавиши ESC.

Итак, мой вопрос:Можно ли имитировать нажатие сочетания клавиш с помощью JavaScript в ссылке?Моя ссылка будет «Домой», и, нажав на эту ссылку, браузер будет вести себя, как нажата клавиша ESC.

Любые советы по этому вопросу будут наиболее полезными.Спасибо!

Дэвид

ДОБАВЛЕНО 30/6;

(часть TuneKit.js для Itunes LP)

    /* ==================== Keyboard Navigation ==================== */

TKSpatialNavigationManager.prototype.handleKeydown = function (event) {

  var key = event.keyCode;

  // check if our controller knows what it's doing and let it take over in case it does
  if (this._managedController.wantsToHandleKey(key)) {
    // prevent default actions
    event.stopPropagation();
    event.preventDefault();
    // have the controller do what it think is best in this case
    this._managedController.keyWasPressed(key);
    return;
  }

  // reset the sound
  TKSpatialNavigationManager.soundToPlay = null;

  // check we know about this key, otherwise, do nothing
  if (TKSpatialNavigationManagerKnownKeys.indexOf(key) == -1) {
    return;
  }

  var navigation = TKNavigationController.sharedNavigation;
  // first, check if we're hitting the back button on the home screen, in which case
  // we don't want to do anything and let the User Agent do what's right to exit
  if (event.keyCode == KEYBOARD_BACKSPACE && navigation.topController === homeController) {
    return;
  }

  // before we go any further, prevent the default action from happening
  event.stopPropagation();
  event.preventDefault();

  // check if we're busy doing other things
  if (TKSpatialNavigationManager.busyControllers > 0) {
    return;
  }
  // see if we pressed esc. so we can pop to previous controller
  if (event.keyCode == KEYBOARD_BACKSPACE) {
    var top_controller = navigation.topController;
    if (top_controller !== homeController) {
      // at any rate, play the exit sound
      TKUtils.playSound(SOUND_EXIT);
      // see if the top controller has a custom place to navigate to with the back button
      if (top_controller.backButton instanceof Element && top_controller.backButton._navigationData !== undefined) {
        navigation.pushController(TKController.resolveController(top_controller.backButton._navigationData.controller));
      }
      // otherwise, just pop the controller
      else {
        navigation.popController();
      }
    }
  }

**** Мой сценарий будет выглядеть следующим образом: ****

    var albumHelper = {};

albumHelper.playAlbum = function() {
  var playlist = bookletController.buildPlaylist(appData.songs);
  playlist.play();
};

var event = {};

event.keyCode = function() {
  var escapeKeyProxy = TKSpatialNavigationManager.prototype.handleKeydown({'keyCode':27});
    document.getElementById('btnExitFullScreen').onclick = escapeKeyProxy;
};

var homeController = new TKController({
  id: 'home',
  actions : [
    { selector: '.menu > .play', action: albumHelper.playAlbum },
    { selector: '.menu > .linernotes', action: event.keyCode }
  ],
  navigatesTo : [
    { selector: '.menu > .songs', controller: 'songs' },
    { selector: '.menu > .photos', controller: 'photos' },
    { selector: '.menu > .videos', controller: 'videos' },
    { selector: '.menu > .credits', controller: 'credits' }
  ],
  // make the PLAY button be default highlight
  highlightedElement : '.menu > .play'
});

Итак, мне нужно изображение .linernotes, при щелчке имитировать нажатие клавиши ESC!

1 Ответ

0 голосов
/ 29 июня 2010

В этом ответе предполагается, что есть функция JS, которую приложение iTunes LP использует для выхода из полноэкранного режима.

Хотя вы, вероятно, можете, вам не нужно имитировать событие. Событие Key, с которым вы работаете, связано либо с прослушивателем событий, либо с обработчиком событий с функцией (в данном случае, с функцией, которая выходит из полноэкранного режима). Вы должны иметь возможность создать кнопку и связать ее (с помощью аналогичного прослушивателя событий или обработчика событий) с той же функцией.

Вы не можете связать это напрямую, потому что события клавиш передают информацию о том, какая клавиша была нажата, а события мыши - нет, поэтому вам нужно отправить ее через прокси. Ваш код может выглядеть примерно так. В этом случае код, который принимает событие Key в библиотеке iTunes LP, будет называться iTunesLPKeyPressEvent. Я понятия не имею, как это на самом деле называется.

var escapeKeyProxy = function() {
    iTunesLPKeyPressEvent({'keyCode':27});
} 
document.getElementById('btnExitFullScreen').onclick = escapeKeyProxy;

Возможно, вам нужно немного помассировать, но основная идея должна сработать.

[EDIT] На основании вашего обновления я бы сказал, что TKSpatialNavigationManager.prototype._managedController - это объект, с которым вам нужно работать, и, скорее всего, TKSpatialNavigationManager.prototype._managedController.keyWasPressed(key) - это код, который захватывает управляющую клавишу. Посмотрите код для addEventListener("keypress",SOME_METHOD,true) (или keyup или keydown), и это будет SOME_METHOD, который обрабатывает событие. Это метод, который вы хотите угнать. Надеюсь, это будет в объеме, к которому вы легко сможете добраться.

...