0

我正在创建一个“Itunes LP”格式的触摸应用程序,它在 Itunes 中使用 html、css 和 javascript 来创建一个“数字 LP”。该应用程序将有几个 LP 可以通过触摸屏进行探索。在全屏模式下(在 Itunes 和 LP 中),您可以按“esc 键”退出 LP 并进入“coverflow 视图”,您可以在其中选择另一个 LP 进行探索。我将没有键盘或鼠标,因此我需要创建一个按钮/链接,当用户单击此链接时,它会做一件事,即模拟按下的 ESC 键。

所以我的问题是;是否可以在链接中使用 JavaScript 模拟键盘快捷键?我的链接将是“主页”,通过单击此链接,浏览器的行为就像按下了 ESC 键一样。

任何关于此的提示将是最有帮助的。谢谢!

大卫

添加 30/6;

(Itunes LP 的 TuneKit.js 的一部分)

    /* ==================== 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 键!

4

1 回答 1

0

此答案假定 iTunes LP 应用程序使用 JS 函数退出全屏。

尽管您可能可以,但您不必模拟该事件。您正在使用的 Key 事件由事件侦听器或事件处理程序绑定到一个函数(在本例中,是一个退出全屏模式的函数)。您应该能够创建一个按钮并将其(通过类似的事件侦听器或事件处理程序)绑定到相同的函数。

不能直接绑定,因为按键事件会传递关于哪个键被按下的信息,而鼠标事件不会,所以需要通过代理发送。您的代码可能看起来像这样。在这种情况下,接收 iTunes LP 库中的 Key 事件的代码将被称为 iTunesLPKeyPressEvent。我不知道它实际上叫什么。

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

您可能需要稍微按摩一下,但基本想法应该有效。

[编辑] 根据您的更新,我会说这 TKSpatialNavigationManager.prototype._managedController是您需要使用的对象,并且很可能TKSpatialNavigationManager.prototype._managedController.keyWasPressed(key)是捕获转义键的代码。查看addEventListener("keypress",SOME_METHOD,true)(or keyupor keydown) 的代码,它将是SOME_METHOD处理事件的代码。这就是你想要劫持的方法。希望它将在您可以轻松访问的范围内。

于 2010-06-29T10:07:45.587 回答